From e56e1281cefa5fb809fa69b01e51a2ebcfe86fdd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 18 Mar 2026 20:58:41 +0000 Subject: [PATCH] Sync from Heretek-AI/ProxmoxVE - 2026-03-18 --- frontend/public/json/unsolth-studio.json | 2 +- standalone/ct/swarmui.sh | 2 +- .../frontend/public/json/github-versions.json | 6 +- .../frontend/public/json/unsolth-studio.json | 2 +- standalone/standalone/ct/swarmui.sh | 2 +- standalone/standalone/misc/build.func | 1 + .../standalone/install/lemonade-install.sh | 4 + .../standalone/install/llamacpp-install.sh | 23 +- .../standalone/install/localai-install.sh | 4 + .../standalone/install/swarmui-install.sh | 4 + .../standalone/ct/headers/unsolth-studio | 6 + .../standalone/ct/unsolth-studio.sh | 62 + .../frontend/public/json/unsolth-studio.json | 50 + .../install/unsolth-studio-install.sh | 159 + .../frontend/public/json/skillserver.json | 2 +- .../standalone/ct/headers/skillserver | 6 + .../standalone/standalone/ct/skillserver.sh | 70 + .../frontend/public/json/skillserver.json | 50 + .../standalone/install/skillserver-install.sh | 61 + .../standalone/standalone/CHANGELOG.md | 2 + .../standalone/standalone/ct/headers/ztnet | 16 +- .../standalone/install/ztnet-install.sh | 1 + .../standalone/standalone/ct/headers/ztnet | 10 + .../standalone/standalone/ct/ztnet.sh | 65 + .../standalone/install/ztnet-install.sh | 44 + .../standalone/frontend/next-env.d.ts | 6 + .../standalone/frontend/package-lock.json | 14813 +++++++++++++++ .../frontend/src/app/generator/page.tsx | 542 + .../src/components/advanced-filter.tsx | 250 + .../frontend/src/components/search.tsx | 101 + .../frontend/src/lib/filter-utils.ts | 250 + .../frontend/src/lib/generate-command.ts | 230 + .../standalone/standalone/misc/install.func | 41 + .../frontend/public/json/github-versions.json | 21 +- .../standalone/.github/changelogs/2026/03.md | 161 + .../standalone/docs/contribution/AI.md | 22 +- .../docs/contribution/CODE-AUDIT.md | 4 +- .../standalone/docs/contribution/GUIDE.md | 6 +- .../docs/contribution/templates_ct/AppName.md | 2 +- .../contribution/templates_json/AppName.md | 31 +- .../frontend/src/app/categories/page.tsx | 170 +- .../frontend/src/app/scripts/page.tsx | 245 +- .../frontend/src/components/navbar.tsx | 69 +- .../frontend/src/config/site-config.tsx | 8 +- .../.github/workflows/upstream-sync.yml | 26 +- .../standalone/standalone/.gitattributes | 93 +- .../.github/workflows/upstream-sync.yml | 383 +- .../standalone/standalone/CHANGELOG.md | 2 + .../frontend/public/json/github-versions.json | 20 +- .../frontend/public/json/localrecall.json | 6 +- .../frontend/public/json/ragflow.json | 8 +- .../standalone/install/ragflow-install.sh | 19 +- .../frontend/public/json/ragflow.json | 8 +- .../standalone/install/ragflow-install.sh | 19 +- .../standalone/standalone/ct/ragflow.sh | 143 +- .../standalone/standalone/ct/ragflow.sh | 29 +- .../standalone/install/ragflow-install.sh | 219 +- .../standalone/ct/headers/localrecall | 6 + .../frontend/public/json/localrecall.json | 2 +- .../frontend/public/json/ragflow.json | 2 +- .../standalone/install/localrecall-install.sh | 2 +- .../standalone/install/ragflow-install.sh | 21 +- .../standalone/standalone/ct/localrecall.sh | 2 +- .../standalone/standalone/ct/ragflow.sh | 15 +- .../frontend/public/json/localrecall.json | 2 +- .../frontend/public/json/ragflow.json | 2 +- .../standalone/install/localrecall-install.sh | 2 +- .../standalone/install/ragflow-install.sh | 21 +- .../standalone/standalone/ct/localrecall.sh | 73 + .../frontend/public/json/localrecall.json | 42 + .../standalone/install/localrecall-install.sh | 62 + .../standalone/install/ragflow-install.sh | 54 +- .../standalone/standalone/ct/ragflow.sh | 63 +- .../frontend/public/json/ragflow.json | 6 +- .../standalone/install/ragflow-install.sh | 54 +- .../frontend/public/json/localai.json | 3 +- .../standalone/install/ragflow-install.sh | 18 +- .../standalone/standalone/ct/headers/localai | 6 + .../standalone/standalone/ct/ragflow.sh | 25 +- .../frontend/public/json/localai.json | 3 +- .../standalone/install/ragflow-install.sh | 18 +- .../standalone/standalone/ct/localai.sh | 55 + .../frontend/public/json/localai.json | 50 + .../standalone/install/localai-install.sh | 45 + .../standalone/install/ragflow-install.sh | 22 +- .../standalone/standalone/ct/ragflow.sh | 19 +- .../standalone/standalone/ct/ragflow.sh | 19 +- .../standalone/standalone/CHANGELOG.md | 2 + .../standalone/standalone/ct/ragflow.sh | 20 +- .../standalone/install/ragflow-install.sh | 24 +- .../standalone/install/ragflow-install.sh | 24 +- .../standalone/standalone/ct/ragflow.sh | 18 +- .../standalone/install/ragflow-install.sh | 74 +- .../standalone/install/ragflow-install.sh | 74 +- .../standalone/install/ragflow-install.sh | 62 +- .../standalone/standalone/ct/headers/ragflow | 6 + .../standalone/standalone/ct/ragflow.sh | 22 +- .../standalone/install/ragflow-install.sh | 35 + .../standalone/install/ragflow-install.sh | 35 + .../standalone/standalone/ct/ragflow.sh | 91 + .../frontend/public/json/ragflow.json | 80 + .../standalone/install/ragflow-install.sh | 639 + .../standalone/frontend/public/json/kali.json | 52 + .../standalone/standalone/CHANGELOG.md | 2 + .../standalone/standalone/ct/headers/kali | 6 + .../standalone/standalone/ct/kali.sh | 183 + .../standalone/install/kali-install.sh | 94 + .../standalone/standalone/misc/tools.func | 116 +- .../standalone/standalone/ct/headers/pentagi | 13 +- .../standalone/standalone/ct/headers/pentagi | 7 + .../standalone/standalone/ct/pentagi.sh | 70 + .../frontend/public/json/pentagi.json | 76 + .../standalone/install/pentagi-install.sh | 347 + .../standalone/docs/addons/ROCM_INSTALL.md | 490 + .../standalone/standalone/.editorconfig | 16 + .../standalone/standalone/.gitattributes | 38 + .../standalone/standalone/.github/CODEOWNERS | 17 + .../standalone/.github/CODE_OF_CONDUCT.md | 132 + .../DISCUSSION_TEMPLATE/request-script.yml | 39 + .../standalone/standalone/.github/FUNDING.yml | 2 + .../.github/ISSUE_TEMPLATE/bug_report.yml | 119 + .../.github/ISSUE_TEMPLATE/config.yml | 11 + .../ISSUE_TEMPLATE/feature_request.yml | 33 + .../ISSUE_TEMPLATE/frontend_report.yml | 75 + .../.github/ISSUE_TEMPLATE/task.yml | 25 + .../.github/autolabeler-config.json | 137 + .../.github/changelog-pr-config.json | 212 + .../standalone/.github/changelogs/2022/01.md | 65 + .../standalone/.github/changelogs/2022/02.md | 143 + .../standalone/.github/changelogs/2022/03.md | 168 + .../standalone/.github/changelogs/2022/04.md | 114 + .../standalone/.github/changelogs/2022/05.md | 64 + .../standalone/.github/changelogs/2022/06.md | 13 + .../standalone/.github/changelogs/2022/07.md | 80 + .../standalone/.github/changelogs/2022/08.md | 57 + .../standalone/.github/changelogs/2022/09.md | 81 + .../standalone/.github/changelogs/2022/10.md | 22 + .../standalone/.github/changelogs/2022/11.md | 57 + .../standalone/.github/changelogs/2022/12.md | 67 + .../standalone/.github/changelogs/2023/01.md | 143 + .../standalone/.github/changelogs/2023/02.md | 55 + .../standalone/.github/changelogs/2023/03.md | 74 + .../standalone/.github/changelogs/2023/04.md | 65 + .../standalone/.github/changelogs/2023/05.md | 69 + .../standalone/.github/changelogs/2023/06.md | 45 + .../standalone/.github/changelogs/2023/07.md | 40 + .../standalone/.github/changelogs/2023/08.md | 80 + .../standalone/.github/changelogs/2023/09.md | 80 + .../standalone/.github/changelogs/2023/10.md | 59 + .../standalone/.github/changelogs/2023/11.md | 57 + .../standalone/.github/changelogs/2023/12.md | 32 + .../standalone/.github/changelogs/2024/01.md | 84 + .../standalone/.github/changelogs/2024/02.md | 73 + .../standalone/.github/changelogs/2024/03.md | 44 + .../standalone/.github/changelogs/2024/04.md | 129 + .../standalone/.github/changelogs/2024/05.md | 123 + .../standalone/.github/changelogs/2024/06.md | 76 + .../standalone/.github/changelogs/2024/07.md | 6 + .../standalone/.github/changelogs/2024/08.md | 22 + .../standalone/.github/changelogs/2024/09.md | 15 + .../standalone/.github/changelogs/2024/10.md | 81 + .../standalone/.github/changelogs/2024/11.md | 261 + .../standalone/.github/changelogs/2024/12.md | 374 + .../standalone/.github/changelogs/2025/01.md | 567 + .../standalone/.github/changelogs/2025/02.md | 643 + .../standalone/.github/changelogs/2025/03.md | 656 + .../standalone/.github/changelogs/2025/04.md | 542 + .../standalone/.github/changelogs/2025/05.md | 578 + .../standalone/.github/changelogs/2025/06.md | 554 + .../standalone/.github/changelogs/2025/07.md | 566 + .../standalone/.github/changelogs/2025/08.md | 589 + .../standalone/.github/changelogs/2025/09.md | 574 + .../standalone/.github/changelogs/2025/10.md | 518 + .../standalone/.github/changelogs/2025/11.md | 557 + .../standalone/.github/changelogs/2025/12.md | 808 + .../standalone/.github/changelogs/2026/01.md | 828 + .../standalone/.github/changelogs/2026/02.md | 882 + .../standalone/.github/changelogs/2026/03.md | 183 + .../.github/pull_request_template.md | 27 + .../runner/docker/gh-runner-self.dockerfile | 68 + .../workflows/auto-update-app-headers.yml | 117 + .../.github/workflows/autolabeler.yml | 119 + .../workflows/bak/close_template_issue.yml | 55 + .../.github/workflows/bak/crawl-versions.yaml | 126 + .../.github/workflows/bak/script-test.yml | 175 + .../.github/workflows/bak/script_format.yml | 243 + .../workflows/bak/validate-filenames.yml | 158 + .../.github/workflows/changelog-archive.yml | 353 + .../.github/workflows/changelog-pr.yml | 312 + .../.github/workflows/check-node-versions.yml | 457 + .../.github/workflows/close-discussion.yml | 164 + .../workflows/close-new-script-prs.yml | 119 + .../.github/workflows/close-tteck-issues.yaml | 52 + .../.github/workflows/close_issue_in_dev.yaml | 65 + .../workflows/create-docker-for-runner.yml | 41 + .../.github/workflows/delete-json-branch.yml | 29 + .../.github/workflows/frontend-cicd.yml | 147 + .../.github/workflows/github-release.yml | 49 + .../.github/workflows/lock-issue.yaml | 77 + .../workflows/push-json-to-pocketbase.yml | 255 + .../.github/workflows/push-to-gitea.yaml | 48 + .../scripts/app-test/pr-alpine-install.func | 85 + .../workflows/scripts/app-test/pr-build.func | 260 + .../scripts/app-test/pr-create-lxc.sh | 163 + .../scripts/app-test/pr-install.func | 93 + .../workflows/scripts/generate-app-headers.sh | 50 + .../.github/workflows/scripts/update-json.sh | 20 + .../workflows/scripts/update_json_date.sh | 23 + .../.github/workflows/stale_pr_close.yml | 111 + .../.github/workflows/sync-to-standalone.yml | 57 + .../.github/workflows/update-json-date.yml | 152 + .../workflows/update-versions-github.yml | 236 + .../.github/workflows/upstream-sync.yml | 155 + .../standalone/.vscode/.editorconfig | 16 + .../standalone/.vscode/.shellcheckrc | 1 + .../standalone/.vscode/extensions.json | 9 + .../standalone/standalone/CHANGELOG.md | 1406 ++ .../standalone/standalone/standalone/LICENSE | 21 + .../standalone/standalone/SECURITY.md | 67 + .../standalone/standalone/ct/.gitkeep | 0 .../standalone/standalone/ct/headers/.gitkeep | 2 + .../standalone/standalone/docs/DEV_MODE.md | 532 + .../standalone/standalone/docs/EXIT_CODES.md | 298 + .../standalone/docs/TECHNICAL_REFERENCE.md | 897 + .../standalone/docs/contribution/AI.md | 868 + .../docs/contribution/CODE-AUDIT.md | 41 + .../docs/contribution/CONTRIBUTING.md | 178 + .../docs/contribution/FORK_SETUP.md | 231 + .../standalone/docs/contribution/GUIDE.md | 1077 ++ .../docs/contribution/HELPER_FUNCTIONS.md | 753 + .../docs/contribution/setup-fork.sh | 336 + .../docs/contribution/templates_ct/AppName.md | 278 + .../docs/contribution/templates_ct/AppName.sh | 138 + .../templates_install/AppName-install.md | 494 + .../templates_install/AppName-install.sh | 207 + .../contribution/templates_json/AppName.json | 40 + .../contribution/templates_json/AppName.md | 165 + .../standalone/docs/ct/DETAILED_GUIDE.md | 472 + .../docs/guides/CONFIGURATION_REFERENCE.md | 904 + .../docs/guides/DEFAULTS_SYSTEM_GUIDE.md | 760 + .../docs/guides/UNATTENDED_DEPLOYMENTS.md | 1010 + .../docs/guides/USER_SUBMITTED_GUIDES.md | 44 + .../standalone/docs/install/DETAILED_GUIDE.md | 647 + .../ALPINE_INSTALL_FUNC_FLOWCHART.md | 29 + ...ALPINE_INSTALL_FUNC_FUNCTIONS_REFERENCE.md | 30 + .../ALPINE_INSTALL_FUNC_INTEGRATION.md | 14 + .../ALPINE_INSTALL_FUNC_USAGE_EXAMPLES.md | 24 + .../ALPINE_TOOLS_FUNC_FLOWCHART.md | 25 + .../ALPINE_TOOLS_FUNC_FUNCTIONS_REFERENCE.md | 31 + .../ALPINE_TOOLS_FUNC_INTEGRATION.md | 7 + .../ALPINE_TOOLS_FUNC_USAGE_EXAMPLES.md | 19 + .../docs/misc/api.func/API_FLOWCHART.md | 342 + .../misc/api.func/API_FUNCTIONS_REFERENCE.md | 433 + .../docs/misc/api.func/API_INTEGRATION.md | 643 + .../docs/misc/api.func/API_USAGE_EXAMPLES.md | 794 + .../BUILD_FUNC_ADVANCED_SETTINGS.md | 164 + .../build.func/BUILD_FUNC_ARCHITECTURE.md | 410 + .../BUILD_FUNC_ENVIRONMENT_VARIABLES.md | 294 + .../build.func/BUILD_FUNC_EXECUTION_FLOWS.md | 413 + .../misc/build.func/BUILD_FUNC_FLOWCHART.md | 244 + .../BUILD_FUNC_FUNCTIONS_REFERENCE.md | 489 + .../build.func/BUILD_FUNC_USAGE_EXAMPLES.md | 600 + .../CLOUD_INIT_FUNC_FLOWCHART.md | 28 + .../CLOUD_INIT_FUNC_FUNCTIONS_REFERENCE.md | 30 + .../CLOUD_INIT_FUNC_INTEGRATION.md | 7 + .../CLOUD_INIT_FUNC_USAGE_EXAMPLES.md | 17 + .../docs/misc/core.func/CORE_FLOWCHART.md | 316 + .../core.func/CORE_FUNCTIONS_REFERENCE.md | 637 + .../docs/misc/core.func/CORE_INTEGRATION.md | 517 + .../misc/core.func/CORE_USAGE_EXAMPLES.md | 728 + .../ERROR_HANDLER_FLOWCHART.md | 347 + .../ERROR_HANDLER_FUNCTIONS_REFERENCE.md | 424 + .../ERROR_HANDLER_INTEGRATION.md | 512 + .../ERROR_HANDLER_USAGE_EXAMPLES.md | 625 + .../install.func/INSTALL_FUNC_FLOWCHART.md | 117 + .../INSTALL_FUNC_FUNCTIONS_REFERENCE.md | 237 + .../install.func/INSTALL_FUNC_INTEGRATION.md | 104 + .../INSTALL_FUNC_USAGE_EXAMPLES.md | 93 + .../misc/tools.func/TOOLS_FUNC_FLOWCHART.md | 199 + .../TOOLS_FUNC_FUNCTIONS_REFERENCE.md | 784 + .../misc/tools.func/TOOLS_FUNC_INTEGRATION.md | 418 + .../tools.func/TOOLS_FUNC_USAGE_EXAMPLES.md | 420 + .../standalone/frontend/.vscode/settings.json | 51 + .../standalone/standalone/frontend/LICENSE | 21 + .../standalone/standalone/frontend/bun.lock | 2031 ++ .../standalone/frontend/components.json | 20 + .../standalone/frontend/eslint.config.mjs | 41 + .../standalone/frontend/next.config.mjs | 29 + .../standalone/frontend/package.json | 87 + .../standalone/frontend/postcss.config.mjs | 8 + .../standalone/frontend/public/defaultimg.png | Bin 0 -> 8043894 bytes .../standalone/frontend/public/json/.gitkeep | 2 + .../frontend/public/json/github-versions.json | 47 + .../frontend/public/json/metadata.json | 186 + .../frontend/public/json/olares.json | 63 + .../public/json/osx-proxmox-next.json | 55 + .../standalone/frontend/public/json/rocm.json | 62 + .../frontend/public/json/versions.json | 1 + .../standalone/frontend/public/logo.png | Bin 0 -> 4095046 bytes .../frontend/src/app/api/categories/route.ts | 63 + .../src/app/api/github-versions/route.ts | 36 + .../frontend/src/app/api/versions/route.ts | 48 + .../frontend/src/app/categories/page.tsx | 127 + .../frontend/src/app/community/page.tsx | 220 + .../standalone/frontend/src/app/data/page.tsx | 509 + .../standalone/frontend/src/app/favicon.ico | Bin 0 -> 1841 bytes .../json-editor/_components/categories.tsx | 125 + .../_components/install-method.tsx | 233 + .../src/app/json-editor/_components/note.tsx | 159 + .../src/app/json-editor/_schemas/schemas.ts | 59 + .../frontend/src/app/json-editor/page.tsx | 590 + .../standalone/frontend/src/app/layout.tsx | 147 + .../standalone/frontend/src/app/manifest.ts | 29 + .../standalone/frontend/src/app/not-found.tsx | 31 + .../standalone/frontend/src/app/page.tsx | 199 + .../standalone/frontend/src/app/robots.ts | 15 + .../scripts/_components/quickfilter-bar.tsx | 118 + .../scripts/_components/resource-display.tsx | 43 + .../scripts/_components/script-accordion.tsx | 159 + .../_components/script-info-blocks.tsx | 211 + .../app/scripts/_components/script-item.tsx | 191 + .../_components/script-items/alerts.tsx | 39 + .../_components/script-items/buttons.tsx | 104 + .../_components/script-items/config-file.tsx | 9 + .../script-items/default-password.tsx | 51 + .../script-items/default-settings.tsx | 40 + .../_components/script-items/description.tsx | 14 + .../script-items/disable-description.tsx | 26 + .../script-items/install-command.tsx | 149 + .../_components/script-items/interfaces.tsx | 25 + .../_components/script-items/tool-tips.tsx | 59 + .../src/app/scripts/_components/sidebar.tsx | 61 + .../app/scripts/_components/version-badge.tsx | 13 + .../frontend/src/app/scripts/page.tsx | 105 + .../standalone/frontend/src/app/sitemap.ts | 24 + .../animate-ui/components/buttons/button.tsx | 61 + .../components/buttons/github-stars.tsx | 109 + .../primitives/animate/github-stars.tsx | 206 + .../animate-ui/primitives/animate/slot.tsx | 101 + .../animate-ui/primitives/buttons/button.tsx | 36 + .../primitives/effects/particles.tsx | 160 + .../primitives/texts/sliding-number.tsx | 338 + .../frontend/src/components/command-menu.tsx | 282 + .../src/components/copycat-warning-toast.tsx | 24 + .../frontend/src/components/faq.tsx | 30 + .../frontend/src/components/feature-cards.tsx | 66 + .../frontend/src/components/footer.tsx | 69 + .../frontend/src/components/handle-copy.tsx | 10 + .../src/components/icons/resource-icons.tsx | 48 + .../frontend/src/components/modal.tsx | 30 + .../frontend/src/components/navbar.tsx | 117 + .../components/navigation/mobile-sidebar.tsx | 133 + .../src/components/news-highlight.tsx | 65 + .../src/components/query-provider.tsx | 9 + .../frontend/src/components/stats-section.tsx | 75 + .../src/components/text-copy-block.tsx | 30 + .../src/components/text-parse-links.tsx | 52 + .../src/components/theme-provider.tsx | 9 + .../frontend/src/components/ui/accordion.tsx | 57 + .../frontend/src/components/ui/alert.tsx | 61 + .../components/ui/animated-gradient-text.tsx | 26 + .../frontend/src/components/ui/badge.tsx | 39 + .../frontend/src/components/ui/button.tsx | 120 + .../frontend/src/components/ui/calendar.tsx | 70 + .../frontend/src/components/ui/card.tsx | 100 + .../frontend/src/components/ui/chart.tsx | 334 + .../src/components/ui/code-copy-button.tsx | 66 + .../frontend/src/components/ui/codeblock.tsx | 149 + .../frontend/src/components/ui/command.tsx | 161 + .../src/components/ui/config-copy-button.tsx | 57 + .../frontend/src/components/ui/dialog.tsx | 126 + .../src/components/ui/dropdown-menu.tsx | 200 + .../frontend/src/components/ui/input.tsx | 24 + .../frontend/src/components/ui/label.tsx | 28 + .../src/components/ui/navigation-menu.tsx | 129 + .../src/components/ui/number-ticker.tsx | 61 + .../frontend/src/components/ui/particles.tsx | 319 + .../frontend/src/components/ui/popover.tsx | 31 + .../src/components/ui/scroll-area.tsx | 48 + .../frontend/src/components/ui/select.tsx | 160 + .../frontend/src/components/ui/separator.tsx | 31 + .../frontend/src/components/ui/sheet.tsx | 144 + .../frontend/src/components/ui/sonner.tsx | 31 + .../components/ui/star-on-github-button.tsx | 61 + .../frontend/src/components/ui/switch.tsx | 29 + .../frontend/src/components/ui/table.tsx | 120 + .../frontend/src/components/ui/tabs.tsx | 55 + .../frontend/src/components/ui/textarea.tsx | 22 + .../src/components/ui/theme-toggle.tsx | 49 + .../frontend/src/components/ui/tooltip.tsx | 30 + .../frontend/src/config/faq-config.tsx | 37 + .../frontend/src/config/site-config.tsx | 91 + .../frontend/src/hooks/use-is-in-view.tsx | 27 + .../frontend/src/hooks/use-versions.ts | 17 + .../frontend/src/lib/contributors-data.ts | 30 + .../standalone/frontend/src/lib/data.ts | 18 + .../frontend/src/lib/get-strict-context.tsx | 36 + .../standalone/frontend/src/lib/news-data.ts | 42 + .../standalone/frontend/src/lib/time.ts | 7 + .../standalone/frontend/src/lib/types.ts | 74 + .../standalone/frontend/src/lib/utils.ts | 8 + .../frontend/src/lib/utils/resource-utils.ts | 7 + .../frontend/src/styles/globals.css | 609 + .../standalone/frontend/tailwind.config.ts | 410 + .../standalone/frontend/tsconfig.json | 41 + .../standalone/standalone/install/.gitkeep | 0 .../standalone/misc/alpine-install.func | 197 + .../standalone/misc/alpine-tools.func | 515 + .../standalone/standalone/misc/api.func | 1470 ++ .../standalone/standalone/misc/build.func | 5783 ++++++ .../standalone/misc/cloud-init.func | 708 + .../standalone/standalone/misc/core.func | 1719 ++ .../standalone/misc/error_handler.func | 638 + .../standalone/misc/images/logo-81x112.png | Bin 0 -> 5758 bytes .../misc/images/logo-proxmoxve-name.svg | 15714 ++++++++++++++++ .../standalone/misc/images/logo-proxmoxve.svg | 15714 ++++++++++++++++ .../standalone/misc/images/logo.png | Bin 0 -> 4095046 bytes .../standalone/standalone/misc/install.func | 336 + .../standalone/standalone/misc/tools.func | 8341 ++++++++ .../standalone/standalone/misc/vm-core.func | 626 + .../standalone/standalone/ct/agregarr.sh | 69 + .../standalone/standalone/ct/drop.sh | 118 + .../standalone/standalone/ct/headers/agregarr | 6 + .../standalone/standalone/ct/headers/drop | 6 + .../standalone/standalone/ct/headers/hermes | 6 + .../standalone/standalone/ct/headers/lemonade | 6 + .../standalone/standalone/ct/headers/llamacpp | 6 + .../standalone/ct/headers/maintainerr | 6 + .../standalone/standalone/ct/headers/mcphub | 6 + .../standalone/standalone/ct/headers/openclaw | 6 + .../standalone/standalone/ct/headers/pegaprox | 6 + .../standalone/standalone/ct/headers/swarmui | 6 + .../standalone/standalone/ct/headers/wakapi | 6 + .../standalone/standalone/ct/hermes.sh | 70 + .../standalone/standalone/ct/lemonade.sh | 50 + .../standalone/standalone/ct/llamacpp.sh | 70 + .../standalone/standalone/ct/maintainerr.sh | 78 + .../standalone/standalone/ct/mcphub.sh | 56 + .../standalone/standalone/ct/openclaw.sh | 87 + .../standalone/standalone/ct/pegaprox.sh | 70 + .../standalone/standalone/ct/swarmui.sh | 81 + .../standalone/standalone/ct/wakapi.sh | 65 + .../frontend/public/json/agregarr.json | 42 + .../standalone/frontend/public/json/drop.json | 56 + .../frontend/public/json/hermes.json | 42 + .../frontend/public/json/lemonade.json | 56 + .../frontend/public/json/llamacpp.json | 76 + .../frontend/public/json/maintainerr.json | 52 + .../frontend/public/json/mcphub.json | 48 + .../frontend/public/json/openclaw.json | 64 + .../frontend/public/json/pegaprox.json | 52 + .../frontend/public/json/swarmui.json | 56 + .../frontend/public/json/wakapi.json | 60 + .../standalone/install/agregarr-install.sh | 58 + .../standalone/install/drop-install.sh | 166 + .../standalone/install/hermes-install.sh | 153 + .../standalone/install/lemonade-install.sh | 37 + .../standalone/install/llamacpp-install.sh | 195 + .../standalone/install/maintainerr-install.sh | 82 + .../standalone/install/mcphub-install.sh | 61 + .../standalone/install/openclaw-install.sh | 64 + .../standalone/install/pegaprox-install.sh | 73 + .../standalone/install/swarmui-install.sh | 72 + .../standalone/install/wakapi-install.sh | 241 + .../templates/IMPLEMENTATION_GUIDE.md | 271 + .../standalone/templates/standalone-readme.md | 229 + .../tools/addon/coder-code-server.sh | 115 + .../standalone/standalone/tools/addon/rocm.sh | 402 + ...iner-copy-data-home-assistant-container.sh | 131 + ...container-copy-data-home-assistant-core.sh | 127 + ...ntainer-copy-data-podman-home-assistant.sh | 132 + ...core-copy-data-home-assistant-container.sh | 127 + ...tant-core-copy-data-home-assistant-core.sh | 126 + .../tools/copy-data/plex-copy-data-plex.sh | 131 + ...tant-copy-data-home-assistant-container.sh | 132 + .../tools/copy-data/z2m-copy-data-z2m.sh | 131 + .../zwavejs2mqtt-copy-data-zwavejsui.sh | 133 + .../standalone/tools/headers/add-iptag | 6 + .../tools/headers/coder-code-server | 6 + .../headers/container-restore-from-backup | 6 + .../tools/headers/core-restore-from-backup | 6 + .../standalone/tools/headers/osx-proxmox-next | 6 + .../tools/headers/pve-privilege-converter | 6 + .../standalone/tools/pve/add-iptag.sh | 1144 ++ .../standalone/tools/pve/clean-lxcs.sh | 121 + .../tools/pve/clean-orphaned-lvm.sh | 86 + .../pve/container-restore-from-backup.sh | 93 + .../tools/pve/core-restore-from-backup.sh | 93 + .../standalone/tools/pve/cron-update-lxcs.sh | 56 + .../standalone/tools/pve/execute.sh | 92 + .../standalone/tools/pve/frigate-support.sh | 98 + .../standalone/standalone/tools/pve/fstrim.sh | 193 + .../standalone/tools/pve/host-backup.sh | 90 + .../standalone/tools/pve/hw-acceleration.sh | 121 + .../standalone/tools/pve/kernel-clean.sh | 85 + .../standalone/tools/pve/kernel-pin.sh | 75 + .../standalone/tools/pve/lxc-delete.sh | 119 + .../standalone/tools/pve/microcode.sh | 157 + .../standalone/tools/pve/monitor-all.sh | 186 + .../tools/pve/nic-offloading-fix.sh | 254 + .../standalone/tools/pve/osx-proxmox-next.sh | 400 + .../standalone/tools/pve/pbs-microcode.sh | 177 + .../standalone/tools/pve/pbs3-upgrade.sh | 178 + .../standalone/tools/pve/pbs4-upgrade.sh | 187 + .../standalone/tools/pve/post-pbs-install.sh | 322 + .../standalone/tools/pve/post-pmg-install.sh | 327 + .../standalone/tools/pve/post-pve-install.sh | 689 + .../tools/pve/pve-privilege-converter.sh | 198 + .../standalone/tools/pve/pve8-upgrade.sh | 143 + .../standalone/tools/pve/scaling-governor.sh | 66 + .../standalone/tools/pve/update-apps.sh | 475 + .../standalone/tools/pve/update-lxcs-cron.sh | 50 + .../standalone/tools/pve/update-lxcs.sh | 134 + .../standalone/tools/pve/update-repo.sh | 69 + .../standalone/tools/pve/usb-passthrough.sh | 51 + .../standalone/standalone/turnkey/turnkey.sh | 295 + .../standalone/standalone/vm/archlinux-vm.sh | 573 + .../standalone/standalone/vm/debian-13-vm.sh | 653 + .../standalone/standalone/vm/debian-vm.sh | 590 + .../standalone/standalone/vm/docker-vm.sh | 716 + .../standalone/standalone/vm/haos-vm.sh | 661 + .../standalone/vm/headers/docker-vm | 6 + .../standalone/vm/headers/olares-vm | 7 + .../standalone/vm/headers/owncloud-vm | 6 + .../standalone/vm/mikrotik-routeros.sh | 643 + .../standalone/standalone/vm/nextcloud-vm.sh | 567 + .../standalone/standalone/vm/olares-vm.sh | 675 + .../standalone/standalone/vm/openwrt-vm.sh | 664 + .../standalone/standalone/vm/opnsense-vm.sh | 851 + .../standalone/standalone/vm/owncloud-vm.sh | 581 + .../standalone/standalone/vm/pimox-haos-vm.sh | 482 + .../standalone/standalone/vm/truenas-vm.sh | 625 + .../standalone/standalone/vm/ubuntu2204-vm.sh | 565 + .../standalone/standalone/vm/ubuntu2404-vm.sh | 567 + .../standalone/standalone/vm/ubuntu2504-vm.sh | 566 + .../standalone/standalone/vm/umbrel-os-vm.sh | 613 + .../standalone/tools/headers/osx-proxmox-next | 12 +- .../standalone/vm/headers/olares-vm | 13 +- .../tools/pve/pve-privilege-converter.sh | 20 +- .../standalone/tools/pve/update-apps.sh | 17 +- .../standalone/standalone/tools/addon/rocm.sh | 23 +- .../standalone/standalone/tools/addon/rocm.sh | 2 + 542 files changed, 149325 insertions(+), 1068 deletions(-) create mode 100644 standalone/standalone/standalone/standalone/ct/headers/unsolth-studio create mode 100644 standalone/standalone/standalone/standalone/ct/unsolth-studio.sh create mode 100644 standalone/standalone/standalone/standalone/frontend/public/json/unsolth-studio.json create mode 100644 standalone/standalone/standalone/standalone/install/unsolth-studio-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/skillserver create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/skillserver.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/skillserver.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/skillserver-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/ztnet create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/ztnet.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/ztnet-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/next-env.d.ts create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/package-lock.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/generator/page.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/advanced-filter.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/search.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/lib/filter-utils.ts create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/lib/generate-command.ts create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/localrecall create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/localrecall.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/localrecall.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/localrecall-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/localai create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/localai.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/localai.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/localai-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/ragflow create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/ragflow.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/ragflow.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/ragflow-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/kali.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/kali create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/kali.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/kali-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/pentagi create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/pentagi.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/pentagi.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/pentagi-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/addons/ROCM_INSTALL.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.editorconfig create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.gitattributes create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/CODEOWNERS create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/CODE_OF_CONDUCT.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/DISCUSSION_TEMPLATE/request-script.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/FUNDING.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/ISSUE_TEMPLATE/config.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/ISSUE_TEMPLATE/frontend_report.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/ISSUE_TEMPLATE/task.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/autolabeler-config.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelog-pr-config.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2022/01.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2022/02.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2022/03.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2022/04.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2022/05.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2022/06.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2022/07.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2022/08.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2022/09.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2022/10.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2022/11.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2022/12.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2023/01.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2023/02.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2023/03.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2023/04.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2023/05.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2023/06.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2023/07.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2023/08.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2023/09.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2023/10.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2023/11.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2023/12.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2024/01.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2024/02.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2024/03.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2024/04.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2024/05.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2024/06.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2024/07.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2024/08.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2024/09.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2024/10.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2024/11.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2024/12.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2025/01.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2025/02.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2025/03.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2025/04.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2025/05.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2025/06.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2025/07.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2025/08.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2025/09.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2025/10.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2025/11.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2025/12.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2026/01.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2026/02.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/changelogs/2026/03.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/pull_request_template.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/runner/docker/gh-runner-self.dockerfile create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/auto-update-app-headers.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/autolabeler.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/bak/close_template_issue.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/bak/crawl-versions.yaml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/bak/script-test.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/bak/script_format.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/bak/validate-filenames.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/changelog-archive.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/changelog-pr.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/check-node-versions.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/close-discussion.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/close-new-script-prs.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/close-tteck-issues.yaml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/close_issue_in_dev.yaml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/create-docker-for-runner.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/delete-json-branch.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/frontend-cicd.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/github-release.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/lock-issue.yaml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/push-json-to-pocketbase.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/push-to-gitea.yaml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/scripts/app-test/pr-alpine-install.func create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/scripts/app-test/pr-build.func create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/scripts/app-test/pr-create-lxc.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/scripts/app-test/pr-install.func create mode 100755 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/scripts/generate-app-headers.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/scripts/update-json.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/scripts/update_json_date.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/stale_pr_close.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/sync-to-standalone.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/update-json-date.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/update-versions-github.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.github/workflows/upstream-sync.yml create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.vscode/.editorconfig create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.vscode/.shellcheckrc create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/.vscode/extensions.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/CHANGELOG.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/LICENSE create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/SECURITY.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/.gitkeep create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/.gitkeep create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/DEV_MODE.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/EXIT_CODES.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/TECHNICAL_REFERENCE.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/contribution/AI.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/contribution/CODE-AUDIT.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/contribution/CONTRIBUTING.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/contribution/FORK_SETUP.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/contribution/GUIDE.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/contribution/HELPER_FUNCTIONS.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/contribution/setup-fork.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/contribution/templates_ct/AppName.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/contribution/templates_ct/AppName.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/contribution/templates_install/AppName-install.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/contribution/templates_install/AppName-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/contribution/templates_json/AppName.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/contribution/templates_json/AppName.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/ct/DETAILED_GUIDE.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/guides/CONFIGURATION_REFERENCE.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/guides/DEFAULTS_SYSTEM_GUIDE.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/guides/UNATTENDED_DEPLOYMENTS.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/guides/USER_SUBMITTED_GUIDES.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/install/DETAILED_GUIDE.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/alpine-install.func/ALPINE_INSTALL_FUNC_FLOWCHART.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/alpine-install.func/ALPINE_INSTALL_FUNC_FUNCTIONS_REFERENCE.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/alpine-install.func/ALPINE_INSTALL_FUNC_INTEGRATION.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/alpine-install.func/ALPINE_INSTALL_FUNC_USAGE_EXAMPLES.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/alpine-tools.func/ALPINE_TOOLS_FUNC_FLOWCHART.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/alpine-tools.func/ALPINE_TOOLS_FUNC_FUNCTIONS_REFERENCE.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/alpine-tools.func/ALPINE_TOOLS_FUNC_INTEGRATION.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/alpine-tools.func/ALPINE_TOOLS_FUNC_USAGE_EXAMPLES.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/api.func/API_FLOWCHART.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/api.func/API_FUNCTIONS_REFERENCE.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/api.func/API_INTEGRATION.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/api.func/API_USAGE_EXAMPLES.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/build.func/BUILD_FUNC_ADVANCED_SETTINGS.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/build.func/BUILD_FUNC_ARCHITECTURE.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/build.func/BUILD_FUNC_ENVIRONMENT_VARIABLES.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/build.func/BUILD_FUNC_EXECUTION_FLOWS.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/build.func/BUILD_FUNC_FLOWCHART.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/build.func/BUILD_FUNC_FUNCTIONS_REFERENCE.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/build.func/BUILD_FUNC_USAGE_EXAMPLES.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/cloud-init.func/CLOUD_INIT_FUNC_FLOWCHART.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/cloud-init.func/CLOUD_INIT_FUNC_FUNCTIONS_REFERENCE.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/cloud-init.func/CLOUD_INIT_FUNC_INTEGRATION.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/cloud-init.func/CLOUD_INIT_FUNC_USAGE_EXAMPLES.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/core.func/CORE_FLOWCHART.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/core.func/CORE_FUNCTIONS_REFERENCE.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/core.func/CORE_INTEGRATION.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/core.func/CORE_USAGE_EXAMPLES.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/error_handler.func/ERROR_HANDLER_FLOWCHART.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/error_handler.func/ERROR_HANDLER_FUNCTIONS_REFERENCE.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/error_handler.func/ERROR_HANDLER_INTEGRATION.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/error_handler.func/ERROR_HANDLER_USAGE_EXAMPLES.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/install.func/INSTALL_FUNC_FLOWCHART.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/install.func/INSTALL_FUNC_FUNCTIONS_REFERENCE.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/install.func/INSTALL_FUNC_INTEGRATION.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/install.func/INSTALL_FUNC_USAGE_EXAMPLES.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/tools.func/TOOLS_FUNC_FLOWCHART.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/tools.func/TOOLS_FUNC_FUNCTIONS_REFERENCE.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/tools.func/TOOLS_FUNC_INTEGRATION.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/docs/misc/tools.func/TOOLS_FUNC_USAGE_EXAMPLES.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/.vscode/settings.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/LICENSE create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/bun.lock create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/components.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/eslint.config.mjs create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/next.config.mjs create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/package.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/postcss.config.mjs create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/defaultimg.png create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/.gitkeep create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/github-versions.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/metadata.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/olares.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/osx-proxmox-next.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/rocm.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/versions.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/logo.png create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/api/categories/route.ts create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/api/github-versions/route.ts create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/api/versions/route.ts create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/categories/page.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/community/page.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/data/page.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/favicon.ico create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/json-editor/_components/categories.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/json-editor/_components/install-method.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/json-editor/_components/note.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/json-editor/_schemas/schemas.ts create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/json-editor/page.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/layout.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/manifest.ts create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/not-found.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/page.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/robots.ts create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/scripts/_components/quickfilter-bar.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/scripts/_components/resource-display.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/scripts/_components/script-accordion.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/scripts/_components/script-info-blocks.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/scripts/_components/script-item.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/scripts/_components/script-items/alerts.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/scripts/_components/script-items/buttons.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/scripts/_components/script-items/config-file.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/scripts/_components/script-items/default-password.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/scripts/_components/script-items/default-settings.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/scripts/_components/script-items/description.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/scripts/_components/script-items/disable-description.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/scripts/_components/script-items/install-command.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/scripts/_components/script-items/interfaces.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/scripts/_components/script-items/tool-tips.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/scripts/_components/sidebar.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/scripts/_components/version-badge.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/scripts/page.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/sitemap.ts create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/animate-ui/components/buttons/button.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/animate-ui/components/buttons/github-stars.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/animate-ui/primitives/animate/github-stars.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/animate-ui/primitives/animate/slot.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/animate-ui/primitives/buttons/button.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/animate-ui/primitives/effects/particles.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/animate-ui/primitives/texts/sliding-number.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/command-menu.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/copycat-warning-toast.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/faq.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/feature-cards.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/footer.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/handle-copy.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/icons/resource-icons.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/modal.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/navbar.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/navigation/mobile-sidebar.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/news-highlight.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/query-provider.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/stats-section.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/text-copy-block.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/text-parse-links.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/theme-provider.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/accordion.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/alert.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/animated-gradient-text.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/badge.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/button.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/calendar.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/card.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/chart.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/code-copy-button.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/codeblock.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/command.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/config-copy-button.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/dialog.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/dropdown-menu.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/input.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/label.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/navigation-menu.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/number-ticker.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/particles.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/popover.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/scroll-area.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/select.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/separator.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/sheet.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/sonner.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/star-on-github-button.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/switch.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/table.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/tabs.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/textarea.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/theme-toggle.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/components/ui/tooltip.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/config/faq-config.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/config/site-config.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/hooks/use-is-in-view.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/hooks/use-versions.ts create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/lib/contributors-data.ts create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/lib/data.ts create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/lib/get-strict-context.tsx create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/lib/news-data.ts create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/lib/time.ts create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/lib/types.ts create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/lib/utils.ts create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/lib/utils/resource-utils.ts create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/styles/globals.css create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/tailwind.config.ts create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/tsconfig.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/.gitkeep create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/misc/alpine-install.func create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/misc/alpine-tools.func create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/misc/api.func create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/misc/build.func create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/misc/cloud-init.func create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/misc/core.func create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/misc/error_handler.func create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/misc/images/logo-81x112.png create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/misc/images/logo-proxmoxve-name.svg create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/misc/images/logo-proxmoxve.svg create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/misc/images/logo.png create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/misc/install.func create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/misc/tools.func create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/misc/vm-core.func create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/agregarr.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/drop.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/agregarr create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/drop create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/hermes create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/lemonade create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/llamacpp create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/maintainerr create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/mcphub create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/openclaw create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/pegaprox create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/swarmui create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/wakapi create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/hermes.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/lemonade.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/llamacpp.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/maintainerr.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/mcphub.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/openclaw.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/pegaprox.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/swarmui.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/wakapi.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/agregarr.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/drop.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/hermes.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/lemonade.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/llamacpp.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/maintainerr.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/mcphub.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/openclaw.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/pegaprox.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/swarmui.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/wakapi.json create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/agregarr-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/drop-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/hermes-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/lemonade-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/llamacpp-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/maintainerr-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/mcphub-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/openclaw-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/pegaprox-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/swarmui-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/wakapi-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/templates/IMPLEMENTATION_GUIDE.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/templates/standalone-readme.md create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/addon/coder-code-server.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/addon/rocm.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/copy-data/home-assistant-container-copy-data-home-assistant-container.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/copy-data/home-assistant-container-copy-data-home-assistant-core.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/copy-data/home-assistant-container-copy-data-podman-home-assistant.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/copy-data/home-assistant-core-copy-data-home-assistant-container.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/copy-data/home-assistant-core-copy-data-home-assistant-core.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/copy-data/plex-copy-data-plex.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/copy-data/podman-home-assistant-copy-data-home-assistant-container.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/copy-data/z2m-copy-data-z2m.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/copy-data/zwavejs2mqtt-copy-data-zwavejsui.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/headers/add-iptag create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/headers/coder-code-server create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/headers/container-restore-from-backup create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/headers/core-restore-from-backup create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/headers/osx-proxmox-next create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/headers/pve-privilege-converter create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/add-iptag.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/clean-lxcs.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/clean-orphaned-lvm.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/container-restore-from-backup.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/core-restore-from-backup.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/cron-update-lxcs.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/execute.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/frigate-support.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/fstrim.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/host-backup.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/hw-acceleration.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/kernel-clean.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/kernel-pin.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/lxc-delete.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/microcode.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/monitor-all.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/nic-offloading-fix.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/osx-proxmox-next.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/pbs-microcode.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/pbs3-upgrade.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/pbs4-upgrade.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/post-pbs-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/post-pmg-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/post-pve-install.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/pve-privilege-converter.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/pve8-upgrade.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/scaling-governor.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/update-apps.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/update-lxcs-cron.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/update-lxcs.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/update-repo.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/usb-passthrough.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/turnkey/turnkey.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/archlinux-vm.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/debian-13-vm.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/debian-vm.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/docker-vm.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/haos-vm.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/headers/docker-vm create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/headers/olares-vm create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/headers/owncloud-vm create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/mikrotik-routeros.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/nextcloud-vm.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/olares-vm.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/openwrt-vm.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/opnsense-vm.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/owncloud-vm.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/pimox-haos-vm.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/truenas-vm.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/ubuntu2204-vm.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/ubuntu2404-vm.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/ubuntu2504-vm.sh create mode 100644 standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/umbrel-os-vm.sh diff --git a/frontend/public/json/unsolth-studio.json b/frontend/public/json/unsolth-studio.json index 41e879a3d..c81b3f9d9 100644 --- a/frontend/public/json/unsolth-studio.json +++ b/frontend/public/json/unsolth-studio.json @@ -1,5 +1,5 @@ { - "name": "Unsloth Studio", + "name": "Unsloth Studio (In Beta)", "slug": "unsolth-studio", "categories": [20], "date_created": "2026-03-18", diff --git a/standalone/ct/swarmui.sh b/standalone/ct/swarmui.sh index f4252b4b1..1f50f3769 100644 --- a/standalone/ct/swarmui.sh +++ b/standalone/ct/swarmui.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash COMMUNITY_SCRIPTS_URL="${COMMUNITY_SCRIPTS_URL:-https://raw.githubusercontent.com/Heretek-AI/ProxmoxVE/refs/heads/main}" -source <(curl -fsSL ""${COMMUNITY_SCRIPTS_URL"}"/misc/build.func) +source <(curl -fsSL "${COMMUNITY_SCRIPTS_URL}"/misc/build.func) # Author: BillyOutlast # License: MIT | https://github.com/Heretek-AI/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/mcmonkeyprojects/SwarmUI diff --git a/standalone/frontend/public/json/github-versions.json b/standalone/frontend/public/json/github-versions.json index 68827f3cf..352965d8f 100644 --- a/standalone/frontend/public/json/github-versions.json +++ b/standalone/frontend/public/json/github-versions.json @@ -1,5 +1,5 @@ { - "generated": "2026-03-15T12:22:39Z", + "generated": "2026-03-15T18:20:18Z", "versions": [ { "slug": "agregarr", @@ -18,9 +18,9 @@ { "slug": "llamacpp", "repo": "ggml-org/llama.cpp", - "version": "b8354", + "version": "b8355", "pinned": false, - "date": "2026-03-15T10:06:38Z" + "date": "2026-03-15T16:39:26Z" }, { "slug": "localai", diff --git a/standalone/frontend/public/json/unsolth-studio.json b/standalone/frontend/public/json/unsolth-studio.json index 41e879a3d..c81b3f9d9 100644 --- a/standalone/frontend/public/json/unsolth-studio.json +++ b/standalone/frontend/public/json/unsolth-studio.json @@ -1,5 +1,5 @@ { - "name": "Unsloth Studio", + "name": "Unsloth Studio (In Beta)", "slug": "unsolth-studio", "categories": [20], "date_created": "2026-03-18", diff --git a/standalone/standalone/ct/swarmui.sh b/standalone/standalone/ct/swarmui.sh index f4252b4b1..1f50f3769 100644 --- a/standalone/standalone/ct/swarmui.sh +++ b/standalone/standalone/ct/swarmui.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash COMMUNITY_SCRIPTS_URL="${COMMUNITY_SCRIPTS_URL:-https://raw.githubusercontent.com/Heretek-AI/ProxmoxVE/refs/heads/main}" -source <(curl -fsSL ""${COMMUNITY_SCRIPTS_URL"}"/misc/build.func) +source <(curl -fsSL "${COMMUNITY_SCRIPTS_URL}"/misc/build.func) # Author: BillyOutlast # License: MIT | https://github.com/Heretek-AI/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/mcmonkeyprojects/SwarmUI diff --git a/standalone/standalone/misc/build.func b/standalone/standalone/misc/build.func index 72d8ae42f..d6f6cc043 100644 --- a/standalone/standalone/misc/build.func +++ b/standalone/standalone/misc/build.func @@ -3586,6 +3586,7 @@ build_container() { fi # Core exports for install.func + export COMMUNITY_SCRIPTS_URL="$COMMUNITY_SCRIPTS_URL" export DIAGNOSTICS="$DIAGNOSTICS" export RANDOM_UUID="$RANDOM_UUID" export EXECUTION_ID="$EXECUTION_ID" diff --git a/standalone/standalone/standalone/install/lemonade-install.sh b/standalone/standalone/standalone/install/lemonade-install.sh index 67f44f507..cd1e0230f 100644 --- a/standalone/standalone/standalone/install/lemonade-install.sh +++ b/standalone/standalone/standalone/install/lemonade-install.sh @@ -12,6 +12,10 @@ setting_up_container network_check update_os +# Setup GPU hardware acceleration (detects GPU, installs drivers, configures permissions) +# This handles NVIDIA, AMD/ROCm, and Intel GPU detection and driver installation +setup_hardware_acceleration + fetch_and_deploy_gh_release "lemonade" "lemonade-sdk/lemonade" "binary" msg_info "Configuring Service" diff --git a/standalone/standalone/standalone/install/llamacpp-install.sh b/standalone/standalone/standalone/install/llamacpp-install.sh index e0643353f..2649afb13 100644 --- a/standalone/standalone/standalone/install/llamacpp-install.sh +++ b/standalone/standalone/standalone/install/llamacpp-install.sh @@ -101,26 +101,9 @@ EOF systemctl enable -q --now llamacpp msg_ok "Created Service" -msg_info "Configuring GPU Permissions" -# Add render and video groups for GPU access -usermod -aG render,video root 2>/dev/null || true - -# Configure /dev/kfd and /dev/dri permissions for AMD -if [[ -e /dev/kfd ]]; then - chgrp render /dev/kfd 2>/dev/null || true - chmod 660 /dev/kfd 2>/dev/null || true -fi - -if [[ -d /dev/dri ]]; then - chmod 755 /dev/dri 2>/dev/null || true - for render_dev in /dev/dri/renderD*; do - if [[ -e "$render_dev" ]]; then - chgrp render "$render_dev" 2>/dev/null || true - chmod 660 "$render_dev" 2>/dev/null || true - fi - done -fi -msg_ok "Configured GPU Permissions" +# Setup GPU hardware acceleration (detects GPU, installs drivers, configures permissions) +# This handles NVIDIA, AMD/ROCm, and Intel GPU detection and driver installation +setup_hardware_acceleration # Create GPU passthrough info file cat </opt/llamacpp/GPU_PASSTHROUGH.md diff --git a/standalone/standalone/standalone/install/localai-install.sh b/standalone/standalone/standalone/install/localai-install.sh index 906973cb3..aa128a7ea 100644 --- a/standalone/standalone/standalone/install/localai-install.sh +++ b/standalone/standalone/standalone/install/localai-install.sh @@ -13,6 +13,10 @@ setting_up_container network_check update_os +# Setup GPU hardware acceleration (detects GPU, installs drivers, configures permissions) +# This handles NVIDIA, AMD/ROCm, and Intel GPU detection and driver installation +setup_hardware_acceleration + msg_info "Installing Dependencies" $STD apt-get install -y curl msg_ok "Installed Dependencies" diff --git a/standalone/standalone/standalone/install/swarmui-install.sh b/standalone/standalone/standalone/install/swarmui-install.sh index cf3f2b863..c1de87ced 100644 --- a/standalone/standalone/standalone/install/swarmui-install.sh +++ b/standalone/standalone/standalone/install/swarmui-install.sh @@ -12,6 +12,10 @@ setting_up_container network_check update_os +# Setup GPU hardware acceleration (detects GPU, installs drivers, configures permissions) +# This handles NVIDIA, AMD/ROCm, and Intel GPU detection and driver installation +setup_hardware_acceleration + msg_info "Installing Dependencies" setup_deb822_repo \ "microsoft" \ diff --git a/standalone/standalone/standalone/standalone/ct/headers/unsolth-studio b/standalone/standalone/standalone/standalone/ct/headers/unsolth-studio new file mode 100644 index 000000000..c2d9dd7e0 --- /dev/null +++ b/standalone/standalone/standalone/standalone/ct/headers/unsolth-studio @@ -0,0 +1,6 @@ + __ __ __ __ __ + / / / /___ _____/ /___ / /_/ /_ + / / / / __ \/ ___/ / __ \/ __/ __ \ +/ /_/ / / / (__ ) / /_/ / /_/ / / / +\____/_/ /_/____/_/\____/\__/_/ /_/ + \ No newline at end of file diff --git a/standalone/standalone/standalone/standalone/ct/unsolth-studio.sh b/standalone/standalone/standalone/standalone/ct/unsolth-studio.sh new file mode 100644 index 000000000..f378cec1e --- /dev/null +++ b/standalone/standalone/standalone/standalone/ct/unsolth-studio.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash +COMMUNITY_SCRIPTS_URL="${COMMUNITY_SCRIPTS_URL:-https://raw.githubusercontent.com/Heretek-AI/ProxmoxVE/refs/heads/main}" +source <(curl -fsSL "${COMMUNITY_SCRIPTS_URL}"/misc/build.func) +# Author: Heretek-AI +# License: MIT | https://github.com/Heretek-AI/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/unslothai/unsloth + +APP="unsolth-studio" +var_tags="${var_tags:-ai;llm;fine-tuning;training}" +var_cpu="${var_cpu:-4}" +var_ram="${var_ram:-16384}" +var_disk="${var_disk:-50}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +var_unprivileged="${var_unprivileged:-1}" +var_gpu="${var_gpu:-yes}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/unsolth-studio ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if command -v unsloth &>/dev/null; then + CURRENT_VERSION=$(pip show unsloth 2>/dev/null | grep -i version | awk '{print $2}' || echo "unknown") + msg_info "Current version: ${CURRENT_VERSION}" + + msg_info "Checking for updates" + $STD pip install --upgrade unsloth 2>/dev/null + + NEW_VERSION=$(pip show unsloth 2>/dev/null | grep -i version | awk '{print $2}' || echo "unknown") + + if [[ "$CURRENT_VERSION" != "$NEW_VERSION" ]]; then + msg_ok "Updated from ${CURRENT_VERSION} to ${NEW_VERSION}" + else + msg_ok "Already at latest version: ${NEW_VERSION}" + fi + else + msg_error "Unsloth not installed properly" + exit 1 + fi + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8888${CL}" +echo -e "${INFO}${YW} Note: First launch may take 5-10 minutes to compile llama.cpp${CL}" diff --git a/standalone/standalone/standalone/standalone/frontend/public/json/unsolth-studio.json b/standalone/standalone/standalone/standalone/frontend/public/json/unsolth-studio.json new file mode 100644 index 000000000..41e879a3d --- /dev/null +++ b/standalone/standalone/standalone/standalone/frontend/public/json/unsolth-studio.json @@ -0,0 +1,50 @@ +{ + "name": "Unsloth Studio", + "slug": "unsolth-studio", + "categories": [20], + "date_created": "2026-03-18", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8888, + "documentation": "https://unsloth.ai/docs/new/studio/start", + "website": "https://unsloth.ai/", + "logo": "https://unsloth.ai/favicon.ico", + "config_path": "/opt/unsolth-studio/.env", + "description": "Local, browser-based GUI for fine-tuning LLMs without writing code. Supports QLoRA, LoRA, and full fine-tuning with live training monitoring, GPU stats, and model export to GGUF/Safetensors.", + "install_methods": [ + { + "type": "default", + "script": "ct/unsolth-studio.sh", + "resources": { + "cpu": 4, + "ram": 16384, + "hdd": 50, + "os": "Debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Requires GPU passthrough for training. NVIDIA, AMD (ROCm), and Intel GPUs are supported.", + "type": "info" + }, + { + "text": "First launch takes 5-10 minutes to compile llama.cpp binaries.", + "type": "warning" + }, + { + "text": "Minimum 16GB RAM recommended for training models up to 7B parameters.", + "type": "info" + }, + { + "text": "For AMD GPUs, ensure ROCm is properly configured on the host.", + "type": "info" + } + ] +} diff --git a/standalone/standalone/standalone/standalone/install/unsolth-studio-install.sh b/standalone/standalone/standalone/standalone/install/unsolth-studio-install.sh new file mode 100644 index 000000000..9aef1405e --- /dev/null +++ b/standalone/standalone/standalone/standalone/install/unsolth-studio-install.sh @@ -0,0 +1,159 @@ +#!/usr/bin/env bash + +# Author: Heretek-AI +# License: MIT | https://github.com/Heretek-AI/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/unslothai/unsloth + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt-get install -y \ + curl \ + wget \ + git \ + cmake \ + build-essential \ + python3 \ + python3-pip \ + python3-venv \ + pciutils +msg_ok "Installed Dependencies" + +# Setup GPU hardware acceleration FIRST (detects GPU, installs drivers, configures permissions) +# This must run before installing unsloth/torch so PyTorch can detect the GPU +setup_hardware_acceleration + +# Setup Python virtual environment with uv (fast Python package manager) +PYTHON_VERSION="3.12" setup_uv + +msg_info "Creating Virtual Environment" +mkdir -p /opt/unsolth-studio +cd /opt/unsolth-studio || exit +$STD uv venv --python 3.12 +source .venv/bin/activate +msg_ok "Created Virtual Environment" + +msg_info "Installing Unsloth" +# Install unsloth with torch backend auto-detection (GPU drivers must be installed first) +$STD uv pip install unsloth --torch-backend=auto +msg_ok "Installed Unsloth" + +msg_info "Running Unsloth Studio Setup" +# Run the unsloth studio setup command to compile llama.cpp +$STD unsloth studio setup +msg_ok "Completed Unsloth Studio Setup" + +msg_info "Creating Directories" +mkdir -p /opt/unsolth-studio/models +mkdir -p /opt/unsolth-studio/datasets +mkdir -p /var/log/unsolth-studio +chmod 755 /var/log/unsolth-studio +msg_ok "Created Directories" + +msg_info "Creating Service" +cat </etc/systemd/system/unsolth-studio.service +[Unit] +Description=Unsloth Studio - Local LLM Fine-tuning Web UI +After=network.target network-online.target +Wants=network-online.target + +[Service] +Type=simple +WorkingDirectory=/opt/unsolth-studio +Environment="PATH=/opt/unsolth-studio/.venv/bin:/usr/local/bin:/usr/bin:/bin" +ExecStart=/bin/sh -c 'source /opt/unsolth-studio/.venv/bin/activate && unsloth studio -H 0.0.0.0 -p 8888' +Restart=on-failure +RestartSec=10 +StandardOutput=journal +StandardError=journal +SyslogIdentifier=unsolth-studio + +# Resource limits +LimitNOFILE=65535 +TimeoutStartSec=600 +TimeoutStopSec=60 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now unsolth-studio +msg_ok "Created Service" + +# Create GPU passthrough info file +cat </opt/unsolth-studio/GPU_PASSTHROUGH.md +# GPU Passthrough Configuration for Unsloth Studio + +This container has been configured for GPU acceleration for LLM fine-tuning. + +## Required Proxmox Configuration + +Add the following lines to your container config file: +/etc/pve/lxc/.conf + +### For NVIDIA GPUs: +\`\`\` +# Requires nvidia-container-toolkit on host +lxc.cgroup2.devices.allow: c 195:* rwm +lxc.cgroup2.devices.allow: c 509:* rwm +dev0: /dev/nvidia0,gid=104 +dev1: /dev/nvidiactl,gid=104 +dev2: /dev/nvidia-uvm,gid=104 +dev3: /dev/nvidia-uvm-tools,gid=104 +\`\`\` + +### For AMD GPUs (ROCm): +\`\`\` +dev0: /dev/kfd,gid=104 +dev1: /dev/dri/renderD128,gid=104 +lxc.cgroup2.devices.allow: c 226:0 rwm +lxc.cgroup2.devices.allow: c 226:128 rwm +\`\`\` + +### For Intel GPUs: +\`\`\` +dev0: /dev/dri/renderD128,gid=104 +lxc.cgroup2.devices.allow: c 226:128 rwm +\`\`\` + +## Verify GPU Access + +Run these commands inside the container: +- nvidia-smi (NVIDIA GPUs) +- rocminfo (AMD GPUs) +- python -c "import torch; print(torch.cuda.is_available())" + +## Usage + +Access the web UI at: http://:8888 + +On first launch: +1. Create a password to secure your account +2. Follow the onboarding wizard to select a model and dataset +3. Configure training parameters +4. Start fine-tuning! + +## Supported Models + +Unsloth Studio supports fine-tuning many LLM models including: +- Llama 3.x +- Qwen 2.x / 3.x +- Mistral +- Gemma +- Phi-3 +- And many more... + +## Documentation + +- Official Docs: https://unsloth.ai/docs/new/studio/start +- GitHub: https://github.com/unslothai/unsloth +EOF + +motd_ssh +customize +cleanup_lxc diff --git a/standalone/standalone/standalone/standalone/standalone/frontend/public/json/skillserver.json b/standalone/standalone/standalone/standalone/standalone/frontend/public/json/skillserver.json index 6169c78a4..52289e0df 100644 --- a/standalone/standalone/standalone/standalone/standalone/frontend/public/json/skillserver.json +++ b/standalone/standalone/standalone/standalone/standalone/frontend/public/json/skillserver.json @@ -1,5 +1,5 @@ { - "name": "SkillServer", + "name": "SkillServer (In Development)", "slug": "skillserver", "categories": [20], "date_created": "2026-03-17", diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/skillserver b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/skillserver new file mode 100644 index 000000000..a631c81df --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/skillserver @@ -0,0 +1,6 @@ + __ __ __ + / /____ __ __________/ /___ _/ /___ _______ __ + / __/ _ \/ / / / ___/ __ / __ `/ __/ / / / ___/ / / + / /_/ __/ /_/ / / / /_/ / /_/ / /_/ /_/ (__ )_/ / + \__/\___/\__,_/_/ \__,_/\__,_/\__/\__,_/____(_) + \ No newline at end of file diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/skillserver.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/skillserver.sh new file mode 100644 index 000000000..1cae3d4e4 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/skillserver.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +COMMUNITY_SCRIPTS_URL="${COMMUNITY_SCRIPTS_URL:-https://raw.githubusercontent.com/Heretek-AI/ProxmoxVE/refs/heads/main}" +source <(curl -fsSL "${COMMUNITY_SCRIPTS_URL}"/misc/build.func) +# Author: BillyOutlast +# License: MIT | https://github.com/Heretek-AI/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/mudler/skillserver + +APP="skillserver" +var_tags="${var_tags:-ai;mcp;skills;agents}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-2048}" +var_disk="${var_disk:-8}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -f /usr/local/bin/skillserver ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "skillserver" "mudler/skillserver"; then + msg_info "Stopping Service" + systemctl stop skillserver + msg_ok "Stopped Service" + + msg_info "Backing up Data" + cp -r /opt/skillserver/skills /opt/skillserver_skills_backup + msg_ok "Backed up Data" + + setup_go + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "skillserver" "mudler/skillserver" "tarball" "latest" "/opt/skillserver" + + msg_info "Building Application" + cd /opt/skillserver || exit + $STD go build -o /usr/local/bin/skillserver ./cmd/skillserver + msg_ok "Built Application" + + msg_info "Restoring Data" + cp -r /opt/skillserver_skills_backup/. /opt/skillserver/skills + rm -rf /opt/skillserver_skills_backup + msg_ok "Restored Data" + + msg_info "Starting Service" + systemctl start skillserver + msg_ok "Started Service" + msg_ok "Updated Successfully!" + fi + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/skillserver.json b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/skillserver.json new file mode 100644 index 000000000..6169c78a4 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/public/json/skillserver.json @@ -0,0 +1,50 @@ +{ + "name": "SkillServer", + "slug": "skillserver", + "categories": [20], + "date_created": "2026-03-17", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8080, + "documentation": "https://github.com/mudler/skillserver", + "website": "https://github.com/mudler/skillserver", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/skillserver.webp", + "config_path": "", + "description": "An MCP/REST server with WebUI serving as a centralized skills database for AI Agents. Manages 'Skills' (directory-based with SKILL.md files) stored locally, following the Agent Skills specification. Features MCP server integration, web interface for skill management, Git synchronization, and full-text search.", + "install_methods": [ + { + "type": "default", + "script": "ct/skillserver.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "Debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Access the WebUI at http://SERVER_IP:8080", + "type": "info" + }, + { + "text": "Skills are stored in /opt/skillserver/skills", + "type": "info" + }, + { + "text": "Configure Git repositories to sync skills via SKILLSERVER_GIT_REPOS environment variable", + "type": "info" + }, + { + "text": "MCP server runs over stdio for integration with AI clients", + "type": "info" + } + ] +} diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/skillserver-install.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/skillserver-install.sh new file mode 100644 index 000000000..ee7566239 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/skillserver-install.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash + +# Author: BillyOutlast +# License: MIT | https://github.com/Heretek-AI/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/mudler/skillserver + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt-get install -y \ + git \ + ca-certificates +msg_ok "Installed Dependencies" + +setup_go + +fetch_and_deploy_gh_release "skillserver" "mudler/skillserver" "tarball" "latest" "/opt/skillserver" + +msg_info "Building Application" +cd /opt/skillserver || exit +$STD go build -o /usr/local/bin/skillserver ./cmd/skillserver +msg_ok "Built Application" + +msg_info "Creating Service" +mkdir -p /opt/skillserver/skills +cat </etc/systemd/system/skillserver.service +[Unit] +Description=SkillServer - MCP/REST server for AI agent skills +After=network.target +Wants=network-online.target + +[Service] +Type=simple +User=root +WorkingDirectory=/opt/skillserver +# Use tail -f /dev/null to keep stdin open for the MCP stdio server +# skillserver runs both MCP stdio (main thread) and web server (goroutine) +# The MCP server needs stdin to stay open, otherwise it exits immediately +ExecStart=/bin/sh -c 'tail -f /dev/null | /usr/local/bin/skillserver --enable-logging' +StandardOutput=journal +StandardError=journal +Restart=on-failure +RestartSec=5 +Environment=SKILLSERVER_DIR=/opt/skillserver/skills +Environment=SKILLSERVER_PORT=8080 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now skillserver +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/CHANGELOG.md b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/CHANGELOG.md index a500c5810..1ae9d486f 100644 --- a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/CHANGELOG.md +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/CHANGELOG.md @@ -420,6 +420,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit +## 2026-03-16 + ## 2026-03-15 ## 2026-03-14 diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/ztnet b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/ztnet index 26a8ffbd7..fb7cab5d8 100644 --- a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/ztnet +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/ztnet @@ -1,10 +1,6 @@ - /$$$$$$$$/$$$$$$$$ /$$ /$$ /$$$$$$$$ /$$$$$$$$ -|_____ $$|__ $$__/| $$$ | $$| $$_____/|__ $$__/ - /$$/ | $$ | $$$$| $$| $$ | $$ - /$$/ | $$ | $$ $$ $$| $$$$$ | $$ - /$$/ | $$ | $$ $$$$| $$__/ | $$ - /$$/ | $$ | $$\ $$$| $$ | $$ - /$$$$$$$$ | $$ | $$ \ $$| $$$$$$$$ | $$ -|________/ |__/ |__/ \__/|________/ |__/ - - ZeroTier Network Controller Web UI + _____ _______ __ __ +/__ //_ __/ | / /__ / /_ + / / / / / |/ / _ \/ __/ + / /__/ / / /| / __/ /_ +/____/_/ /_/ |_/\___/\__/ + diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/ztnet-install.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/ztnet-install.sh index 7b589c444..fc2ecb36b 100644 --- a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/ztnet-install.sh +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/ztnet-install.sh @@ -19,6 +19,7 @@ $STD apt-get install -y \ git \ openssl \ gnupg \ + lsb-release \ postgresql \ postgresql-contrib msg_ok "Installed Dependencies" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/ztnet b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/ztnet new file mode 100644 index 000000000..26a8ffbd7 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/headers/ztnet @@ -0,0 +1,10 @@ + /$$$$$$$$/$$$$$$$$ /$$ /$$ /$$$$$$$$ /$$$$$$$$ +|_____ $$|__ $$__/| $$$ | $$| $$_____/|__ $$__/ + /$$/ | $$ | $$$$| $$| $$ | $$ + /$$/ | $$ | $$ $$ $$| $$$$$ | $$ + /$$/ | $$ | $$ $$$$| $$__/ | $$ + /$$/ | $$ | $$\ $$$| $$ | $$ + /$$$$$$$$ | $$ | $$ \ $$| $$$$$$$$ | $$ +|________/ |__/ |__/ \__/|________/ |__/ + + ZeroTier Network Controller Web UI diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/ztnet.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/ztnet.sh new file mode 100644 index 000000000..1210d97b7 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/ct/ztnet.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +COMMUNITY_SCRIPTS_URL="${COMMUNITY_SCRIPTS_URL:-https://raw.githubusercontent.com/Heretek-AI/ProxmoxVE/refs/heads/main}" +source <(curl -fsSL "${COMMUNITY_SCRIPTS_URL}"/misc/build.func) +# Author: BillyOutlast +# License: MIT | https://github.com/Heretek-AI/ProxmoxVE/raw/main/LICENSE +# Source: https://ztnet.network + +APP="ZTNet" +var_tags="${var_tags:-network;vpn;zerotier}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-2048}" +var_disk="${var_disk:-8}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/ztnet ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + msg_info "Stopping Service" + systemctl stop ztnet + msg_ok "Stopped Service" + + msg_info "Backing up Data" + cp -r /opt/ztnet/data /opt/ztnet_data_backup 2>/dev/null || true + cp /opt/ztnet/.env /opt/ztnet_env_backup 2>/dev/null || true + msg_ok "Backed up Data" + + msg_info "Updating ZTNet" + curl -s http://install.ztnet.network | bash + msg_ok "Updated ZTNet" + + msg_info "Restoring Data" + cp -r /opt/ztnet_data_backup/. /opt/ztnet/data 2>/dev/null || true + cp /opt/ztnet_env_backup /opt/ztnet/.env 2>/dev/null || true + rm -rf /opt/ztnet_data_backup /opt/ztnet_env_backup + msg_ok "Restored Data" + + msg_info "Starting Service" + systemctl start ztnet + msg_ok "Started Service" + msg_ok "Updated successfully!" + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/ztnet-install.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/ztnet-install.sh new file mode 100644 index 000000000..7b589c444 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/install/ztnet-install.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash + +# Author: BillyOutlast +# License: MIT | https://github.com/Heretek-AI/ProxmoxVE/raw/main/LICENSE +# Source: https://ztnet.network + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt-get install -y \ + curl \ + jq \ + git \ + openssl \ + gnupg \ + postgresql \ + postgresql-contrib +msg_ok "Installed Dependencies" + +msg_info "Installing ZeroTier" +curl -s 'https://raw.githubusercontent.com/zerotier/ZeroTierOne/main/doc/contact%40zerotier.com.gpg' | gpg --import +if z=$(curl -s 'https://install.zerotier.com/' | gpg); then + echo "$z" | bash +fi +$STD systemctl enable --now zerotier-one +msg_ok "Installed ZeroTier" + +msg_info "Installing ZTNet" +curl -s http://install.ztnet.network | bash +msg_ok "Installed ZTNet" + +msg_info "Enabling ZTNet Service" +$STD systemctl enable --now ztnet +msg_ok "Started ZTNet" + +motd_ssh +customize +cleanup_lxc diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/next-env.d.ts b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/next-env.d.ts new file mode 100644 index 000000000..830fb594c --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/next-env.d.ts @@ -0,0 +1,6 @@ +/// +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/package-lock.json b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/package-lock.json new file mode 100644 index 000000000..a8142a336 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/package-lock.json @@ -0,0 +1,14813 @@ +{ + "name": "proxmox-helper-scripts-website", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "proxmox-helper-scripts-website", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@radix-ui/react-accordion": "^1.2.12", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-icons": "^1.3.2", + "@radix-ui/react-label": "^2.1.8", + "@radix-ui/react-navigation-menu": "^1.2.14", + "@radix-ui/react-popover": "^1.1.15", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-separator": "^1.1.8", + "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-switch": "^1.2.6", + "@radix-ui/react-tabs": "^1.1.13", + "@radix-ui/react-tooltip": "^1.2.8", + "@tanstack/react-query": "^5.90.12", + "@types/react-syntax-highlighter": "^15.5.13", + "chart.js": "^4.5.1", + "chartjs-plugin-datalabels": "^2.2.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "date-fns": "^4.1.0", + "framer-motion": "^12.23.26", + "fuse.js": "^7.1.0", + "lucide-react": "^0.561.0", + "mini-svg-data-uri": "^1.4.4", + "motion": "^12.23.26", + "next": "15.5.8", + "next-themes": "^0.4.6", + "nuqs": "^2.8.5", + "react": "19.2.3", + "react-chartjs-2": "^5.3.1", + "react-code-blocks": "^0.1.6", + "react-datepicker": "^9.0.0", + "react-day-picker": "^9.12.0", + "react-dom": "19.2.3", + "react-icons": "^5.5.0", + "react-syntax-highlighter": "^16.1.0", + "react-use-measure": "^2.1.7", + "recharts": "3.6.0", + "sharp": "^0.34.5", + "sonner": "^2.0.7", + "tailwind-merge": "^3.4.0", + "zod": "^4.2.1" + }, + "devDependencies": { + "@antfu/eslint-config": "^6.7.1", + "@eslint-react/eslint-plugin": "^2.3.13", + "@next/eslint-plugin-next": "^15.5.8", + "@tanstack/eslint-plugin-query": "^5.91.2", + "@types/node": "^25.0.2", + "@types/react": "npm:types-react@19.0.0-rc.1", + "@types/react-dom": "npm:types-react-dom@19.0.0-rc.1", + "@typescript-eslint/eslint-plugin": "^8.50.0", + "@typescript-eslint/parser": "^8.50.0", + "@vitejs/plugin-react": "^5.1.2", + "eslint": "^9.39.2", + "eslint-config-next": "15.5.8", + "eslint-plugin-format": "^1.1.0", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.25", + "jsdom": "^27.3.0", + "postcss": "^8.5.6", + "tailwindcss": "^3.4.17", + "tailwindcss-animate": "^1.0.7", + "tailwindcss-animated": "^1.1.2", + "typescript": "^5.9.3" + } + }, + "node_modules/@acemir/cssom": { + "version": "0.9.31", + "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz", + "integrity": "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@antfu/eslint-config": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@antfu/eslint-config/-/eslint-config-6.7.3.tgz", + "integrity": "sha512-0tYYzY59uLnxWgbP9xpuxpvodTcWDacj439kTAJZB3sn7O0BnPfVxTnRvleGYaKCEALBZkzdC/wCho9FD7ICLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@clack/prompts": "^0.11.0", + "@eslint-community/eslint-plugin-eslint-comments": "^4.5.0", + "@eslint/markdown": "^7.5.1", + "@stylistic/eslint-plugin": "^5.6.1", + "@typescript-eslint/eslint-plugin": "^8.50.0", + "@typescript-eslint/parser": "^8.50.0", + "@vitest/eslint-plugin": "^1.5.4", + "ansis": "^4.2.0", + "cac": "^6.7.14", + "eslint-config-flat-gitignore": "^2.1.0", + "eslint-flat-config-utils": "^2.1.4", + "eslint-merge-processors": "^2.0.0", + "eslint-plugin-antfu": "^3.1.1", + "eslint-plugin-command": "^3.4.0", + "eslint-plugin-import-lite": "^0.4.0", + "eslint-plugin-jsdoc": "^61.5.0", + "eslint-plugin-jsonc": "^2.21.0", + "eslint-plugin-n": "^17.23.1", + "eslint-plugin-no-only-tests": "^3.3.0", + "eslint-plugin-perfectionist": "^4.15.1", + "eslint-plugin-pnpm": "^1.4.3", + "eslint-plugin-regexp": "^2.10.0", + "eslint-plugin-toml": "^0.12.0", + "eslint-plugin-unicorn": "^62.0.0", + "eslint-plugin-unused-imports": "^4.3.0", + "eslint-plugin-vue": "^10.6.2", + "eslint-plugin-yml": "^1.19.1", + "eslint-processor-vue-blocks": "^2.0.0", + "globals": "^16.5.0", + "jsonc-eslint-parser": "^2.4.2", + "local-pkg": "^1.1.2", + "parse-gitignore": "^2.0.0", + "toml-eslint-parser": "^0.10.1", + "vue-eslint-parser": "^10.2.0", + "yaml-eslint-parser": "^1.3.2" + }, + "bin": { + "eslint-config": "bin/index.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@eslint-react/eslint-plugin": "^2.0.1", + "@next/eslint-plugin-next": ">=15.0.0", + "@prettier/plugin-xml": "^3.4.1", + "@unocss/eslint-plugin": ">=0.50.0", + "astro-eslint-parser": "^1.0.2", + "eslint": "^9.10.0", + "eslint-plugin-astro": "^1.2.0", + "eslint-plugin-format": ">=0.1.0", + "eslint-plugin-jsx-a11y": ">=6.10.2", + "eslint-plugin-react-hooks": "^7.0.0", + "eslint-plugin-react-refresh": "^0.4.19", + "eslint-plugin-solid": "^0.14.3", + "eslint-plugin-svelte": ">=2.35.1", + "eslint-plugin-vuejs-accessibility": "^2.4.1", + "prettier-plugin-astro": "^0.14.0", + "prettier-plugin-slidev": "^1.0.5", + "svelte-eslint-parser": ">=0.37.0" + }, + "peerDependenciesMeta": { + "@eslint-react/eslint-plugin": { + "optional": true + }, + "@next/eslint-plugin-next": { + "optional": true + }, + "@prettier/plugin-xml": { + "optional": true + }, + "@unocss/eslint-plugin": { + "optional": true + }, + "astro-eslint-parser": { + "optional": true + }, + "eslint-plugin-astro": { + "optional": true + }, + "eslint-plugin-format": { + "optional": true + }, + "eslint-plugin-jsx-a11y": { + "optional": true + }, + "eslint-plugin-react-hooks": { + "optional": true + }, + "eslint-plugin-react-refresh": { + "optional": true + }, + "eslint-plugin-solid": { + "optional": true + }, + "eslint-plugin-svelte": { + "optional": true + }, + "eslint-plugin-vuejs-accessibility": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-slidev": { + "optional": true + }, + "svelte-eslint-parser": { + "optional": true + } + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.2.tgz", + "integrity": "sha512-NfBUvBaYgKIuq6E/RBLY1m0IohzNHAYyaJGuTK79Z23uNwmz2jl1mPsC5ZxCCxylinKhT1Amn5oNTlx1wN8cQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^3.0.0", + "@csstools/css-color-parser": "^4.0.1", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0", + "lru-cache": "^11.2.5" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.8.1.tgz", + "integrity": "sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.1.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.2.6" + } + }, + "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@clack/core": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.5.0.tgz", + "integrity": "sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "sisteransi": "^1.0.5" + } + }, + "node_modules/@clack/prompts": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.11.0.tgz", + "integrity": "sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@clack/core": "0.5.0", + "picocolors": "^1.0.0", + "sisteransi": "^1.0.5" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", + "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.1.1.tgz", + "integrity": "sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.0.2.tgz", + "integrity": "sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^6.0.2", + "@csstools/css-calc": "^3.1.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.1.tgz", + "integrity": "sha512-BvqN0AMWNAnLk9G8jnUT77D+mUbY/H2b3uDTvg2isJkHaOufUE2R3AOwxWo7VBQKT1lOdwdvorddo2B/lk64+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@date-fns/tz": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@date-fns/tz/-/tz-1.4.1.tgz", + "integrity": "sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==", + "license": "MIT" + }, + "node_modules/@dprint/formatter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@dprint/formatter/-/formatter-0.5.1.tgz", + "integrity": "sha512-cdZUrm0iv/FnnY3CKE2dEcVhNEzrC551aE2h2mTFwQCRBrqyARLDnb7D+3PlXTUVp3s34ftlnGOVCmhLT9DeKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@dprint/markdown": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@dprint/markdown/-/markdown-0.21.1.tgz", + "integrity": "sha512-XbZ/R7vRrBaZFYXG6vAvLvtaMVXHu8XB+xwie7OYrG+dPoGDP8UADGirIbzUyX8TmrAZcl6QBmalipTGlpzRmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@dprint/toml": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@dprint/toml/-/toml-0.7.0.tgz", + "integrity": "sha512-eFaQTcfxKHB+YyTh83x7GEv+gDPuj9q5NFOTaoj5rZmQTbj6OgjjMxUicmS1R8zYcx8YAq5oA9J3YFa5U6x2gA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emnapi/core": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz", + "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz", + "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.84.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.84.0.tgz", + "integrity": "sha512-0xew1CxOam0gV5OMjh2KjFQZsKL2bByX1+q4j3E73MpYIdyUxcZb/xQct9ccUb+ve5KGUYbCUxyPnYB7RbuP+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.8", + "@typescript-eslint/types": "^8.54.0", + "comment-parser": "1.4.5", + "esquery": "^1.7.0", + "jsdoc-type-pratt-parser": "~7.1.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@es-joy/resolve.exports": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz", + "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@eslint-community/eslint-plugin-eslint-comments": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.7.1.tgz", + "integrity": "sha512-Ql2nJFwA8wUGpILYGOQaT1glPsmvEwE0d+a+l7AALLzQvInqdbXJdx7aSu0DpUX9dB1wMVBMhm99/++S3MdEtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^4.0.0", + "ignore": "^7.0.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint-react/ast": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@eslint-react/ast/-/ast-2.13.0.tgz", + "integrity": "sha512-43+5gmqV3MpatTzKnu/V2i/jXjmepvwhrb9MaGQvnXHQgq9J7/C7VVCCcwp6Rvp2QHAFquAAdvQDSL8IueTpeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/eff": "2.13.0", + "@typescript-eslint/types": "^8.55.0", + "@typescript-eslint/typescript-estree": "^8.55.0", + "@typescript-eslint/utils": "^8.55.0", + "string-ts": "^2.3.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@eslint-react/core": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@eslint-react/core/-/core-2.13.0.tgz", + "integrity": "sha512-m62XDzkf1hpzW4sBc7uh7CT+8rBG2xz/itSADuEntlsg4YA7Jhb8hjU6VHf3wRFDwyfx5VnbV209sbJ7Azey0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "2.13.0", + "@eslint-react/eff": "2.13.0", + "@eslint-react/shared": "2.13.0", + "@eslint-react/var": "2.13.0", + "@typescript-eslint/scope-manager": "^8.55.0", + "@typescript-eslint/types": "^8.55.0", + "@typescript-eslint/utils": "^8.55.0", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@eslint-react/eff": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@eslint-react/eff/-/eff-2.13.0.tgz", + "integrity": "sha512-rEH2R8FQnUAblUW+v3ZHDU1wEhatbL1+U2B1WVuBXwSKqzF7BGaLqCPIU7o9vofumz5MerVfaCtJgI8jYe2Btg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@eslint-react/eslint-plugin": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@eslint-react/eslint-plugin/-/eslint-plugin-2.13.0.tgz", + "integrity": "sha512-iaMXpqnJCTW7317hg8L4wx7u5aIiPzZ+d1p59X8wXFgMHzFX4hNu4IfV8oygyjmWKdLsjKE9sEpv/UYWczlb+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/eff": "2.13.0", + "@eslint-react/shared": "2.13.0", + "@typescript-eslint/scope-manager": "^8.55.0", + "@typescript-eslint/type-utils": "^8.55.0", + "@typescript-eslint/types": "^8.55.0", + "@typescript-eslint/utils": "^8.55.0", + "eslint-plugin-react-dom": "2.13.0", + "eslint-plugin-react-hooks-extra": "2.13.0", + "eslint-plugin-react-naming-convention": "2.13.0", + "eslint-plugin-react-rsc": "2.13.0", + "eslint-plugin-react-web-api": "2.13.0", + "eslint-plugin-react-x": "2.13.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@eslint-react/shared": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@eslint-react/shared/-/shared-2.13.0.tgz", + "integrity": "sha512-IOloCqrZ7gGBT4lFf9+0/wn7TfzU7JBRjYwTSyb9SDngsbeRrtW95ZpgUpS8/jen1wUEm6F08duAooTZ2FtsWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/eff": "2.13.0", + "@typescript-eslint/utils": "^8.55.0", + "ts-pattern": "^5.9.0", + "zod": "^3.25.0 || ^4.0.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@eslint-react/var": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@eslint-react/var/-/var-2.13.0.tgz", + "integrity": "sha512-dM+QaeiHR16qPQoJYg205MkdHYSWVa2B7ore5OFpOPlSwqDV3tLW7I+475WjbK7potq5QNPTxRa7VLp9FGeQqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "2.13.0", + "@eslint-react/eff": "2.13.0", + "@eslint-react/shared": "2.13.0", + "@typescript-eslint/scope-manager": "^8.55.0", + "@typescript-eslint/types": "^8.55.0", + "@typescript-eslint/utils": "^8.55.0", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@eslint/compat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-2.0.3.tgz", + "integrity": "sha512-SjIJhGigp8hmd1YGIBwh7Ovri7Kisl42GYFjrOyHhtfYGGoLW6teYi/5p8W50KSsawUPpuLOSmsq1bD0NGQLBw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.1.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "peerDependencies": { + "eslint": "^8.40 || 9 || 10" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/compat/node_modules/@eslint/core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz", + "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/markdown": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-7.5.1.tgz", + "integrity": "sha512-R8uZemG9dKTbru/DQRPblbJyXpObwKzo8rv1KYGGuPUPtjM4LXBYM9q5CIZAComzZupws3tWbDwam5AFpPLyJQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "examples/*" + ], + "dependencies": { + "@eslint/core": "^0.17.0", + "@eslint/plugin-kit": "^0.4.1", + "github-slugger": "^2.0.0", + "mdast-util-from-markdown": "^2.0.2", + "mdast-util-frontmatter": "^2.0.1", + "mdast-util-gfm": "^3.1.0", + "micromark-extension-frontmatter": "^2.0.0", + "micromark-extension-gfm": "^3.0.0", + "micromark-util-normalize-identifier": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@exodus/bytes": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", + "integrity": "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.27.19", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.19.tgz", + "integrity": "sha512-31B8h5mm8YxotlE7/AU/PhNAl8eWxAmjL/v2QOxroDNkTFLk3Uu82u63N3b6TXa4EGJeeZLVcd/9AlNlVqzeog==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.1.8", + "@floating-ui/utils": "^0.2.11", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", + "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.6" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@next/env": { + "version": "15.5.8", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.8.tgz", + "integrity": "sha512-ejZHa3ogTxcy851dFoNtfB5B2h7AbSAtHbR5CymUlnz4yW1QjHNufVpvTu8PTnWBKFKjrd4k6Gbi2SsCiJKvxw==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.5.12.tgz", + "integrity": "sha512-+ZRSDFTv4aC96aMb5E41rMjysx8ApkryevnvEYZvPZO52KvkqP5rNExLUXJFr9P4s0f3oqNQR6vopCZsPWKDcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.7.tgz", + "integrity": "sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.7.tgz", + "integrity": "sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.7.tgz", + "integrity": "sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.7.tgz", + "integrity": "sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.7.tgz", + "integrity": "sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.7.tgz", + "integrity": "sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.7.tgz", + "integrity": "sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.7.tgz", + "integrity": "sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@oxc-project/runtime": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.115.0.tgz", + "integrity": "sha512-Rg8Wlt5dCbXhQnsXPrkOjL1DTSvXLgb2R/KYfnf1/K+R0k6UMLEmbQXPM+kwrWqSmWA2t0B1EtHy2/3zikQpvQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.115.0.tgz", + "integrity": "sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@oxfmt/binding-android-arm-eabi": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.35.0.tgz", + "integrity": "sha512-BaRKlM3DyG81y/xWTsE6gZiv89F/3pHe2BqX2H4JbiB8HNVlWWtplzgATAE5IDSdwChdeuWLDTQzJ92Lglw3ZA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-android-arm64": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.35.0.tgz", + "integrity": "sha512-/O+EbuAJYs6nde/anv+aID6uHsGQApyE9JtYBo/79KyU8e6RBN3DMbT0ix97y1SOnCglurmL2iZ+hlohjP2PnQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-darwin-arm64": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.35.0.tgz", + "integrity": "sha512-pGqRtqlNdn9d4VrmGUWVyQjkw79ryhI6je9y2jfqNUIZCfqceob+R97YYAoG7C5TFyt8ILdLVoN+L2vw/hSFyA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-darwin-x64": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.35.0.tgz", + "integrity": "sha512-8GmsDcSozTPjrCJeGpp+sCmS9+9V5yRrdEZ1p/sTWxPG5nYeAfSLuS0nuEYjXSO+CtdSbStIW6dxa+4NM58yRw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-freebsd-x64": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.35.0.tgz", + "integrity": "sha512-QyfKfTe0ytHpFKHAcHCGQEzN45QSqq1AHJOYYxQMgLM3KY4xu8OsXHpCnINjDsV4XGnQzczJDU9e04Zmd8XqIQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm-gnueabihf": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.35.0.tgz", + "integrity": "sha512-u+kv3JD6P3J38oOyUaiCqgY5TNESzBRZJ5lyZQ6c2czUW2v5SIN9E/KWWa9vxoc+P8AFXQFUVrdzGy1tK+nbPQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm-musleabihf": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.35.0.tgz", + "integrity": "sha512-1NiZroCiV57I7Pf8kOH4XGR366kW5zir3VfSMBU2D0V14GpYjiYmPYFAoJboZvp8ACnZKUReWyMkNKSa5ad58A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm64-gnu": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.35.0.tgz", + "integrity": "sha512-7Q0Xeg7ZnW2nxnZ4R7aF6DEbCFls4skgHZg+I63XitpNvJCbVIU8MFOTZlvZGRsY9+rPgWPQGeUpLHlyx0wvMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm64-musl": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.35.0.tgz", + "integrity": "sha512-5Okqi+uhYFxwKz8hcnUftNNwdm8BCkf6GSCbcz9xJxYMm87k1E4p7PEmAAbhLTk7cjSdDre6TDL0pDzNX+Y22Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-ppc64-gnu": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.35.0.tgz", + "integrity": "sha512-9k66pbZQXM/lBJWys3Xbc5yhl4JexyfqkEf/tvtq8976VIJnLAAL3M127xHA3ifYSqxdVHfVGTg84eiBHCGcNw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-riscv64-gnu": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.35.0.tgz", + "integrity": "sha512-aUcY9ofKPtjO52idT6t0SAQvEF6ctjzUQa1lLp7GDsRpSBvuTrBQGeq0rYKz3gN8dMIQ7mtMdGD9tT4LhR8jAQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-riscv64-musl": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.35.0.tgz", + "integrity": "sha512-C6yhY5Hvc2sGM+mCPek9ZLe5xRUOC/BvhAt2qIWFAeXMn4il04EYIjl3DsWiJr0xDMTJhvMOmD55xTRPlNp39w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-s390x-gnu": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.35.0.tgz", + "integrity": "sha512-RG2hlvOMK4OMZpO3mt8MpxLQ0AAezlFqhn5mI/g5YrVbPFyoCv9a34AAvbSJS501ocOxlFIRcKEuw5hFvddf9g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-x64-gnu": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.35.0.tgz", + "integrity": "sha512-wzmh90Pwvqj9xOKHJjkQYBpydRkaXG77ZvDz+iFDRRQpnqIEqGm5gmim2s6vnZIkDGsvKCuTdtxm0GFmBjM1+w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-x64-musl": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.35.0.tgz", + "integrity": "sha512-+HCqYCJPCUy5I+b2cf+gUVaApfgtoQT3HdnSg/l7NIcLHOhKstlYaGyrFZLmUpQt4WkFbpGKZZayG6zjRU0KFA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-openharmony-arm64": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.35.0.tgz", + "integrity": "sha512-kFYmWfR9YL78XyO5ws+1dsxNvZoD973qfVMNFOS4e9bcHXGF7DvGC2tY5UDFwyMCeB33t3sDIuGONKggnVNSJA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-arm64-msvc": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.35.0.tgz", + "integrity": "sha512-uD/NGdM65eKNCDGyTGdO8e9n3IHX+wwuorBvEYrPJXhDXL9qz6gzddmXH8EN04ejUXUujlq4FsoSeCfbg0Y+Jg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-ia32-msvc": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.35.0.tgz", + "integrity": "sha512-oSRD2k8J2uxYDEKR2nAE/YTY9PobOEnhZgCmspHu0+yBQ665yH8lFErQVSTE7fcGJmJp/cC6322/gc8VFuQf7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-x64-msvc": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.35.0.tgz", + "integrity": "sha512-WCDJjlS95NboR0ugI2BEwzt1tYvRDorDRM9Lvctls1SLyKYuNRCyrPwp1urUPFBnwgBNn9p2/gnmo7gFMySRoQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", + "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", + "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", + "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-icons": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.2.tgz", + "integrity": "sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==", + "license": "MIT", + "peerDependencies": { + "react": "^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.8.tgz", + "integrity": "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", + "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz", + "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", + "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", + "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", + "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.8.tgz", + "integrity": "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", + "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", + "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", + "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-lcJL0bN5hpgJfSIz/8PIf02irmyL43P+j1pTCfbD1DbLkmGRuFIA4DD3B3ZOvGqG0XiVvRznbKtN0COQVaKUTg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.9.tgz", + "integrity": "sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.9.tgz", + "integrity": "sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.9.tgz", + "integrity": "sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.9.tgz", + "integrity": "sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-cVEl1vZtBsBZna3YMjGXNvnYYrOJ7RzuWvZU0ffvJUexWkukMaDuGhUXn0rjnV0ptzGVkvc+vW9Yqy6h8YX4pg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.9.tgz", + "integrity": "sha512-UzYnKCIIc4heAKgI4PZ3dfBGUZefGCJ1TPDuLHoCzgrMYPb5Rv6TLFuYtyM4rWyHM7hymNdsg5ik2C+UD9VDbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.9.tgz", + "integrity": "sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.9.tgz", + "integrity": "sha512-lHVNUG/8nlF1IQk1C0Ci574qKYyty2goMiPlRqkC5R+3LkXDkL5Dhx8ytbxq35m+pkHVIvIxviD+TWLdfeuadA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.9.tgz", + "integrity": "sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", + "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.16.1.tgz", + "integrity": "sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/base62": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz", + "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "node_modules/@stylistic/eslint-plugin": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/types": "^8.56.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.0.0 || ^10.0.0" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tabby_ai/hijri-converter": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@tabby_ai/hijri-converter/-/hijri-converter-1.0.5.tgz", + "integrity": "sha512-r5bClKrcIusDoo049dSL8CawnHR6mRdDwhlQuIgZRNty68q0x8k3Lf1BtPAMxRf/GgnHBnIO4ujd3+GQdLWzxQ==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@tanstack/eslint-plugin-query": { + "version": "5.91.4", + "resolved": "https://registry.npmjs.org/@tanstack/eslint-plugin-query/-/eslint-plugin-query-5.91.4.tgz", + "integrity": "sha512-8a+GAeR7oxJ5laNyYBQ6miPK09Hi18o5Oie/jx8zioXODv/AUFLZQecKabPdpQSLmuDXEBPKFh+W5DKbWlahjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.48.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.90.20", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.20.tgz", + "integrity": "sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.90.21", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.21.tgz", + "integrity": "sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.90.20" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/prismjs": { + "version": "1.26.6", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz", + "integrity": "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "name": "types-react", + "version": "19.0.0-rc.1", + "resolved": "https://registry.npmjs.org/types-react/-/types-react-19.0.0-rc.1.tgz", + "integrity": "sha512-RshndUfqTW6K3STLPis8BtAYCGOkMbtvYsi90gmVNDZBXUyUc5juf2PE9LfS/JmOlUIRO8cWTS/1MTnmhjDqyQ==", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "name": "types-react-dom", + "version": "19.0.0-rc.1", + "resolved": "https://registry.npmjs.org/types-react-dom/-/types-react-dom-19.0.0-rc.1.tgz", + "integrity": "sha512-VSLZJl8VXCD0fAWp7DUTFUDCcZ8DVXOQmjhJMD03odgeFmu14ZQJHCXeETm3BEAhJqfgJaFkLnGkQv88sRx0fQ==", + "devOptional": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-syntax-highlighter": { + "version": "15.5.13", + "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.13.tgz", + "integrity": "sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/stylis": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.7.tgz", + "integrity": "sha512-VgDNokpBoKF+wrdvhAAfS55OMQpL6QRglwTwNC3kIgBrzZxA4WsFj+2eLfEA/uMUDzBcEhYmjSbwQakn/i3ajA==", + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.0.tgz", + "integrity": "sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/type-utils": "8.57.0", + "@typescript-eslint/utils": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.57.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.0.tgz", + "integrity": "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.0.tgz", + "integrity": "sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.57.0", + "@typescript-eslint/types": "^8.57.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/rule-tester": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/rule-tester/-/rule-tester-8.57.0.tgz", + "integrity": "sha512-qs4OapXmAIj3so85/20lQG1WrBSSvDE/3b42Orl3lpZkaOlNXtbfKzL+9EPaY5wSEgdlhKEpympAMFHPG9i72Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/parser": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/utils": "8.57.0", + "ajv": "^6.12.6", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "4.6.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.0.tgz", + "integrity": "sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.0.tgz", + "integrity": "sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.0.tgz", + "integrity": "sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/utils": "8.57.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.0.tgz", + "integrity": "sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.0.tgz", + "integrity": "sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.57.0", + "@typescript-eslint/tsconfig-utils": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.0.tgz", + "integrity": "sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.0.tgz", + "integrity": "sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz", + "integrity": "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@vitest/eslint-plugin": { + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.6.12.tgz", + "integrity": "sha512-4kI47BJNFE+EQ5bmPbHzBF+ibNzx2Fj0Jo9xhWsTPxMddlHwIWl6YAxagefh461hrwx/W0QwBZpxGS404kBXyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "^8.55.0", + "@typescript-eslint/utils": "^8.55.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": ">=8.57.0", + "typescript": ">=5.0.0", + "vitest": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.30.tgz", + "integrity": "sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.30", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.30.tgz", + "integrity": "sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-core": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.30.tgz", + "integrity": "sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.30", + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.30.tgz", + "integrity": "sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.30.tgz", + "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz", + "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", + "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.8", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.8.tgz", + "integrity": "sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/birecord": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/birecord/-/birecord-0.1.1.tgz", + "integrity": "sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==", + "dev": true, + "license": "(MIT OR Apache-2.0)" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/builtin-modules": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.0.0.tgz", + "integrity": "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001779", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001779.tgz", + "integrity": "sha512-U5og2PN7V4DMgF50YPNtnZJGWVLFjjsN3zb6uMT5VGYIewieDj1upwfuVNXf4Kor+89c3iCRJnSzMD5LmTvsfA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chart.js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", + "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", + "license": "MIT", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "node_modules/chartjs-plugin-datalabels": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chartjs-plugin-datalabels/-/chartjs-plugin-datalabels-2.2.0.tgz", + "integrity": "sha512-14ZU30lH7n89oq+A4bWaJPnAG8a7ZTk7dKf48YAzMvJjQtjrgg5Dpk9f+LbjCF6bpx3RAGTeL13IXpKQYyRvlw==", + "license": "MIT", + "peerDependencies": { + "chart.js": ">=3.0.0" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clean-regexp/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cmdk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", + "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-id": "^1.1.0", + "@radix-ui/react-primitive": "^2.0.2" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/comment-parser": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.5.tgz", + "integrity": "sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-js-compat": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", + "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssstyle": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.7.tgz", + "integrity": "sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^4.1.1", + "@csstools/css-syntax-patches-for-csstree": "^1.0.21", + "css-tree": "^3.1.0", + "lru-cache": "^11.2.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cssstyle/node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-urls": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-6.0.1.tgz", + "integrity": "sha512-euIQENZg6x8mj3fO6o9+fOW8MimUI4PpD/fZBhJfeioZVy9TUpM4UY7KjQNVZFlqwJ0UdzRDzkycB997HEq1BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^15.1.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/data-urls/node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/date-fns-jalali": { + "version": "4.1.0-0", + "resolved": "https://registry.npmjs.org/date-fns-jalali/-/date-fns-jalali-4.1.0-0.tgz", + "integrity": "sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.313", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz", + "integrity": "sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/empathic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", + "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", + "integrity": "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.1.tgz", + "integrity": "sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.1", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-toolkit": { + "version": "1.45.1", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.45.1.tgz", + "integrity": "sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz", + "integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-config-flat-gitignore": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-flat-gitignore/-/eslint-config-flat-gitignore-2.2.1.tgz", + "integrity": "sha512-wA5EqN0era7/7Gt5Botlsfin/UNY0etJSEeBgbUlFLFrBi47rAN//+39fI7fpYcl8RENutlFtvp/zRa/M/pZNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint/compat": "^2.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "eslint": "^9.5.0 || ^10.0.0" + } + }, + "node_modules/eslint-config-next": { + "version": "15.5.8", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.5.8.tgz", + "integrity": "sha512-FU2nFCVYt3z60EH8upds4frThuIAiSt81zUtQI/9fIc25VVVT3yaKsFwGIY6BIDT/I0X/Dam+RR7xzTRZMyArQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "15.5.8", + "@rushstack/eslint-patch": "^1.10.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^5.0.0" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/@next/eslint-plugin-next": { + "version": "15.5.8", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.5.8.tgz", + "integrity": "sha512-PBv6j6YxyC9cFgZKSGFlFydQ+lzzR3Fs1GBr9Z2YzoZK7dH/K8ebRtZiN4pV+b8MbSJiHjZYTKVPKF/UzNgrOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-flat-config-utils": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/eslint-flat-config-utils/-/eslint-flat-config-utils-2.1.4.tgz", + "integrity": "sha512-bEnmU5gqzS+4O+id9vrbP43vByjF+8KOs+QuuV4OlqAuXmnRW2zfI/Rza1fQvdihQ5h4DUo0NqFAiViD4mSrzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/eslint-formatting-reporter": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/eslint-formatting-reporter/-/eslint-formatting-reporter-0.0.0.tgz", + "integrity": "sha512-k9RdyTqxqN/wNYVaTk/ds5B5rA8lgoAmvceYN7bcZMBwU7TuXx5ntewJv81eF3pIL/CiJE+pJZm36llG8yhyyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-json-compat-utils": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/eslint-json-compat-utils/-/eslint-json-compat-utils-0.2.3.tgz", + "integrity": "sha512-RbBmDFyu7FqnjE8F0ZxPNzx5UaptdeS9Uu50r7A+D7s/+FCX+ybiyViYEgFUaFIFqSWJgZRTpL5d8Kanxxl2lQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esquery": "^1.6.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": "*", + "jsonc-eslint-parser": "^2.4.0 || ^3.0.0" + }, + "peerDependenciesMeta": { + "@eslint/json": { + "optional": true + } + } + }, + "node_modules/eslint-merge-processors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-merge-processors/-/eslint-merge-processors-2.0.0.tgz", + "integrity": "sha512-sUuhSf3IrJdGooquEUB5TNpGNpBoQccbnaLHsb1XkBLUPPqCNivCpY05ZcpCOiV9uHwO2yxXEWVczVclzMxYlA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-parser-plain": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eslint-parser-plain/-/eslint-parser-plain-0.1.1.tgz", + "integrity": "sha512-KRgd6wuxH4U8kczqPp+Oyk4irThIhHWxgFgLDtpgjUGVIS3wGrJntvZW/p6hHq1T4FOwnOtCNkvAI4Kr+mQ/Hw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-antfu": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-antfu/-/eslint-plugin-antfu-3.2.2.tgz", + "integrity": "sha512-Qzixht2Dmd/pMbb5EnKqw2V8TiWHbotPlsORO8a+IzCLFwE0RxK8a9k4DCTFPzBwyxJzH+0m2Mn8IUGeGQkyUw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/eslint-plugin-command": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-command/-/eslint-plugin-command-3.5.2.tgz", + "integrity": "sha512-PA59QAkQDwvcCMEt5lYLJLI3zDGVKJeC4id/pcRY2XdRYhSGW7iyYT1VC1N3bmpuvu6Qb/9QptiS3GJMjeGTJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@es-joy/jsdoccomment": "^0.84.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@typescript-eslint/rule-tester": "*", + "@typescript-eslint/typescript-estree": "*", + "@typescript-eslint/utils": "*", + "eslint": "*" + } + }, + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, + "node_modules/eslint-plugin-es-x/node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-format": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-format/-/eslint-plugin-format-1.5.0.tgz", + "integrity": "sha512-jaeOKrxs79Nn6rMkLycPkLHvBVKcgsFG+RqNXb6W9iS9y2Q0NYGhFTLcDUdp5mf01X99wEkjtX2O8cumM7lNMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@dprint/formatter": "^0.5.1", + "@dprint/markdown": "^0.21.1", + "@dprint/toml": "^0.7.0", + "eslint-formatting-reporter": "^0.0.0", + "eslint-parser-plain": "^0.1.1", + "ohash": "^2.0.11", + "oxfmt": "^0.35.0", + "prettier": "^3.8.1", + "synckit": "^0.11.12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "eslint": "^8.40.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import-lite": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-lite/-/eslint-plugin-import-lite-0.4.0.tgz", + "integrity": "sha512-My0ReAg8WbHXYECIHVJkWB8UxrinZn3m72yonOYH6MFj40ZN1vHYQj16iq2Fd8Wrt/vRZJwDX2xm/BzDk1FzTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0", + "typescript": ">=4.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-import/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "61.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.7.1.tgz", + "integrity": "sha512-36DpldF95MlTX//n3/naULFVt8d1cV4jmSkx7ZKrE9ikkKHAgMLesuWp1SmwpVwAs5ndIM6abKd6PeOYZUgdWg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@es-joy/jsdoccomment": "~0.78.0", + "@es-joy/resolve.exports": "1.2.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.4.3", + "escape-string-regexp": "^4.0.0", + "espree": "^11.0.0", + "esquery": "^1.7.0", + "html-entities": "^2.6.0", + "object-deep-merge": "^2.0.0", + "parse-imports-exports": "^0.2.4", + "semver": "^7.7.3", + "spdx-expression-parse": "^4.0.0", + "to-valid-identifier": "^1.0.0" + }, + "engines": { + "node": ">=20.11.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/@es-joy/jsdoccomment": { + "version": "0.78.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.78.0.tgz", + "integrity": "sha512-rQkU5u8hNAq2NVRzHnIUUvR6arbO0b6AOlvpTNS48CkiKSn/xtNfOzBK23JE4SiW89DgvU7GtxLVgV4Vn2HBAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.8", + "@typescript-eslint/types": "^8.46.4", + "comment-parser": "1.4.1", + "esquery": "^1.6.0", + "jsdoc-type-pratt-parser": "~7.0.0" + }, + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/jsdoc-type-pratt-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.0.0.tgz", + "integrity": "sha512-c7YbokssPOSHmqTbSAmTtnVgAVa/7lumWNYqomgd5KOMyPrRve2anx6lonfOsXEQacqF9FKVUj7bLg4vRSvdYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/eslint-plugin-jsonc": { + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsonc/-/eslint-plugin-jsonc-2.21.1.tgz", + "integrity": "sha512-dbNR5iEnQeORwsK2WZzr3QaMtFCY3kKJVMRHPzUpKzMhmVy2zIpVgFDpX8MNoIdoqz6KCpCfOJavhfiSbZbN+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.5.1", + "diff-sequences": "^27.5.1", + "eslint-compat-utils": "^0.6.4", + "eslint-json-compat-utils": "^0.2.1", + "espree": "^9.6.1 || ^10.3.0", + "graphemer": "^1.4.0", + "jsonc-eslint-parser": "^2.4.0", + "natural-compare": "^1.4.0", + "synckit": "^0.6.2 || ^0.7.3 || ^0.11.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-n": { + "version": "17.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.24.0.tgz", + "integrity": "sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.5.0", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "globrex": "^0.1.2", + "ignore": "^5.3.2", + "semver": "^7.6.3", + "ts-declaration-location": "^1.0.6" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": ">=8.23.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-n/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-plugin-no-only-tests": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.3.0.tgz", + "integrity": "sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=5.0.0" + } + }, + "node_modules/eslint-plugin-perfectionist": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-4.15.1.tgz", + "integrity": "sha512-MHF0cBoOG0XyBf7G0EAFCuJJu4I18wy0zAoT1OHfx2o6EOx1EFTIzr2HGeuZa1kDcusoX0xJ9V7oZmaeFd773Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "^8.38.0", + "@typescript-eslint/utils": "^8.38.0", + "natural-orderby": "^5.0.0" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "eslint": ">=8.45.0" + } + }, + "node_modules/eslint-plugin-pnpm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-pnpm/-/eslint-plugin-pnpm-1.6.0.tgz", + "integrity": "sha512-dxmt9r3zvPaft6IugS4i0k16xag3fTbOvm/road5uV9Y8qUCQT0xzheSh3gMlYAlC6vXRpfArBDsTZ7H7JKCbg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT", + "dependencies": { + "empathic": "^2.0.0", + "jsonc-eslint-parser": "^3.1.0", + "pathe": "^2.0.3", + "pnpm-workspace-yaml": "1.6.0", + "tinyglobby": "^0.2.15", + "yaml": "^2.8.2", + "yaml-eslint-parser": "^2.0.0" + }, + "peerDependencies": { + "eslint": "^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-pnpm/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-pnpm/node_modules/jsonc-eslint-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-3.1.0.tgz", + "integrity": "sha512-75EA7EWZExL/j+MDKQrRbdzcRI2HOkRlmUw8fZJc1ioqFEOvBsq7Rt+A6yCxOt9w/TYNpkt52gC6nm/g5tFIng==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^5.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/eslint-plugin-pnpm/node_modules/yaml-eslint-parser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-2.0.0.tgz", + "integrity": "sha512-h0uDm97wvT2bokfwwTmY6kJ1hp6YDFL0nRHwNKz8s/VD1FH/vvZjAKoMUE+un0eaYBSG7/c6h+lJTP+31tjgTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^5.0.0", + "yaml": "^2.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-dom": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-dom/-/eslint-plugin-react-dom-2.13.0.tgz", + "integrity": "sha512-+2IZzQ1WEFYOWatW+xvNUqmZn55YBCufzKA7hX3XQ/8eu85Mp4vnlOyNvdVHEOGhUnGuC6+9+zLK+IlEHKdKLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "2.13.0", + "@eslint-react/core": "2.13.0", + "@eslint-react/eff": "2.13.0", + "@eslint-react/shared": "2.13.0", + "@eslint-react/var": "2.13.0", + "@typescript-eslint/scope-manager": "^8.55.0", + "@typescript-eslint/types": "^8.55.0", + "@typescript-eslint/utils": "^8.55.0", + "compare-versions": "^6.1.1", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-hooks-extra": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks-extra/-/eslint-plugin-react-hooks-extra-2.13.0.tgz", + "integrity": "sha512-qIbha1nzuyhXM9SbEfrcGVqmyvQu7GAOB2sy9Y4Qo5S8nCqw4fSBxq+8lSce5Tk5Y7XzIkgHOhNyXEvUHRWFMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "2.13.0", + "@eslint-react/core": "2.13.0", + "@eslint-react/eff": "2.13.0", + "@eslint-react/shared": "2.13.0", + "@eslint-react/var": "2.13.0", + "@typescript-eslint/scope-manager": "^8.55.0", + "@typescript-eslint/type-utils": "^8.55.0", + "@typescript-eslint/types": "^8.55.0", + "@typescript-eslint/utils": "^8.55.0", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-react-naming-convention": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-naming-convention/-/eslint-plugin-react-naming-convention-2.13.0.tgz", + "integrity": "sha512-uSd25JzSg2R4p81s3Wqck0AdwRlO9Yc+cZqTEXv7vW8exGGAM3mWnF6hgrgdqVJqBEGJIbS/Vx1r5BdKcY/MHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "2.13.0", + "@eslint-react/core": "2.13.0", + "@eslint-react/eff": "2.13.0", + "@eslint-react/shared": "2.13.0", + "@eslint-react/var": "2.13.0", + "@typescript-eslint/scope-manager": "^8.55.0", + "@typescript-eslint/type-utils": "^8.55.0", + "@typescript-eslint/types": "^8.55.0", + "@typescript-eslint/utils": "^8.55.0", + "compare-versions": "^6.1.1", + "string-ts": "^2.3.1", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", + "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-plugin-react-rsc": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-rsc/-/eslint-plugin-react-rsc-2.13.0.tgz", + "integrity": "sha512-RaftgITDLQm1zIgYyvR51sBdy4FlVaXFts5VISBaKbSUB0oqXyzOPxMHasfr9BCSjPLKus9zYe+G/Hr6rjFLXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "2.13.0", + "@eslint-react/shared": "2.13.0", + "@eslint-react/var": "2.13.0", + "@typescript-eslint/types": "^8.55.0", + "@typescript-eslint/utils": "^8.55.0", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-react-web-api": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-web-api/-/eslint-plugin-react-web-api-2.13.0.tgz", + "integrity": "sha512-nmJbzIAte7PeAkp22CwcKEASkKi49MshSdiDGO1XuN3f4N4/8sBfDcWbQuLPde6JiuzDT/0+l7Gi8wwTHtR1kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "2.13.0", + "@eslint-react/core": "2.13.0", + "@eslint-react/eff": "2.13.0", + "@eslint-react/shared": "2.13.0", + "@eslint-react/var": "2.13.0", + "@typescript-eslint/scope-manager": "^8.55.0", + "@typescript-eslint/types": "^8.55.0", + "@typescript-eslint/utils": "^8.55.0", + "birecord": "^0.1.1", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-react-x": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-x/-/eslint-plugin-react-x-2.13.0.tgz", + "integrity": "sha512-cMNX0+ws/fWTgVxn52qAQbaFF2rqvaDAtjrPUzY6XOzPjY0rJQdR2tSlWJttz43r2yBfqu+LGvHlGpWL2wfpTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "2.13.0", + "@eslint-react/core": "2.13.0", + "@eslint-react/eff": "2.13.0", + "@eslint-react/shared": "2.13.0", + "@eslint-react/var": "2.13.0", + "@typescript-eslint/scope-manager": "^8.55.0", + "@typescript-eslint/type-utils": "^8.55.0", + "@typescript-eslint/types": "^8.55.0", + "@typescript-eslint/utils": "^8.55.0", + "compare-versions": "^6.1.1", + "is-immutable-type": "^5.0.1", + "ts-api-utils": "^2.4.0", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-regexp": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-regexp/-/eslint-plugin-regexp-2.10.0.tgz", + "integrity": "sha512-ovzQT8ESVn5oOe5a7gIDPD5v9bCSjIFJu57sVPDqgPRXicQzOnYfFN21WoQBQF18vrhT5o7UMKFwJQVVjyJ0ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "comment-parser": "^1.4.0", + "jsdoc-type-pratt-parser": "^4.0.0", + "refa": "^0.12.1", + "regexp-ast-analysis": "^0.7.1", + "scslre": "^0.3.0" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "eslint": ">=8.44.0" + } + }, + "node_modules/eslint-plugin-regexp/node_modules/jsdoc-type-pratt-parser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.8.0.tgz", + "integrity": "sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/eslint-plugin-toml": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-toml/-/eslint-plugin-toml-0.12.0.tgz", + "integrity": "sha512-+/wVObA9DVhwZB1nG83D2OAQRrcQZXy+drqUnFJKymqnmbnbfg/UPmEMCKrJNcEboUGxUjYrJlgy+/Y930mURQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "eslint-compat-utils": "^0.6.0", + "lodash": "^4.17.19", + "toml-eslint-parser": "^0.10.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-unicorn": { + "version": "62.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-62.0.0.tgz", + "integrity": "sha512-HIlIkGLkvf29YEiS/ImuDZQbP12gWyx5i3C6XrRxMvVdqMroCI9qoVYCoIl17ChN+U89pn9sVwLxhIWj5nEc7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "@eslint-community/eslint-utils": "^4.9.0", + "@eslint/plugin-kit": "^0.4.0", + "change-case": "^5.4.4", + "ci-info": "^4.3.1", + "clean-regexp": "^1.0.0", + "core-js-compat": "^3.46.0", + "esquery": "^1.6.0", + "find-up-simple": "^1.0.1", + "globals": "^16.4.0", + "indent-string": "^5.0.0", + "is-builtin-module": "^5.0.0", + "jsesc": "^3.1.0", + "pluralize": "^8.0.0", + "regexp-tree": "^0.1.27", + "regjsparser": "^0.13.0", + "semver": "^7.7.3", + "strip-indent": "^4.1.1" + }, + "engines": { + "node": "^20.10.0 || >=21.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=9.38.0" + } + }, + "node_modules/eslint-plugin-unused-imports": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.4.1.tgz", + "integrity": "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", + "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vue": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.8.0.tgz", + "integrity": "sha512-f1J/tcbnrpgC8suPN5AtdJ5MQjuXbSU9pGRSSYAuF3SHoiYCOdEX6O22pLaRyLHXvDcOe+O5ENgc1owQ587agA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^7.1.0", + "semver": "^7.6.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "vue-eslint-parser": "^10.0.0" + }, + "peerDependenciesMeta": { + "@stylistic/eslint-plugin": { + "optional": true + }, + "@typescript-eslint/parser": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-yml": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.19.1.tgz", + "integrity": "sha512-bYkOxyEiXh9WxUhVYPELdSHxGG5pOjCSeJOVkfdIyj6tuiHDxrES2WAW1dBxn3iaZQey57XflwLtCYRcNPOiOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.2", + "diff-sequences": "^27.5.1", + "escape-string-regexp": "4.0.0", + "eslint-compat-utils": "^0.6.0", + "natural-compare": "^1.4.0", + "yaml-eslint-parser": "^1.2.1" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-processor-vue-blocks": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-processor-vue-blocks/-/eslint-processor-vue-blocks-2.0.0.tgz", + "integrity": "sha512-u4W0CJwGoWY3bjXAuFpc/b6eK3NQEI8MoeW7ritKj3G3z/WtHrKjkqf+wk8mPEy5rlMGS+k6AZYOw2XBoN/02Q==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/compiler-sfc": "^3.3.0", + "eslint": ">=9.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.1.tgz", + "integrity": "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/framer-motion": { + "version": "12.36.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.36.0.tgz", + "integrity": "sha512-4PqYHAT7gev0ke0wos+PyrcFxI0HScjm3asgU8nSYa8YzJFuwgIvdj3/s3ZaxLq0bUSboIn19A2WS/MHwLCvfw==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.36.0", + "motion-utils": "^12.36.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuse.js": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz", + "integrity": "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", + "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "dev": true, + "license": "ISC" + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/highlightjs-vue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz", + "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==", + "license": "CC0-1.0" + }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", + "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-builtin-module": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz", + "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "builtin-modules": "^5.0.0" + }, + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-immutable-type": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/is-immutable-type/-/is-immutable-type-5.0.1.tgz", + "integrity": "sha512-LkHEOGVZZXxGl8vDs+10k3DvP++SEoYEAJLRk6buTFi6kD7QekThV7xHS0j6gpnUCQ0zpud/gMDGiV4dQneLTg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@typescript-eslint/type-utils": "^8.0.0", + "ts-api-utils": "^2.0.0", + "ts-declaration-location": "^1.0.4" + }, + "peerDependencies": { + "eslint": "*", + "typescript": ">=4.7.4" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.1.1.tgz", + "integrity": "sha512-/2uqY7x6bsrpi3i9LVU6J89352C0rpMk0as8trXxCtvd4kPk1ke/Eyif6wqfSLvoNJqcDG9Vk4UsXgygzCt2xA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/jsdom": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.4.0.tgz", + "integrity": "sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@acemir/cssom": "^0.9.28", + "@asamuzakjp/dom-selector": "^6.7.6", + "@exodus/bytes": "^1.6.0", + "cssstyle": "^5.3.4", + "data-urls": "^6.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "parse5": "^8.0.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.0", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^15.1.0", + "ws": "^8.18.3", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.2.tgz", + "integrity": "sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "peer": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "license": "MIT", + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lowlight/node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.561.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.561.0.tgz", + "integrity": "sha512-Y59gMY38tl4/i0qewcqohPdEbieBy7SovpBL9IFebhc2mDd8x4PZSOsiFRkpPcOq6bj1r/mjH/Rk73gSlIJP2A==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "dev": true, + "license": "MIT", + "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-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "license": "MIT", + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mlly": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.1.tgz", + "integrity": "sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/motion": { + "version": "12.36.0", + "resolved": "https://registry.npmjs.org/motion/-/motion-12.36.0.tgz", + "integrity": "sha512-5BMQuktYUX8aEByKWYx5tR4X3G08H2OMgp46wTxZ4o7CDDstyy4A0fe9RLNMjZiwvntCWGDvs16sC87/emz4Yw==", + "license": "MIT", + "dependencies": { + "framer-motion": "^12.36.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/motion-dom": { + "version": "12.36.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.36.0.tgz", + "integrity": "sha512-Ep1pq8P88rGJ75om8lTCA13zqd7ywPGwCqwuWwin6BKc0hMLkVfcS6qKlRqEo2+t0DwoUcgGJfXwaiFn4AOcQA==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.36.0" + } + }, + "node_modules/motion-utils": { + "version": "12.36.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.36.0.tgz", + "integrity": "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-orderby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-5.0.0.tgz", + "integrity": "sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/next": { + "version": "15.5.8", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.8.tgz", + "integrity": "sha512-Tma2R50eiM7Fx6fbDeHiThq7sPgl06mBr76j6Ga0lMFGrmaLitFsy31kykgb8Z++DR2uIEKi2RZ0iyjIwFd15Q==", + "deprecated": "This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details.", + "license": "MIT", + "dependencies": { + "@next/env": "15.5.8", + "@swc/helpers": "0.5.15", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.5.7", + "@next/swc-darwin-x64": "15.5.7", + "@next/swc-linux-arm64-gnu": "15.5.7", + "@next/swc-linux-arm64-musl": "15.5.7", + "@next/swc-linux-x64-gnu": "15.5.7", + "@next/swc-linux-x64-musl": "15.5.7", + "@next/swc-win32-arm64-msvc": "15.5.7", + "@next/swc-win32-x64-msvc": "15.5.7", + "sharp": "^0.34.3" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nuqs": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/nuqs/-/nuqs-2.8.9.tgz", + "integrity": "sha512-8ou6AEwsxMWSYo2qkfZtYFVzngwbKmg4c00HVxC1fF6CEJv3Fwm6eoZmfVPALB+vw8Udo7KL5uy96PFcYe1BIQ==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/franky47" + }, + "peerDependencies": { + "@remix-run/react": ">=2", + "@tanstack/react-router": "^1", + "next": ">=14.2.0", + "react": ">=18.2.0 || ^19.0.0-0", + "react-router": "^5 || ^6 || ^7", + "react-router-dom": "^5 || ^6 || ^7" + }, + "peerDependenciesMeta": { + "@remix-run/react": { + "optional": true + }, + "@tanstack/react-router": { + "optional": true + }, + "next": { + "optional": true + }, + "react-router": { + "optional": true + }, + "react-router-dom": { + "optional": true + } + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-deep-merge": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz", + "integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/oxfmt": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.35.0.tgz", + "integrity": "sha512-QYeXWkP+aLt7utt5SLivNIk09glWx9QE235ODjgcEZ3sd1VMaUBSpLymh6ZRCA76gD2rMP4bXanUz/fx+nLM9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinypool": "2.1.0" + }, + "bin": { + "oxfmt": "bin/oxfmt" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxfmt/binding-android-arm-eabi": "0.35.0", + "@oxfmt/binding-android-arm64": "0.35.0", + "@oxfmt/binding-darwin-arm64": "0.35.0", + "@oxfmt/binding-darwin-x64": "0.35.0", + "@oxfmt/binding-freebsd-x64": "0.35.0", + "@oxfmt/binding-linux-arm-gnueabihf": "0.35.0", + "@oxfmt/binding-linux-arm-musleabihf": "0.35.0", + "@oxfmt/binding-linux-arm64-gnu": "0.35.0", + "@oxfmt/binding-linux-arm64-musl": "0.35.0", + "@oxfmt/binding-linux-ppc64-gnu": "0.35.0", + "@oxfmt/binding-linux-riscv64-gnu": "0.35.0", + "@oxfmt/binding-linux-riscv64-musl": "0.35.0", + "@oxfmt/binding-linux-s390x-gnu": "0.35.0", + "@oxfmt/binding-linux-x64-gnu": "0.35.0", + "@oxfmt/binding-linux-x64-musl": "0.35.0", + "@oxfmt/binding-openharmony-arm64": "0.35.0", + "@oxfmt/binding-win32-arm64-msvc": "0.35.0", + "@oxfmt/binding-win32-ia32-msvc": "0.35.0", + "@oxfmt/binding-win32-x64-msvc": "0.35.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "dev": true, + "license": "MIT" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-gitignore": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-gitignore/-/parse-gitignore-2.0.0.tgz", + "integrity": "sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/parse-imports-exports": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", + "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-statements": "1.0.11" + } + }, + "node_modules/parse-statements": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", + "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pnpm-workspace-yaml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pnpm-workspace-yaml/-/pnpm-workspace-yaml-1.6.0.tgz", + "integrity": "sha512-uUy4dK3E11sp7nK+hnT7uAWfkBMe00KaUw8OG3NuNlYQoTk4sc9pcdIy1+XIP85v9Tvr02mK3JPaNNrP0QyRaw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT", + "dependencies": { + "yaml": "^2.8.2" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nested/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", + "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-chartjs-2": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.3.1.tgz", + "integrity": "sha512-h5IPXKg9EXpjoBzUfyWJvllMjG2mQ4EiuHQFhms/AjUm0XSZHhyRy2xVmLXHKrtcdrPO4mnGqRtYoD0vp95A0A==", + "license": "MIT", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-code-blocks": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/react-code-blocks/-/react-code-blocks-0.1.6.tgz", + "integrity": "sha512-ENNuxG07yO+OuX1ChRje3ieefPRz6yrIpHmebQlaFQgzcAHbUfVeTINpOpoI9bSRSObeYo/OdHsporeToZ7fcg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.4", + "react-syntax-highlighter": "^15.5.0", + "styled-components": "^6.1.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "react": ">=16" + } + }, + "node_modules/react-code-blocks/node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/react-code-blocks/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/react-code-blocks/node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/react-code-blocks/node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/react-code-blocks/node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/react-code-blocks/node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/react-code-blocks/node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-code-blocks/node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-code-blocks/node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/react-code-blocks/node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/react-code-blocks/node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/react-code-blocks/node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/react-code-blocks/node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "license": "MIT", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/react-code-blocks/node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react-code-blocks/node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/react-code-blocks/node_modules/react-syntax-highlighter": { + "version": "15.6.6", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.6.tgz", + "integrity": "sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.3.1", + "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", + "lowlight": "^1.17.0", + "prismjs": "^1.30.0", + "refractor": "^3.6.0" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/react-code-blocks/node_modules/refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "license": "MIT", + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/react-code-blocks/node_modules/refractor/node_modules/prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react-code-blocks/node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/react-code-blocks/node_modules/styled-components": { + "version": "6.3.11", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.3.11.tgz", + "integrity": "sha512-opzgceGlQ5rdZdGwf9ddLW7EM2F4L7tgsgLn6fFzQ2JgE5EVQ4HZwNkcgB1p8WfOBx1GEZP3fa66ajJmtXhSrA==", + "license": "MIT", + "dependencies": { + "@emotion/is-prop-valid": "1.4.0", + "@emotion/unitless": "0.10.0", + "@types/stylis": "4.2.7", + "css-to-react-native": "3.2.0", + "csstype": "3.2.3", + "postcss": "8.4.49", + "shallowequal": "1.1.0", + "stylis": "4.3.6", + "tslib": "2.8.1" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-datepicker": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-9.1.0.tgz", + "integrity": "sha512-lOp+m5bc+ttgtB5MHEjwiVu4nlp4CvJLS/PG1OiOe5pmg9kV73pEqO8H0Geqvg2E8gjqTaL9eRhSe+ZpeKP3nA==", + "license": "MIT", + "dependencies": { + "@floating-ui/react": "^0.27.15", + "clsx": "^2.1.1", + "date-fns": "^4.1.0" + }, + "peerDependencies": { + "date-fns-tz": "^3.0.0", + "react": "^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "date-fns-tz": { + "optional": true + } + } + }, + "node_modules/react-day-picker": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-9.14.0.tgz", + "integrity": "sha512-tBaoDWjPwe0M5pGrum4H0SR6Lyk+BO9oHnp9JbKpGKW2mlraNPgP9BMfsg5pWpwrssARmeqk7YBl2oXutZTaHA==", + "license": "MIT", + "dependencies": { + "@date-fns/tz": "^1.4.1", + "@tabby_ai/hijri-converter": "1.0.5", + "date-fns": "^4.1.0", + "date-fns-jalali": "4.1.0-0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/gpbl" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.3" + } + }, + "node_modules/react-icons": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.6.0.tgz", + "integrity": "sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.4.tgz", + "integrity": "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==", + "license": "MIT", + "peer": true + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-syntax-highlighter": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-16.1.1.tgz", + "integrity": "sha512-PjVawBGy80C6YbC5DDZJeUjBmC7skaoEUdvfFQediQHgCL7aKyVHe57SaJGfQsloGDac+gCpTfRdtxzWWKmCXA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", + "lowlight": "^1.17.0", + "prismjs": "^1.30.0", + "refractor": "^5.0.0" + }, + "engines": { + "node": ">= 16.20.2" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/react-use-measure": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz", + "integrity": "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.13", + "react-dom": ">=16.13" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/recharts": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.6.0.tgz", + "integrity": "sha512-L5bjxvQRAe26RlToBAziKUB7whaGKEwD3znoM6fz3DrTowCIC/FnJYnuq1GEzB8Zv2kdTfaxQfi5GoH0tBinyg==", + "license": "MIT", + "workspaces": [ + "www" + ], + "dependencies": { + "@reduxjs/toolkit": "1.x.x || 2.x.x", + "clsx": "^2.1.1", + "decimal.js-light": "^2.5.1", + "es-toolkit": "^1.39.3", + "eventemitter3": "^5.0.1", + "immer": "^10.1.1", + "react-redux": "8.x.x || 9.x.x", + "reselect": "5.1.1", + "tiny-invariant": "^1.3.3", + "use-sync-external-store": "^1.2.2", + "victory-vendor": "^37.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts/node_modules/@reduxjs/toolkit": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz", + "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/recharts/node_modules/@reduxjs/toolkit/node_modules/immer": { + "version": "11.1.4", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.4.tgz", + "integrity": "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/recharts/node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/recharts/node_modules/react-redux": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "node_modules/refa": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/refa/-/refa-0.12.1.tgz", + "integrity": "sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0" + }, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/refractor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-5.0.0.tgz", + "integrity": "sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/prismjs": "^1.0.0", + "hastscript": "^9.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regexp-ast-analysis": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regexp-ast-analysis/-/regexp-ast-analysis-0.7.1.tgz", + "integrity": "sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0", + "refa": "^0.12.1" + }, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, + "node_modules/reserved-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", + "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.9.tgz", + "integrity": "sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@oxc-project/types": "=0.115.0", + "@rolldown/pluginutils": "1.0.0-rc.9" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.9", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.9", + "@rolldown/binding-darwin-x64": "1.0.0-rc.9", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.9", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.9", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.9", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.9", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.9", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.9", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.9", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.9" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.9.tgz", + "integrity": "sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/scslre": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/scslre/-/scslre-0.3.0.tgz", + "integrity": "sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0", + "refa": "^0.12.0", + "regexp-ast-analysis": "^0.7.0" + }, + "engines": { + "node": "^14.0.0 || >=16.0.0" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sonner": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", + "integrity": "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string-ts": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/string-ts/-/string-ts-2.3.1.tgz", + "integrity": "sha512-xSJq+BS52SaFFAVxuStmx6n5aYZU571uYUnUrPXkPFCfdHyZMMlbP2v2Wx5sNBnAVzq/2+0+mcBLBa3Xa5ubYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-indent": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz", + "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/synckit": { + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/tabbable": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", + "license": "MIT" + }, + "node_modules/tailwind-merge": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz", + "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/tailwindcss-animated": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/tailwindcss-animated/-/tailwindcss-animated-1.1.2.tgz", + "integrity": "sha512-SI4owS5ojserhgEYIZA/uFVdNjU2GMB2P3sjtjmFA52VxoUi+Hht6oR5+RdT+CxrX9cNNYEa+vbTWHvN9zbj3w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.1.0" + } + }, + "node_modules/tailwindcss/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "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.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/tailwindcss/node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwindcss/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-2.1.0.tgz", + "integrity": "sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.0.0 || >=22.0.0" + } + }, + "node_modules/tldts": { + "version": "7.0.25", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.25.tgz", + "integrity": "sha512-keinCnPbwXEUG3ilrWQZU+CqcTTzHq9m2HhoUP2l7Xmi8l1LuijAXLpAJ5zRW+ifKTNscs4NdCkfkDCBYm352w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.25" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.25", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.25.tgz", + "integrity": "sha512-ZjCZK0rppSBu7rjHYDYsEaMOIbbT+nWF57hKkv4IUmZWBNrBWBOjIElc0mKRgLM8bm7x/BBlof6t2gi/Oq/Asw==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-valid-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz", + "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/base62": "^1.0.0", + "reserved-identifiers": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/toml-eslint-parser": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/toml-eslint-parser/-/toml-eslint-parser-0.10.1.tgz", + "integrity": "sha512-9mjy3frhioGIVGcwamlVlUyJ9x+WHw/TXiz9R4YOlmsIuBN43r9Dp8HZ35SF9EKjHrn3BUZj04CF+YqZ2oJ+7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/toml-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-declaration-location": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz", + "integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==", + "dev": true, + "funding": [ + { + "type": "ko-fi", + "url": "https://ko-fi.com/rebeccastevens" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/ts-declaration-location" + } + ], + "license": "BSD-3-Clause", + "dependencies": { + "picomatch": "^4.0.2" + }, + "peerDependencies": { + "typescript": ">=4.0.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/ts-pattern": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.9.0.tgz", + "integrity": "sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/victory-vendor": { + "version": "37.3.6", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", + "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/vite": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.0.tgz", + "integrity": "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@oxc-project/runtime": "0.115.0", + "lightningcss": "^1.32.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.9", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.0.0-alpha.31", + "esbuild": "^0.27.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vue-eslint-parser": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.4.0.tgz", + "integrity": "sha512-Vxi9pJdbN3ZnVGLODVtZ7y4Y2kzAAE2Cm0CZ3ZDRvydVYxZ6VrnBhLikBsRS+dpwj4Jv4UCv21PTEwF5rQ9WXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "eslint-scope": "^8.2.0 || ^9.0.0", + "eslint-visitor-keys": "^4.2.0 || ^5.0.0", + "espree": "^10.3.0 || ^11.0.0", + "esquery": "^1.6.0", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz", + "integrity": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yaml-eslint-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.2.tgz", + "integrity": "sha512-odxVsHAkZYYglR30aPYRY4nUGJnoJ2y1ww2HDvZALo0BDETv9kWbi16J52eHs+PWRNmF4ub6nZqfVOeesOvntg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.0.0", + "yaml": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/yaml-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/generator/page.tsx b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/generator/page.tsx new file mode 100644 index 000000000..0879ce10f --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/frontend/src/app/generator/page.tsx @@ -0,0 +1,542 @@ +"use client"; + +import { Suspense, useEffect, useState, useMemo } from "react"; +import { Loader2, Copy, Check, Terminal, Settings2, Server, Cpu, HardDrive, Network, Shield, Play } from "lucide-react"; +import { useQueryState } from "nuqs"; +import Image from "next/image"; +import Link from "next/link"; + +import type { Category, Script } from "@/lib/types"; +import { fetchCategories } from "@/lib/data"; +import { Search } from "@/components/search"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; +import { Badge } from "@/components/ui/badge"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { Switch } from "@/components/ui/switch"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { Textarea } from "@/components/ui/textarea"; +import { basePath } from "@/config/site-config"; +import { + generateInstallCommand, + validateConfig, + getAvailableOS, + getDefaultResources, + getScriptTypeDisplay, + type GeneratorConfig, + DEFAULT_CONFIG, +} from "@/lib/generate-command"; +import { cn } from "@/lib/utils"; + +function GeneratorContent() { + const [categories, setCategories] = useState([]); + const [selectedScript, setSelectedScript] = useState" \ + "" >> "$MOBILE_TPL" +fi +EOF + chmod 755 /usr/local/bin/pve-remove-nag.sh + + cat >/etc/apt/apt.conf.d/no-nag-script <<'EOF' +DPkg::Post-Invoke { "/usr/local/bin/pve-remove-nag.sh"; }; +EOF + chmod 644 /etc/apt/apt.conf.d/no-nag-script + + msg_ok "Disabled subscription nag (Delete browser cache)" + ;; + no) + whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" "Supporting the software's development team is essential. Check their official website's Support Subscriptions for pricing. Without their dedicated work, we wouldn't have this exceptional software." 10 58 + msg_error "Selected no to Disabling subscription nag" + [[ -f /etc/apt/apt.conf.d/no-nag-script ]] && rm /etc/apt/apt.conf.d/no-nag-script + ;; + esac + apt --reinstall install proxmox-widget-toolkit &>/dev/null || msg_error "Widget toolkit reinstall failed" + if ! systemctl is-active --quiet pve-ha-lrm; then + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "HIGH AVAILABILITY" --menu "Enable high availability?" 10 58 2 \ + "yes" " " \ + "no" " " 3>&2 2>&1 1>&3) + case $CHOICE in + yes) + msg_info "Enabling high availability" + systemctl enable -q --now pve-ha-lrm + systemctl enable -q --now pve-ha-crm + systemctl enable -q --now corosync + msg_ok "Enabled high availability" + ;; + no) msg_error "Selected no to Enabling high availability" ;; + esac + fi + + if systemctl is-active --quiet pve-ha-lrm; then + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "HIGH AVAILABILITY" --menu "If you plan to utilize a single node instead of a clustered environment, you can disable unnecessary high availability (HA) services, thus reclaiming system resources.\n\nIf HA becomes necessary at a later stage, the services can be re-enabled.\n\nDisable high availability?" 18 58 2 \ + "yes" " " \ + "no" " " 3>&2 2>&1 1>&3) + case $CHOICE in + yes) + msg_info "Disabling high availability" + systemctl disable -q --now pve-ha-lrm + systemctl disable -q --now pve-ha-crm + msg_ok "Disabled high availability" + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "COROSYNC" --menu "Disable Corosync for a Proxmox VE Cluster?" 10 58 2 \ + "yes" " " \ + "no" " " 3>&2 2>&1 1>&3) + case $CHOICE in + yes) + msg_info "Disabling Corosync" + systemctl disable -q --now corosync + msg_ok "Disabled Corosync" + ;; + no) msg_error "Selected no to Disabling Corosync" ;; + esac + ;; + no) msg_error "Selected no to Disabling high availability" ;; + esac + fi + + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --menu "\nUpdate Proxmox VE now?" 11 58 2 \ + "yes" " " \ + "no" " " 3>&2 2>&1 1>&3) + case $CHOICE in + yes) + msg_info "Updating Proxmox VE (Patience)" + apt update &>/dev/null || msg_error "apt update failed" + apt -y dist-upgrade &>/dev/null || msg_error "apt dist-upgrade failed" + msg_ok "Updated Proxmox VE" + ;; + no) msg_error "Selected no to Updating Proxmox VE" ;; + esac + + # Final message for all hosts in cluster and browser cache + whiptail --backtitle "Proxmox VE Helper Scripts" --title "Post-Install Reminder" --msgbox \ + "IMPORTANT: + +If you have multiple Proxmox VE hosts in a cluster, please make sure to run this script on every node individually. + +After completing these steps, it is strongly recommended to REBOOT your node. + +After the upgrade or post-install routines, always clear your browser cache or perform a hard reload (Ctrl+Shift+R) before using the Proxmox VE Web UI to avoid UI display issues. +" 20 80 + + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "REBOOT" --menu "\nReboot Proxmox VE now? (recommended)" 11 58 2 \ + "yes" " " \ + "no" " " 3>&2 2>&1 1>&3) + case $CHOICE in + yes) + msg_info "Rebooting Proxmox VE" + sleep 2 + msg_ok "Completed Post Install Routines" + reboot + ;; + no) + msg_error "Selected no to Rebooting Proxmox VE (Reboot recommended)" + msg_ok "Completed Post Install Routines" + ;; + esac +} + +main diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/pve-privilege-converter.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/pve-privilege-converter.sh new file mode 100644 index 000000000..36421a216 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/pve-privilege-converter.sh @@ -0,0 +1,198 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk +# Adapted from onethree7 (https://github.com/onethree7/proxmox-lxc-privilege-converter) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +if ! command -v curl >/dev/null 2>&1; then + printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2 + apt-get update >/dev/null 2>&1 + apt-get install -y curl >/dev/null 2>&1 +fi +source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/misc/core.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true +load_functions +declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pve-privilege-converter" "pve" + +set -euo pipefail +shopt -s inherit_errexit nullglob + +APP="PVE-Privilege-Converter" +APP_TYPE="tools" +header_info "$APP" + +check_root() { + if [[ $EUID -ne 0 ]]; then + msg_error "Script must be run as root" + exit 104 + fi +} + +select_target_storage_and_container_id() { + echo -e "\nSelect target storage for restored container:\n" + mapfile -t target_storages < <(pvesm status --content images | awk 'NR > 1 {print $1}') + for i in "${!target_storages[@]}"; do + printf "%s) %s\n" "$((i + 1))" "${target_storages[$i]}" + done + + while true; do + read -rp "Enter number of target storage: " choice + if [[ "$choice" =~ ^[0-9]+$ ]] && ((choice >= 1 && choice <= ${#target_storages[@]})); then + TARGET_STORAGE="${target_storages[$((choice - 1))]}" + break + else + echo "Invalid selection. Try again." + fi + done + + next_free_id=$(pvesh get /cluster/nextid 2>/dev/null || echo 999) + [[ "$next_free_id" =~ ^[0-9]+$ ]] || next_free_id=999 + + echo "" + read -rp "Suggested next free container ID: $next_free_id. Enter new container ID [default: $next_free_id]: " NEW_CONTAINER_ID + NEW_CONTAINER_ID="${NEW_CONTAINER_ID:-$next_free_id}" +} + +select_container() { + mapfile -t lxc_list_raw < <(pct list | awk 'NR > 1 {print $1, $3}') + lxc_list=() + for entry in "${lxc_list_raw[@]}"; do + [[ -n "$entry" ]] && lxc_list+=("$entry") + done + + if [[ ${#lxc_list[@]} -eq 0 ]]; then + msg_error "No containers found" + exit 234 + fi + + PS3="Enter number of container to convert: " + select opt in "${lxc_list[@]}"; do + if [[ -n "$opt" ]]; then + read -r CONTAINER_ID CONTAINER_NAME <<<"$opt" + CONTAINER_NAME="${CONTAINER_NAME:-}" + break + else + echo "Invalid selection. Try again." + fi + done +} + +select_backup_storage() { + echo -e "Select backup storage (temporary vzdump location):" + mapfile -t backup_storages < <(pvesm status --content backup | awk 'NR > 1 {print $1}') + local PS3="Enter number of backup storage: " + + select opt in "${backup_storages[@]}"; do + if [[ -n "$opt" ]]; then + BACKUP_STORAGE="$opt" + break + else + echo "Invalid selection. Try again." + fi + done +} + +backup_container() { + msg_custom "đŸ“Ļ" "\e[36m" "Backing up container $CONTAINER_ID" + vzdump_output=$(mktemp) + vzdump "$CONTAINER_ID" --compress zstd --storage "$BACKUP_STORAGE" --mode snapshot | tee "$vzdump_output" + BACKUP_PATH=$(awk '/tar.zst/ {print $NF}' "$vzdump_output" | tr -d "'") + if [ -z "$BACKUP_PATH" ] || ! grep -q "Backup job finished successfully" "$vzdump_output"; then + rm "$vzdump_output" + msg_error "Backup failed" + exit 235 + fi + rm "$vzdump_output" + msg_ok "Backup complete: $BACKUP_PATH" +} + +perform_conversion() { + if pct config "$CONTAINER_ID" | grep -q 'unprivileged: 1'; then + UNPRIVILEGED=true + else + UNPRIVILEGED=false + fi + + msg_custom "đŸ› ī¸" "\e[36m" "Restoring as $(if $UNPRIVILEGED; then echo privileged; else echo unprivileged; fi) container" + restore_opts=("$NEW_CONTAINER_ID" "$BACKUP_PATH" --storage "$TARGET_STORAGE") + if $UNPRIVILEGED; then + restore_opts+=(--unprivileged false) + else + restore_opts+=(--unprivileged) + fi + + if pct restore "${restore_opts[@]}" -ignore-unpack-errors 1; then + msg_ok "Conversion successful" + else + msg_error "Conversion failed" + exit 235 + fi +} + +manage_states() { + read -rp "Shutdown source and start new container? [Y/n]: " answer + answer=${answer:-Y} + if [[ $answer =~ ^[Yy] ]]; then + pct shutdown "$CONTAINER_ID" + for i in {1..36}; do + sleep 5 + ! pct status "$CONTAINER_ID" | grep -q running && break + done + if pct status "$CONTAINER_ID" | grep -q running; then + read -rp "Timeout reached. Force shutdown? [Y/n]: " force + if [[ ${force:-Y} =~ ^[Yy] ]]; then + pkill -9 -f "lxc-start -F -n $CONTAINER_ID" + fi + fi + pct start "$NEW_CONTAINER_ID" + msg_ok "New container started" + else + msg_custom "â„šī¸" "\e[36m" "Skipped container state change" + fi +} + +cleanup_files() { + read -rp "Delete backup archive? [$BACKUP_PATH] [Y/n]: " cleanup + if [[ ${cleanup:-Y} =~ ^[Yy] ]]; then + rm -f "$BACKUP_PATH" && msg_ok "Removed backup archive" + else + msg_custom "💾" "\e[36m" "Retained backup archive" + fi +} + +summary() { + local conversion="Unknown" + if [[ -n "${UNPRIVILEGED:-}" ]]; then + if $UNPRIVILEGED; then + conversion="Unprivileged → Privileged" + else + conversion="Privileged → Unprivileged" + fi + fi + + echo + msg_custom "📄" "\e[36m" "Summary:" + msg_custom " " "\e[36m" "$(printf "%-22s %s" "Original Container:" "$CONTAINER_ID ($CONTAINER_NAME)")" + msg_custom " " "\e[36m" "$(printf "%-22s %s" "Backup Storage:" "$BACKUP_STORAGE")" + msg_custom " " "\e[36m" "$(printf "%-22s %s" "Target Storage:" "$TARGET_STORAGE")" + msg_custom " " "\e[36m" "$(printf "%-22s %s" "Backup Path:" "$BACKUP_PATH")" + msg_custom " " "\e[36m" "$(printf "%-22s %s" "New Container ID:" "$NEW_CONTAINER_ID")" + msg_custom " " "\e[36m" "$(printf "%-22s %s" "Privilege Conversion:" "$conversion")" + echo +} + +main() { + header_info + check_root + select_container + select_backup_storage + backup_container + select_target_storage_and_container_id + perform_conversion + manage_states + cleanup_files + summary +} + +main diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/pve8-upgrade.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/pve8-upgrade.sh new file mode 100644 index 000000000..0d9524a0a --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/pve8-upgrade.sh @@ -0,0 +1,143 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT +# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +header_info() { + clear + cat <<"EOF" + ____ _ ____________ __ ______ __________ ___ ____ ______ + / __ \ | / / ____( __ ) / / / / __ \/ ____/ __ \/ | / __ \/ ____/ + / /_/ / | / / __/ / __ | / / / / /_/ / / __/ /_/ / /| | / / / / __/ + / ____/| |/ / /___/ /_/ / / /_/ / ____/ /_/ / _, _/ ___ |/ /_/ / /___ +/_/ |___/_____/\____/ \____/_/ \____/_/ |_/_/ |_/_____/_____/ + +EOF +} + +RD=$(echo "\033[01;31m") +YW=$(echo "\033[33m") +GN=$(echo "\033[1;92m") +CL=$(echo "\033[m") +BFR="\\r\\033[K" +HOLD="-" +CM="${GN}✓${CL}" +CROSS="${RD}✗${CL}" + +set -euo pipefail +shopt -s inherit_errexit nullglob + +msg_info() { + local msg="$1" + echo -ne " ${HOLD} ${YW}${msg}..." +} + +msg_ok() { + local msg="$1" + echo -e "${BFR} ${CM} ${GN}${msg}${CL}" +} + +msg_error() { + local msg="$1" + echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" +} + +# Telemetry +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true +declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pve8-upgrade" "pve" + +start_routines() { + header_info + + whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "PVE8 SOURCES" "This will set the correct sources to update and install Proxmox VE 8." 10 58 + msg_info "Changing to Proxmox VE 8 Sources" + cat </etc/apt/sources.list +deb http://ftp.debian.org/debian bookworm main contrib +deb http://ftp.debian.org/debian bookworm-updates main contrib +deb http://security.debian.org/debian-security bookworm-security main contrib +EOF + msg_ok "Changed to Proxmox VE 8 Sources" + + whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "PVE8-ENTERPRISE" "The 'pve-enterprise' repository is only available to users who have purchased a Proxmox VE subscription." 10 58 + msg_info "Disabling 'pve-enterprise' repository" + cat </etc/apt/sources.list.d/pve-enterprise.list +# deb https://enterprise.proxmox.com/debian/pve bookworm pve-enterprise +EOF + msg_ok "Disabled 'pve-enterprise' repository" + + whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "PVE8-NO-SUBSCRIPTION" "The 'pve-no-subscription' repository provides access to all of the open-source components of Proxmox VE." 10 58 + msg_info "Enabling 'pve-no-subscription' repository" + cat </etc/apt/sources.list.d/pve-install-repo.list +deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription +EOF + msg_ok "Enabled 'pve-no-subscription' repository" + + whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "PVE8 CEPH PACKAGE REPOSITORIES" "The 'Ceph Package Repositories' provides access to both the 'no-subscription' and 'enterprise' repositories." 10 58 + msg_info "Enabling 'ceph package repositories'" + cat </etc/apt/sources.list.d/ceph.list +# deb https://enterprise.proxmox.com/debian/ceph-quincy bookworm enterprise +deb http://download.proxmox.com/debian/ceph-quincy bookworm no-subscription +EOF + msg_ok "Enabled 'ceph package repositories'" + + whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "PVE8 TEST" "The 'pvetest' repository can give advanced users access to new features and updates before they are officially released (Disabled)." 10 58 + msg_info "Adding 'pvetest' repository and set disabled" + cat </etc/apt/sources.list.d/pvetest-for-beta.list +# deb http://download.proxmox.com/debian/pve bookworm pvetest +EOF + msg_ok "Added 'pvetest' repository" + + whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "PVE8 UPDATE" "Updating to Proxmox VE 8" 10 58 + msg_info "Updating to Proxmox VE 8 (Patience)" + apt-get update + DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::="--force-confold" dist-upgrade -y + msg_ok "Updated to Proxmox VE 8" + + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "REBOOT" --menu "\nReboot Proxmox VE 8 now? (recommended)" 11 58 2 \ + "yes" " " \ + "no" " " 3>&2 2>&1 1>&3) + case $CHOICE in + yes) + msg_info "Rebooting Proxmox VE 8" + sleep 2 + msg_ok "Completed Install Routines" + reboot + ;; + no) + msg_error "Selected no to Rebooting Proxmox VE 8 (Reboot recommended)" + msg_ok "Completed Install Routines" + ;; + esac +} + +header_info +while true; do + read -p "Start the Update to Proxmox VE 8 Script (y/n)?" yn + case $yn in + [Yy]*) break ;; + [Nn]*) + clear + exit + ;; + *) echo "Please answer yes or no." ;; + esac +done + +if ! command -v pveversion >/dev/null 2>&1; then + header_info + msg_error "\n No PVE Detected!\n" + exit +fi + +if ! pveversion | grep -Eq "pve-manager/(7\.4-(16|17|18|19))"; then + header_info + msg_error "This version of Proxmox Virtual Environment is not supported" + echo -e " PVE Version 7.4-16 or higher is required." + echo -e "\nExiting..." + sleep 3 + exit +fi + +start_routines diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/scaling-governor.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/scaling-governor.sh new file mode 100644 index 000000000..175012aaf --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/scaling-governor.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT +# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +set -e + +# Telemetry +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true +declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "scaling-governor" "pve" + +header_info() { + clear + cat < MSG_MAX_LENGTH)) && MSG_MAX_LENGTH=${#ITEM}+OFFSET + GOVERNORS_MENU+=("$TAG" "$ITEM " "OFF") +done < <(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors | tr ' ' '\n' | grep -v "$current_governor") +scaling_governor=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Current CPU Scaling Governor is set to $current_governor" --checklist "\nSelect the Scaling Governor to use:\n" 16 $((MSG_MAX_LENGTH + 58)) 6 "${GOVERNORS_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') +[ -z "$scaling_governor" ] && { + whiptail --backtitle "Proxmox VE Helper Scripts" --title "No CPU Scaling Governor Selected" --msgbox "It appears that no CPU Scaling Governor was selected" 10 68 + clear + exit +} +echo "${scaling_governor}" | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor >/dev/null +current_governor=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor) +whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Current CPU Scaling Governor" "\nCurrent CPU Scaling Governor has been set to $current_governor\n" 10 60 +CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU Scaling Governor" --menu "This will establish a crontab to maintain the CPU Scaling Governor configuration across reboots.\n \nSetup a crontab?" 14 68 2 \ + "yes" " " \ + "no" " " 3>&2 2>&1 1>&3) + +case $CHOICE in +yes) + set +e + NEW_CRONTAB_COMMAND="(sleep 60 && echo \"$current_governor\" | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor)" + EXISTING_CRONTAB=$(crontab -l 2>/dev/null) + if [[ -n "$EXISTING_CRONTAB" ]]; then + TEMP_CRONTAB_FILE=$(mktemp) + echo "$EXISTING_CRONTAB" | grep -v "@reboot (sleep 60 && echo*" >"$TEMP_CRONTAB_FILE" + crontab "$TEMP_CRONTAB_FILE" + rm "$TEMP_CRONTAB_FILE" + fi + ( + crontab -l 2>/dev/null + echo "@reboot $NEW_CRONTAB_COMMAND" + ) | crontab - + echo -e "\nCrontab Set (use 'crontab -e' to check)" + ;; +no) + echo -e "\n\033[31mNOTE: Settings return to default after reboot\033[m\n" + ;; +esac +echo -e "Current CPU Scaling Governor is set to \033[36m$current_governor\033[m\n" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/update-apps.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/update-apps.sh new file mode 100644 index 000000000..e7b26ed5f --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/update-apps.sh @@ -0,0 +1,475 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: BvdBerg01 | Co-Author: remz1337 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/refs/heads/main/misc/core.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true +declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "update-apps" "pve" + +# ============================================================================= +# CONFIGURATION VARIABLES +# Set these variables to skip interactive prompts (Whiptail dialogs) +# ============================================================================= +# var_backup: Enable/disable backup before update +# Options: "yes" | "no" | "" (empty = interactive prompt) +var_backup="${var_backup:-}" + +# var_backup_storage: Storage location for backups (only used if var_backup=yes) +# Options: Storage name from /etc/pve/storage.cfg (e.g., "local", "nas-backup") +# Leave empty for interactive selection +var_backup_storage="${var_backup_storage:-}" + +# var_container: Which containers to update +# Options: +# - "all" : All containers with community-scripts tags +# - "all_running" : Only running containers with community-scripts tags +# - "all_stopped" : Only stopped containers with community-scripts tags +# - "101,102,109" : Comma-separated list of specific container IDs +# - "" : Interactive selection via Whiptail +var_container="${var_container:-}" + +# var_unattended: Run updates without user interaction inside containers +# Options: "yes" | "no" | "" (empty = interactive prompt) +var_unattended="${var_unattended:-}" + +# var_skip_confirm: Skip initial confirmation dialog +# Options: "yes" | "no" (default: no) +var_skip_confirm="${var_skip_confirm:-no}" + +# var_auto_reboot: Automatically reboot containers that require it after update +# Options: "yes" | "no" | "" (empty = interactive prompt) +var_auto_reboot="${var_auto_reboot:-}" + +# var_tags: Optionally override the tags used for auto-detection +# Options: "community-script|proxmox-helper-scripts" (default) +var_tags="${var_tags:-community-script|proxmox-helper-scripts}" +# ============================================================================= +# JSON CONFIG EXPORT +# Run with --export-config to output current configuration as JSON +# ============================================================================= + +function export_config_json() { + cat </dev/null + pct pull "$1" /usr/bin/update update 2>/dev/null + service=$(cat update | sed 's|.*/ct/||g' | sed 's|\.sh).*||g') + popd >/dev/null +} + +function backup_container() { + msg_info "Creating backup for container $1" + vzdump $1 --compress zstd --storage $STORAGE_CHOICE -notes-template "{{guestname}} - community-scripts backup updater" >/dev/null 2>&1 + status=$? + + if [ $status -eq 0 ]; then + msg_ok "Backup created" + else + msg_error "Backup failed for container $1" + exit 235 + fi +} + +function get_backup_storages() { + STORAGES=$(awk ' +/^[a-z]+:/ { + if (name != "") { + if (has_backup || (!has_content && type == "dir")) print name + } + split($0, a, ":") + type = a[1] + name = a[2] + gsub(/^[ \t]+|[ \t]+$/, "", name) + has_content = 0 + has_backup = 0 +} +/^[ \t]*content/ { + has_content = 1 + if ($0 ~ /backup/) has_backup = 1 +} +END { + if (name != "") { + if (has_backup || (!has_content && type == "dir")) print name + } +} +' /etc/pve/storage.cfg) +} + +header_info + +# Skip confirmation if var_skip_confirm is set to yes +if [[ "$var_skip_confirm" != "yes" ]]; then + whiptail --backtitle "Proxmox VE Helper Scripts" --title "LXC App Update" --yesno "This will update apps in LXCs installed by Helper-Scripts. Proceed?" 10 58 || exit +fi + +tags_formatted="${var_tags//|/, }" +msg_info "Loading all possible LXC containers from Proxmox VE with tags: ${tags_formatted}. This may take a few seconds..." +NODE=$(hostname) +containers=$(pct list | tail -n +2 | awk '{print $0 " " $4}') + +if [ -z "$containers" ]; then + whiptail --title "LXC Container Update" --msgbox "No LXC containers available!" 10 60 + exit 234 +fi + +menu_items=() +FORMAT="%-10s %-15s %-10s" +TAGS="${var_tags:-community-script|proxmox-helper-scripts}" + +while read -r container; do + container_id=$(echo $container | awk '{print $1}') + container_name=$(echo $container | awk '{print $2}') + container_status=$(echo $container | awk '{print $3}') + formatted_line=$(printf "$FORMAT" "$container_name" "$container_status") + if pct config "$container_id" | grep -qE "[^-][; ](${TAGS}).*"; then + menu_items+=("$container_id" "$formatted_line" "OFF") + fi +done <<<"$containers" +msg_ok "Loaded ${#menu_items[@]} containers" + +# Determine container selection based on var_container +if [[ -n "$var_container" ]]; then + case "$var_container" in + all) + # Select all containers with matching tags + CHOICE="" + for ((i = 0; i < ${#menu_items[@]}; i += 3)); do + CHOICE="$CHOICE ${menu_items[$i]}" + done + CHOICE=$(echo "$CHOICE" | xargs) + ;; + all_running) + # Select only running containers with matching tags + CHOICE="" + for ((i = 0; i < ${#menu_items[@]}; i += 3)); do + cid="${menu_items[$i]}" + if pct status "$cid" 2>/dev/null | grep -q "running"; then + CHOICE="$CHOICE $cid" + fi + done + CHOICE=$(echo "$CHOICE" | xargs) + ;; + all_stopped) + # Select only stopped containers with matching tags + CHOICE="" + for ((i = 0; i < ${#menu_items[@]}; i += 3)); do + cid="${menu_items[$i]}" + if pct status "$cid" 2>/dev/null | grep -q "stopped"; then + CHOICE="$CHOICE $cid" + fi + done + CHOICE=$(echo "$CHOICE" | xargs) + ;; + *) + # Assume comma-separated list of container IDs + CHOICE=$(echo "$var_container" | tr ',' ' ') + ;; + esac + + if [[ -z "$CHOICE" ]]; then + msg_error "No containers matched the selection criteria: $var_container ${var_tags:-community-script|proxmox-helper-scripts}" + exit 234 + fi + msg_ok "Selected containers: $CHOICE" +else + CHOICE=$(whiptail --title "LXC Container Update" \ + --checklist "Select LXC containers to update:" 25 60 13 \ + "${menu_items[@]}" 3>&2 2>&1 1>&3 | tr -d '"') + + if [ -z "$CHOICE" ]; then + whiptail --title "LXC Container Update" \ + --msgbox "No containers selected!" 10 60 + exit 0 + fi +fi + +header_info + +# Determine backup choice based on var_backup +if [[ -n "$var_backup" ]]; then + BACKUP_CHOICE="$var_backup" +else + BACKUP_CHOICE="no" + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "LXC Container Update" --yesno "Do you want to backup your containers before update?" 10 58); then + BACKUP_CHOICE="yes" + fi +fi + +# Determine unattended update based on var_unattended +if [[ -n "$var_unattended" ]]; then + UNATTENDED_UPDATE="$var_unattended" +else + UNATTENDED_UPDATE="no" + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "LXC Container Update" --yesno "Run updates unattended?" 10 58); then + UNATTENDED_UPDATE="yes" + fi +fi + +if [ "$BACKUP_CHOICE" == "yes" ]; then + get_backup_storages + + if [ -z "$STORAGES" ]; then + msg_error "No storage with 'backup' support found!" + exit 119 + fi + + # Determine storage based on var_backup_storage + if [[ -n "$var_backup_storage" ]]; then + # Validate that the specified storage exists and supports backups + if echo "$STORAGES" | grep -qw "$var_backup_storage"; then + STORAGE_CHOICE="$var_backup_storage" + msg_ok "Using backup storage: $STORAGE_CHOICE" + else + msg_error "Specified backup storage '$var_backup_storage' not found or doesn't support backups!" + msg_info "Available storages: $(echo $STORAGES | tr '\n' ' ')" + exit 119 + fi + else + MENU_ITEMS=() + for STORAGE in $STORAGES; do + MENU_ITEMS+=("$STORAGE" "") + done + + STORAGE_CHOICE=$(whiptail --title "Select storage device" --menu "Select a storage device (Only storage devices with 'backup' support are listed):" 15 50 5 "${MENU_ITEMS[@]}" 3>&1 1>&2 2>&3) + + if [ -z "$STORAGE_CHOICE" ]; then + msg_error "No storage selected!" + exit 0 + fi + fi +fi + +UPDATE_CMD="update;" +if [ "$UNATTENDED_UPDATE" == "yes" ]; then + UPDATE_CMD="export PHS_SILENT=1;update;" +fi + +containers_needing_reboot=() +for container in $CHOICE; do + echo -e "${BL}[INFO]${CL} Updating container $container" + + if [ "$BACKUP_CHOICE" == "yes" ]; then + backup_container $container + fi + + os=$(pct config "$container" | awk '/^ostype/ {print $2}') + status=$(pct status $container) + template=$(pct config $container | grep -q "template:" && echo "true" || echo "false") + if [ "$template" == "false" ] && [ "$status" == "status: stopped" ]; then + echo -e "${BL}[Info]${GN} Starting${BL} $container ${CL} \n" + pct start $container + echo -e "${BL}[Info]${GN} Waiting For${BL} $container${CL}${GN} To Start ${CL} \n" + sleep 5 + fi + + #1) Detect service using the service name in the update command + detect_service $container + + #1.1) If update script not detected, return + if [ -z "${service}" ]; then + echo -e "${YW}[WARN]${CL} Update script not found. Skipping to next container" + continue + else + echo -e "${BL}[INFO]${CL} Detected service: ${GN}${service}${CL}" + fi + + #2) Extract service build/update resource requirements from config/installation file + script=$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${service}.sh) + + #2.1) Check if the script downloaded successfully + if [ $? -ne 0 ]; then + echo -e "${RD}[ERROR]${CL} Issue while downloading install script." + echo -e "${YW}[WARN]${CL} Unable to assess build resource requirements. Proceeding with current resources." + fi + + config=$(pct config "$container") + build_cpu=$(echo "$script" | { grep -m 1 "var_cpu" || test $? = 1; } | sed 's|.*=||g' | sed 's|"||g' | sed 's|.*var_cpu:-||g' | sed 's|}||g') + build_ram=$(echo "$script" | { grep -m 1 "var_ram" || test $? = 1; } | sed 's|.*=||g' | sed 's|"||g' | sed 's|.*var_ram:-||g' | sed 's|}||g') + run_cpu=$(echo "$script" | { grep -m 1 "pct set \$CTID -cores" || test $? = 1; } | sed 's|.*cores ||g') + run_ram=$(echo "$script" | { grep -m 1 "pct set \$CTID -memory" || test $? = 1; } | sed 's|.*memory ||g') + current_cpu=$(echo "$config" | grep -m 1 "cores:" | sed 's|cores: ||g') + current_ram=$(echo "$config" | grep -m 1 "memory:" | sed 's|memory: ||g') + + #Test if all values are valid (>0) + if [ -z "${run_cpu}" ] || [ "$run_cpu" -le 0 ]; then + #echo "No valid value found for run_cpu. Assuming same as current configuration." + run_cpu=$current_cpu + fi + + if [ -z "${run_ram}" ] || [ "$run_ram" -le 0 ]; then + #echo "No valid value found for run_ram. Assuming same as current configuration." + run_ram=$current_ram + fi + + if [ -z "${build_cpu}" ] || [ "$build_cpu" -le 0 ]; then + #echo "No valid value found for build_cpu. Assuming same as current configuration." + build_cpu=$current_cpu + fi + + if [ -z "${build_ram}" ] || [ "$build_ram" -le 0 ]; then + #echo "No valid value found for build_ram. Assuming same as current configuration." + build_ram=$current_ram + fi + + UPDATE_BUILD_RESOURCES=0 + if [ "$build_cpu" -gt "$run_cpu" ] || [ "$build_ram" -gt "$run_ram" ]; then + UPDATE_BUILD_RESOURCES=1 + fi + + #3) if build resources are different than run resources, then: + if [ "$UPDATE_BUILD_RESOURCES" -eq "1" ]; then + pct set "$container" --cores "$build_cpu" --memory "$build_ram" + fi + + #4) Update service, using the update command + case "$os" in + alpine) pct exec "$container" -- ash -c "$UPDATE_CMD" ;; + archlinux) pct exec "$container" -- bash -c "$UPDATE_CMD" ;; + fedora | rocky | centos | alma) pct exec "$container" -- bash -c "$UPDATE_CMD" ;; + ubuntu | debian | devuan) pct exec "$container" -- bash -c "$UPDATE_CMD" ;; + opensuse) pct exec "$container" -- bash -c "$UPDATE_CMD" ;; + esac + exit_code=$? + + if [ "$template" == "false" ] && [ "$status" == "status: stopped" ]; then + echo -e "${BL}[Info]${GN} Shutting down${BL} $container ${CL} \n" + pct shutdown $container & + fi + + #5) if build resources are different than run resources, then: + if [ "$UPDATE_BUILD_RESOURCES" -eq "1" ]; then + pct set "$container" --cores "$run_cpu" --memory "$run_ram" + fi + + if pct exec "$container" -- [ -e "/var/run/reboot-required" ]; then + # Get the container's hostname and add it to the list + container_hostname=$(pct exec "$container" hostname) + containers_needing_reboot+=("$container ($container_hostname)") + fi + + if [ $exit_code -eq 0 ]; then + msg_ok "Updated container $container" + elif [ $exit_code -eq 75 ]; then + echo -e "${YW}[WARN]${CL} Container $container skipped (requires interactive mode)" + elif [ "$BACKUP_CHOICE" == "yes" ]; then + msg_info "Restoring LXC from backup" + pct stop $container + LXC_STORAGE=$(pct config $container | awk -F '[:,]' '/rootfs/ {print $2}') + pct restore $container /var/lib/vz/dump/vzdump-lxc-${container}-*.tar.zst --storage $LXC_STORAGE --force >/dev/null 2>&1 + pct start $container + restorestatus=$? + if [ $restorestatus -eq 0 ]; then + msg_ok "Restored LXC from backup" + else + msg_error "Restored LXC from backup failed" + exit 235 + fi + else + msg_error "Update failed for container $container. Exiting" + exit "$exit_code" + fi +done + +wait +header_info +echo -e "${GN}The process is complete, and the containers have been successfully updated.${CL}\n" +if [ "${#containers_needing_reboot[@]}" -gt 0 ]; then + echo -e "${RD}The following containers require a reboot:${CL}" + for container_name in "${containers_needing_reboot[@]}"; do + echo "$container_name" + done + + # Determine reboot choice based on var_auto_reboot + REBOOT_CHOICE="no" + if [[ -n "$var_auto_reboot" ]]; then + REBOOT_CHOICE="$var_auto_reboot" + else + echo -ne "${INFO} Do you wish to reboot these containers? " + read -r prompt + if [[ ${prompt,,} =~ ^(yes)$ ]]; then + REBOOT_CHOICE="yes" + fi + fi + + if [[ "$REBOOT_CHOICE" == "yes" ]]; then + echo -e "${CROSS}${HOLD} ${YWB}Rebooting containers.${CL}" + for container_name in "${containers_needing_reboot[@]}"; do + container=$(echo $container_name | cut -d " " -f 1) + pct reboot ${container} + done + fi +fi diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/update-lxcs-cron.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/update-lxcs-cron.sh new file mode 100644 index 000000000..a6d6f0987 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/update-lxcs-cron.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT +# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +echo -e "\n $(date)" +excluded_containers=("$@") +function update_container() { + container=$1 + name=$(pct exec "$container" hostname) + echo -e "\n [Info] Updating $container : $name \n" + os=$(pct config "$container" | awk '/^ostype/ {print $2}') + case "$os" in + alpine) pct exec "$container" -- ash -c "apk -U upgrade" ;; + archlinux) pct exec "$container" -- bash -c "pacman -Syyu --noconfirm" ;; + fedora | rocky | centos | alma) pct exec "$container" -- bash -c "dnf -y update && dnf -y upgrade" ;; + ubuntu | debian | devuan) pct exec "$container" -- bash -c "apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::="--force-confold" dist-upgrade -y; rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED" ;; + opensuse) pct exec "$container" -- bash -c "zypper ref && zypper --non-interactive dup" ;; + esac +} + +for container in $(pct list | awk '{if(NR>1) print $1}'); do + excluded=false + for excluded_container in "${excluded_containers[@]}"; do + if [ "$container" == "$excluded_container" ]; then + excluded=true + break + fi + done + if [ "$excluded" == true ]; then + echo -e "[Info] Skipping $container" + sleep 1 + else + status=$(pct status "$container") + template=$(pct config "$container" | grep -q "template:" && echo "true" || echo "false") + if [ "$template" == "false" ] && [ "$status" == "status: stopped" ]; then + echo -e "[Info] Starting $container" + pct start "$container" + sleep 5 + update_container "$container" + echo -e "[Info] Shutting down $container" + pct shutdown "$container" & + elif [ "$status" == "status: running" ]; then + update_container "$container" + fi + fi +done +wait diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/update-lxcs.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/update-lxcs.sh new file mode 100644 index 000000000..5b0dfc2a5 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/update-lxcs.sh @@ -0,0 +1,134 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT +# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +function header_info() { + clear + cat <<"EOF" + __ __ __ __ __ _ ________ + / / / /___ ____/ /___ _/ /____ / / | |/ / ____/ + / / / / __ \/ __ / __ `/ __/ _ \ / / | / / +/ /_/ / /_/ / /_/ / /_/ / /_/ __/ / /___/ / /___ +\____/ .___/\__,_/\__,_/\__/\___/ /_____/_/|_\____/ + /_/ + +EOF +} +set -eEuo pipefail +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +RD=$(echo "\033[01;31m") +CM='\xE2\x9C\x94\033' +GN=$(echo "\033[1;92m") +CL=$(echo "\033[m") + +# Telemetry +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true +declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "update-lxcs" "pve" + +header_info +echo "Loading..." +whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Updater" --yesno "This Will Update LXC Containers. Proceed?" 10 58 +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Skip Not-Running Containers" --yesno "Do you want to skip containers that are not currently running?" 10 58; then + SKIP_STOPPED="yes" +else + SKIP_STOPPED="no" +fi + +NODE=$(hostname) +EXCLUDE_MENU=() +MSG_MAX_LENGTH=0 +while read -r TAG ITEM; do + OFFSET=2 + ((${#ITEM} + OFFSET > MSG_MAX_LENGTH)) && MSG_MAX_LENGTH=${#ITEM}+OFFSET + EXCLUDE_MENU+=("$TAG" "$ITEM " "OFF") +done < <(pct list | awk 'NR>1') +excluded_containers=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Containers on $NODE" --checklist "\nSelect containers to skip from updates:\n" 16 $((MSG_MAX_LENGTH + 23)) 6 "${EXCLUDE_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') + +function needs_reboot() { + local container=$1 + local os=$(pct config "$container" | awk '/^ostype/ {print $2}') + local reboot_required_file="/var/run/reboot-required.pkgs" + if [ -f "$reboot_required_file" ]; then + if [[ "$os" == "ubuntu" || "$os" == "debian" ]]; then + if pct exec "$container" -- [ -s "$reboot_required_file" ]; then + return 0 + fi + fi + fi + return 1 +} + +function update_container() { + container=$1 + header_info + name=$(pct exec "$container" hostname) + os=$(pct config "$container" | awk '/^ostype/ {print $2}') + if [[ "$os" == "ubuntu" || "$os" == "debian" || "$os" == "fedora" ]]; then + disk_info=$(pct exec "$container" df /boot | awk 'NR==2{gsub("%","",$5); printf "%s %.1fG %.1fG %.1fG", $5, $3/1024/1024, $2/1024/1024, $4/1024/1024 }') + read -ra disk_info_array <<<"$disk_info" + echo -e "${BL}[Info]${GN} Updating ${BL}$container${CL} : ${GN}$name${CL} - ${YW}Boot Disk: ${disk_info_array[0]}% full [${disk_info_array[1]}/${disk_info_array[2]} used, ${disk_info_array[3]} free]${CL}\n" + else + echo -e "${BL}[Info]${GN} Updating ${BL}$container${CL} : ${GN}$name${CL} - ${YW}[No disk info for ${os}]${CL}\n" + fi + case "$os" in + alpine) pct exec "$container" -- ash -c "apk -U upgrade" ;; + archlinux) pct exec "$container" -- bash -c "pacman -Syyu --noconfirm" ;; + fedora | rocky | centos | alma) pct exec "$container" -- bash -c "dnf -y update && dnf -y upgrade" ;; + ubuntu | debian | devuan) pct exec "$container" -- bash -c "apt-get update 2>/dev/null | grep 'packages.*upgraded'; apt list --upgradable && apt-get -yq dist-upgrade 2>&1; rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED || true" ;; + opensuse) pct exec "$container" -- bash -c "zypper ref && zypper --non-interactive dup" ;; + esac +} + +containers_needing_reboot=() +header_info +for container in $(pct list | awk '{if(NR>1) print $1}'); do + if [[ " ${excluded_containers[@]} " =~ " $container " ]]; then + header_info + echo -e "${BL}[Info]${GN} Skipping ${BL}$container${CL}" + sleep 1 + else + status=$(pct status $container) + if [ "$SKIP_STOPPED" == "yes" ] && [ "$status" == "status: stopped" ]; then + header_info + echo -e "${BL}[Info]${GN} Skipping ${BL}$container${CL}${GN} (not running)${CL}" + sleep 1 + continue + fi + template=$(pct config $container | grep -q "template:" && echo "true" || echo "false") + if [ "$template" == "false" ] && [ "$status" == "status: stopped" ]; then + echo -e "${BL}[Info]${GN} Starting${BL} $container ${CL} \n" + pct start $container + echo -e "${BL}[Info]${GN} Waiting For${BL} $container${CL}${GN} To Start ${CL} \n" + sleep 5 + update_container $container + echo -e "${BL}[Info]${GN} Shutting down${BL} $container ${CL} \n" + pct shutdown $container & + elif [ "$status" == "status: running" ]; then + update_container $container + fi + if pct exec "$container" -- [ -e "/var/run/reboot-required" ]; then + # Get the container's hostname and add it to the list + container_hostname=$(pct exec "$container" hostname) + containers_needing_reboot+=("$container ($container_hostname)") + fi + # check if patchmon agent is present in container and run a report if found + if pct exec "$container" -- [ -e "/usr/local/bin/patchmon-agent" ]; then + echo -e "${BL}[Info]${GN} patchmon-agent found in ${BL} $container ${CL}, triggering report. \n" + pct exec "$container" -- "/usr/local/bin/patchmon-agent" "report" + fi + fi +done +wait +header_info +echo -e "${GN}The process is complete, and the containers have been successfully updated.${CL}\n" +if [ "${#containers_needing_reboot[@]}" -gt 0 ]; then + echo -e "${RD}The following containers require a reboot:${CL}" + for container_name in "${containers_needing_reboot[@]}"; do + echo "$container_name" + done +fi +echo "" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/update-repo.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/update-repo.sh new file mode 100644 index 000000000..9bd56b5a8 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/update-repo.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 tteck +# Author: MickLesk +# License: MIT +# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +function header_info { + clear + cat <<"EOF" + __ __ __ __ ____ + / / / /___ ____/ /___ _/ /____ / __ \___ ____ ____ + / / / / __ \/ __ / __ `/ __/ _ \ / /_/ / _ \/ __ \/ __ \ +/ /_/ / /_/ / /_/ / /_/ / /_/ __/ / _, _/ __/ /_/ / /_/ / +\____/ .___/\__,_/\__,_/\__/\___/ /_/ |_|\___/ .___/\____/ + /_/ /_/ +EOF +} + +set -eEuo pipefail +BL=$(echo "\033[36m") +RD=$(echo "\033[01;31m") +GN=$(echo "\033[1;92m") +CL=$(echo "\033[m") + +# Telemetry +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true +declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "update-repo" "pve" + +header_info +echo "Loading..." +NODE=$(hostname) + +function update_container() { + container=$1 + os=$(pct config "$container" | awk '/^ostype/ {print $2}') + + if [[ "$os" == "ubuntu" || "$os" == "debian" ]]; then + echo -e "${BL}[Info]${GN} Checking /usr/bin/update in ${BL}$container${CL} (OS: ${GN}$os${CL})" + + if pct exec "$container" -- [ -e /usr/bin/update ]; then + if pct exec "$container" -- grep -q "community-scripts/ProxmoxVE" /usr/bin/update; then + echo -e "${RD}[No Change]${CL} /usr/bin/update is already up to date in ${BL}$container${CL}.\n" + elif pct exec "$container" -- grep -q -v "tteck" /usr/bin/update; then + echo -e "${RD}[Warning]${CL} /usr/bin/update in ${BL}$container${CL} contains a different entry (${RD}tteck${CL}). No changes made.\n" + else + pct exec "$container" -- bash -c "sed -i 's/tteck\\/Proxmox/community-scripts\\/ProxmoxVE/g' /usr/bin/update" + + if pct exec "$container" -- grep -q "community-scripts/ProxmoxVE" /usr/bin/update; then + echo -e "${GN}[Success]${CL} /usr/bin/update updated in ${BL}$container${CL}.\n" + else + echo -e "${RD}[Error]${CL} /usr/bin/update in ${BL}$container${CL} could not be updated properly.\n" + fi + fi + else + echo -e "${RD}[Error]${CL} /usr/bin/update not found in container ${BL}$container${CL}.\n" + fi + else + echo -e "${BL}[Info]${GN} Skipping ${BL}$container${CL} (not Debian/Ubuntu)\n" + fi +} + +header_info +for container in $(pct list | awk '{if(NR>1) print $1}'); do + update_container "$container" +done + +header_info +echo -e "${GN}The process is complete. The repositories have been switched to community-scripts/ProxmoxVE.${CL}\n" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/usb-passthrough.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/usb-passthrough.sh new file mode 100644 index 000000000..d79921a25 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/usb-passthrough.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT +# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +echo -e "\e[1;33m This script will allow USB passthrough to a PRIVILEGED LXC Container ONLY\e[0m" +while true; do + read -p "Did you replace 106 with your LXC ID? Proceed(y/n)?" yn + case $yn in + [Yy]*) break ;; + [Nn]*) exit ;; + *) echo "Please answer yes or no." ;; + esac +done + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null +CHAR_DEVS+=("166:.*") +CHAR_DEVS+=("188:.*") +CHAR_DEVS+=("189:.*") + +for char_dev in ${CHAR_DEVS[@]}; do + [ ! -z "${CHAR_DEV_STRING-}" ] && CHAR_DEV_STRING+=" -o" + CHAR_DEV_STRING+=" -regex \".*/${char_dev}\"" +done + +read -r -d '' HOOK_SCRIPT <<-EOF || true +for char_dev in \$(find /sys/dev/char -regextype sed $CHAR_DEV_STRING); do + dev="/dev/\$(sed -n "/DEVNAME/ s/^.*=\(.*\)$/\1/p" \${char_dev}/uevent)"; + mkdir -p \$(dirname \${LXC_ROOTFS_MOUNT}\${dev}); + for link in \$(udevadm info --query=property \$dev | sed -n "s/DEVLINKS=//p"); do + mkdir -p \${LXC_ROOTFS_MOUNT}\$(dirname \$link); + cp -dpR \$link \${LXC_ROOTFS_MOUNT}\${link}; + done; + cp -dpR \$dev \${LXC_ROOTFS_MOUNT}\${dev}; +done; +EOF +HOOK_SCRIPT=${HOOK_SCRIPT//$'\n'/} + +CTID=$1 +CTID_CONFIG_PATH=/etc/pve/lxc/${CTID}.conf +sed '/autodev/d' $CTID_CONFIG_PATH >CTID.conf +cat CTID.conf >$CTID_CONFIG_PATH + +cat <>$CTID_CONFIG_PATH +lxc.autodev: 1 +lxc.hook.autodev: bash -c '$HOOK_SCRIPT' +EOF +echo -e "\e[1;33m Finished....Reboot ${CTID} LXC to apply the changes \e[0m" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/turnkey/turnkey.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/turnkey/turnkey.sh new file mode 100644 index 000000000..6b53cf747 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/turnkey/turnkey.sh @@ -0,0 +1,295 @@ +#!/usr/bin/env bash +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT +# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +function header_info { + clear + cat <<"EOF" + ______ __ __ __ _ _______ +/_ __/_ _________ / //_/__ __ __ / / | |/_/ ___/ + / / / // / __/ _ \/ ,< / -_) // / / /___> &2 + [ ! -z ${CTID-} ] && cleanup_ctid + exit $EXIT +} +function warn() { + local REASON="\e[97m$1\e[39m" + local FLAG="\e[93m[WARNING]\e[39m" + msg "$FLAG $REASON" +} +function info() { + local REASON="$1" + local FLAG="\e[36m[INFO]\e[39m" + msg "$FLAG $REASON" +} +function msg() { + local TEXT="$1" + echo -e "$TEXT" +} +function validate_container_id() { + local ctid="$1" + # Check if ID is numeric + if ! [[ "$ctid" =~ ^[0-9]+$ ]]; then + return 1 + fi + # Check if config file exists for VM or LXC + if [[ -f "/etc/pve/qemu-server/${ctid}.conf" ]] || [[ -f "/etc/pve/lxc/${ctid}.conf" ]]; then + return 1 + fi + # Check if ID is used in LVM logical volumes + if lvs --noheadings -o lv_name 2>/dev/null | grep -qE "(^|[-_])${ctid}($|[-_])"; then + return 1 + fi + return 0 +} +function get_valid_container_id() { + local suggested_id="${1:-$(pvesh get /cluster/nextid)}" + while ! validate_container_id "$suggested_id"; do + suggested_id=$((suggested_id + 1)) + done + echo "$suggested_id" +} +function cleanup_ctid() { + if pct status $CTID &>/dev/null; then + if [ "$(pct status $CTID | awk '{print $2}')" == "running" ]; then + pct stop $CTID + fi + pct destroy $CTID + fi +} + +# Stop Proxmox VE Monitor-All if running +if systemctl is-active -q ping-instances.service; then + systemctl stop ping-instances.service +fi +header_info +whiptail --backtitle "Proxmox VE Helper Scripts" --title "TurnKey LXCs" --yesno "This will allow for the creation of one of the many TurnKey LXC Containers. Proceed?" 10 68 +TURNKEY_MENU=() +MSG_MAX_LENGTH=0 +while read -r TAG ITEM; do + OFFSET=2 + ((${#ITEM} + OFFSET > MSG_MAX_LENGTH)) && MSG_MAX_LENGTH=${#ITEM}+OFFSET + TURNKEY_MENU+=("$TAG" "$ITEM " "OFF") +done < <( + cat <&1 1>&2 2>&3 | tr -d '"') +[ -z "$turnkey" ] && { + whiptail --backtitle "Proxmox VE Helper Scripts" --title "No TurnKey LXC Selected" --msgbox "It appears that no TurnKey LXC container was selected" 10 68 + msg "Done" + exit +} + +# Setup script environment +PASS="$(openssl rand -base64 8)" +# Prompt user to confirm container ID +while true; do + CTID=$(whiptail --backtitle "Container ID" --title "Choose the Container ID" --inputbox "Enter the container ID..." 8 40 $(pvesh get /cluster/nextid) 3>&1 1>&2 2>&3) + + # Check if user cancelled + [ -z "$CTID" ] && die "No Container ID selected" + + # Validate Container ID + if ! validate_container_id "$CTID"; then + SUGGESTED_ID=$(get_valid_container_id "$CTID") + if whiptail --backtitle "Container ID" --title "ID Already In Use" --yesno "Container/VM ID $CTID is already in use.\n\nWould you like to use the next available ID ($SUGGESTED_ID)?" 10 58; then + CTID="$SUGGESTED_ID" + break + fi + # User declined, loop back to input + else + break + fi +done +# Prompt user to confirm Hostname +HOST_NAME=$(whiptail --backtitle "Hostname" --title "Choose the Hostname" --inputbox "Enter the containers Hostname..." 8 40 "turnkey-${turnkey}" 3>&1 1>&2 2>&3) +PCT_OPTIONS=" + -features keyctl=1,nesting=1 + -hostname $HOST_NAME + -tags community-script + -onboot 1 + -cores 2 + -memory 2048 + -password $PASS + -net0 name=eth0,bridge=vmbr0,ip=dhcp + -unprivileged 1 + " +DEFAULT_PCT_OPTIONS=( + -arch $(dpkg --print-architecture) +) + +# Set the CONTENT and CONTENT_LABEL variables +function select_storage() { + local CLASS=$1 + local CONTENT + local CONTENT_LABEL + case $CLASS in + container) + CONTENT='rootdir' + CONTENT_LABEL='Container' + ;; + template) + CONTENT='vztmpl' + CONTENT_LABEL='Container template' + ;; + *) false || die "Invalid storage class." ;; + esac + + # Query all storage locations + local -a MENU + while read -r line; do + local TAG=$(echo $line | awk '{print $1}') + local TYPE=$(echo $line | awk '{printf "%-10s", $2}') + local FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + local ITEM=" Type: $TYPE Free: $FREE " + local OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + local MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + MENU+=("$TAG" "$ITEM" "OFF") + done < <(pvesm status -content $CONTENT | awk 'NR>1') + + # Select storage location + if [ $((${#MENU[@]} / 3)) -eq 0 ]; then + warn "'$CONTENT_LABEL' needs to be selected for at least one storage location." + die "Unable to detect valid storage location." + elif [ $((${#MENU[@]} / 3)) -eq 1 ]; then + printf ${MENU[0]} + else + local STORAGE + while [ -z "${STORAGE:+x}" ]; do + STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ + "Which storage pool would you like to use for the ${CONTENT_LABEL,,}?\n\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${MENU[@]}" 3>&1 1>&2 2>&3) || die "Menu aborted." + done + printf $STORAGE + fi +} + +# Get template storage +TEMPLATE_STORAGE=$(select_storage template) +info "Using '$TEMPLATE_STORAGE' for template storage." + +# Get container storage +CONTAINER_STORAGE=$(select_storage container) +info "Using '$CONTAINER_STORAGE' for container storage." + +# Update LXC template list +msg "Updating LXC template list..." +pveam update >/dev/null + +# Get LXC template string +mapfile -t TEMPLATES < <(pveam available -section turnkeylinux | awk -v turnkey="${turnkey}" '$0 ~ turnkey {print $2}' | sort -t - -k 2 -V) +[ ${#TEMPLATES[@]} -gt 0 ] || die "Unable to find a template when searching for '${turnkey}'." +TEMPLATE="${TEMPLATES[-1]}" + +# Download LXC template +if ! pveam list $TEMPLATE_STORAGE | grep -q $TEMPLATE; then + msg "Downloading LXC template (Patience)..." + pveam download $TEMPLATE_STORAGE $TEMPLATE >/dev/null || + die "A problem occured while downloading the LXC template." +fi + +# Create variable for 'pct' options +PCT_OPTIONS=(${PCT_OPTIONS[@]:-${DEFAULT_PCT_OPTIONS[@]}}) +[[ " ${PCT_OPTIONS[@]} " =~ " -rootfs " ]] || PCT_OPTIONS+=(-rootfs $CONTAINER_STORAGE:${PCT_DISK_SIZE:-8}) + +# Create LXC +msg "Creating LXC container..." +pct create $CTID ${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE} ${PCT_OPTIONS[@]} >/dev/null || + die "A problem occured while trying to create container." + +# Save password +echo "TurnKey ${turnkey} password: ${PASS}" >>~/turnkey-${turnkey}.creds # file is located in the Proxmox root directory + +# If turnkey is "OpenVPN", add access to the tun device +TUN_DEVICE_REQUIRED=("openvpn") # Setup this way in case future turnkeys also need tun access +if printf '%s\n' "${TUN_DEVICE_REQUIRED[@]}" | grep -qw "${turnkey}"; then + info "${turnkey} requires access to /dev/net/tun on the host. Modifying the container configuration to allow this." + echo "lxc.cgroup2.devices.allow: c 10:200 rwm" >>/etc/pve/lxc/${CTID}.conf + echo "lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file 0 0" >>/etc/pve/lxc/${CTID}.conf + sleep 5 +fi + +# Start container +msg "Starting LXC Container..." +pct start "$CTID" +sleep 10 + +# Get container IP +set +euo pipefail # Turn off error checking +max_attempts=5 +attempt=1 +IP="" +while [[ $attempt -le $max_attempts ]]; do + IP=$(pct exec $CTID ip a show dev eth0 | grep -oP 'inet \K[^/]+') + if [[ -n $IP ]]; then + break + else + warn "Attempt $attempt: IP address not found. Pausing for 5 seconds..." + sleep 5 + ((attempt++)) + fi +done + +if [[ -z $IP ]]; then + warn "Maximum number of attempts reached. IP address not found." + IP="NOT FOUND" +fi + +# Start Proxmox VE Monitor-All if available +if [[ -f /etc/systemd/system/ping-instances.service ]]; then + systemctl start ping-instances.service +fi + +# Success message +header_info +echo +info "LXC container '$CTID' was successfully created, and its IP address is ${IP}." +echo +info "Proceed to the LXC console to complete the setup." +echo +info "login: root" +info "password: $PASS" +info "(credentials also stored in the root user's root directory in the 'turnkey-${turnkey}.creds' file.)" +echo diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/archlinux-vm.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/archlinux-vm.sh new file mode 100644 index 000000000..dc681a694 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/archlinux-vm.sh @@ -0,0 +1,573 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) + +function header_info { + clear + cat <<"EOF" + ___ __ __ _ _ ____ ___ + / | __________/ /_ / / (_)___ __ ___ __ | | / / |/ / + / /| | / ___/ ___/ __ \ / / / / __ \/ / / / |/_/ | | / / /|_/ / + / ___ |/ / / /__/ / / / / /___/ / / / / /_/ /> < | |/ / / / / +/_/ |_/_/ \___/_/ /_/ /_____/_/_/ /_/\__,_/_/|_| |___/_/ /_/ + +EOF +} +header_info +echo -e "\n Loading..." +GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') +RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" +METHOD="" +NSAPP="arch-linux-vm" +var_os="arch-linux" +var_version="n.d." + +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +RD=$(echo "\033[01;31m") +BGN=$(echo "\033[4;92m") +GN=$(echo "\033[1;92m") +DGN=$(echo "\033[32m") +CL=$(echo "\033[m") + +CL=$(echo "\033[m") +BOLD=$(echo "\033[1m") +BFR="\\r\\033[K" +HOLD=" " +TAB=" " + +CM="${TAB}âœ”ī¸${TAB}${CL}" +CROSS="${TAB}âœ–ī¸${TAB}${CL}" +INFO="${TAB}💡${TAB}${CL}" +OS="${TAB}đŸ–Ĩī¸${TAB}${CL}" +CONTAINERTYPE="${TAB}đŸ“Ļ${TAB}${CL}" +DISKSIZE="${TAB}💾${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}đŸ› ī¸${TAB}${CL}" +CONTAINERID="${TAB}🆔${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}🌉${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DEFAULT="${TAB}âš™ī¸${TAB}${CL}" +MACADDRESS="${TAB}🔗${TAB}${CL}" +VLANTAG="${TAB}đŸˇī¸${TAB}${CL}" +CREATING="${TAB}🚀${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" +CLOUD="${TAB}â˜ī¸${TAB}${CL}" + +THIN="discard=on,ssd=1," +set -e +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP +function error_handler() { + local exit_code="$?" + local line_number="$1" + local command="$2" + local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}" + post_update_to_api "failed" "${exit_code}" + echo -e "\n$error_message\n" + cleanup_vmid +} + +function get_valid_nextid() { + local try_id + try_id=$(pvesh get /cluster/nextid) + while true; do + if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then + try_id=$((try_id + 1)) + continue + fi + if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then + try_id=$((try_id + 1)) + continue + fi + break + done + echo "$try_id" +} + +function cleanup_vmid() { + if qm status $VMID &>/dev/null; then + qm stop $VMID &>/dev/null + qm destroy $VMID &>/dev/null + fi +} + +function cleanup() { + local exit_code=$? + popd >/dev/null + if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then + if [[ $exit_code -eq 0 ]]; then + post_update_to_api "done" "none" + else + post_update_to_api "failed" "$exit_code" + fi + fi + rm -rf $TEMP_DIR +} + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Arch Linux VM" --yesno "This will create a New Arch Linux VM. Proceed?" 10 58; then + : +else + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit +fi + +function msg_info() { + local msg="$1" + echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR}${CM}${GN}${msg}${CL}" +} + +function msg_error() { + local msg="$1" + echo -e "${BFR}${CROSS}${RD}${msg}${CL}" +} + +function check_root() { + if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then + clear + msg_error "Please run this script as root." + echo -e "\nExiting..." + sleep 2 + exit + fi +} + +# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. +# Supported: Proxmox VE 8.0.x – 8.9.x, 9.0 and 9.1 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x: allow 8.0–8.9 + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 9)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 8.0 – 8.9" + exit 105 + fi + return 0 + fi + + # Check for Proxmox VE 9.x: allow 9.0 and 9.1 + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 1)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 9.0 – 9.1" + exit 105 + fi + return 0 + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0 – 9.1" + exit 105 +} + +function arch_check() { + if [ "$(dpkg --print-architecture)" != "amd64" ]; then + echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" + echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function ssh_check() { + if command -v pveversion >/dev/null 2>&1; then + if [ -n "${SSH_CLIENT:+x}" ]; then + if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then + echo "you've been warned" + else + clear + exit + fi + fi + fi +} + +function exit-script() { + clear + echo -e "\n${CROSS}${RD}User exited script${CL}\n" + exit +} + +function default_settings() { + VMID=$(get_valid_nextid) + MACHINE="" + DISK_SIZE="4G" + DISK_CACHE="" + HN="arch-linux" + CPU_TYPE="" + CORE_COUNT="1" + RAM_SIZE="1024" + BRG="vmbr0" + MAC="$GEN_MAC" + VLAN="" + MTU="" + START_VM="yes" + METHOD="default" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a Arch Linux VM using the above default settings${CL}" +} + +function advanced_settings() { + METHOD="advanced" + [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid) + while true; do + if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 "$VMID" --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VMID" ]; then + VMID=$(get_valid_nextid) + fi + if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then + echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + break + else + exit-script + fi + done + + if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ + "i440fx" "Machine i440fx" ON \ + "q35" "Machine q35" OFF \ + 3>&1 1>&2 2>&3); then + if [ "$MACH" = q35 ]; then + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + MACHINE=" -machine q35" + else + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + MACHINE="" + fi + else + exit-script + fi + + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + DISK_SIZE="${DISK_SIZE}G" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + else + echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}" + exit-script + fi + else + exit-script + fi + + if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "None (Default)" ON \ + "1" "Write Through" OFF \ + 3>&1 1>&2 2>&3); then + if [ "$DISK_CACHE" = "1" ]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}" + DISK_CACHE="cache=writethrough," + else + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + DISK_CACHE="" + fi + else + exit-script + fi + + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 arch-linux --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VM_NAME" ]; then + HN="arch-linux" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + else + HN=$(echo "${VM_NAME,,}" | tr -d ' ') + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + fi + else + exit-script + fi + + if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "KVM64 (Default)" ON \ + "1" "Host" OFF \ + 3>&1 1>&2 2>&3); then + if [ "$CPU_TYPE1" = "1" ]; then + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" + CPU_TYPE=" -cpu host" + else + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + CPU_TYPE="" + fi + else + exit-script + fi + + if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$CORE_COUNT" ]; then + CORE_COUNT="2" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + else + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + fi + else + exit-script + fi + + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$RAM_SIZE" ]; then + RAM_SIZE="2048" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + else + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + fi + else + exit-script + fi + + if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$BRG" ]; then + BRG="vmbr0" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + else + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + fi + else + exit-script + fi + + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 "$GEN_MAC" --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$MAC1" ]; then + MAC="$GEN_MAC" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" + else + MAC="$MAC1" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}" + fi + else + exit-script + fi + + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VLAN1" ]; then + VLAN1="Default" + VLAN="" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + else + VLAN=",tag=$VLAN1" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + fi + else + exit-script + fi + + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$MTU1" ]; then + MTU1="Default" + MTU="" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + else + MTU=",mtu=$MTU1" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + fi + else + exit-script + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + else + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}" + START_VM="no" + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Arch Linux VM?" --no-button Do-Over 10 58); then + echo -e "${CREATING}${BOLD}${DGN}Creating a Arch Linux VM using the above advanced settings${CL}" + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +check_root +arch_check +pve_check +ssh_check +start_script +post_to_api_vm + +msg_info "Validating Storage" +while read -r line; do + TAG=$(echo "$line" | awk '{print $1}') + TYPE=$(echo "$line" | awk '{printf "%-10s", $2}') + FREE=$(echo "$line" | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1') +VALID=$(pvesm status -content images | awk 'NR>1') +if [ -z "$VALID" ]; then + msg_error "Unable to detect a valid storage location." + exit +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + while [ -z "${STORAGE:+x}" ]; do + STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ + "Which storage pool would you like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." +msg_info "Retrieving the URL for the Arch Linux .iso File" +URL=https://geo.mirror.pkgbuild.com/iso/latest/archlinux-x86_64.iso +sleep 2 +msg_ok "${CL}${BL}${URL}${CL}" +curl -f#SL -o "$(basename "$URL")" "$URL" +echo -en "\e[1A\e[0K" +FILE=$(basename $URL) +msg_ok "Downloaded ${CL}${BL}${FILE}${CL}" + +STORAGE_TYPE=$(pvesm status -storage "$STORAGE" | awk 'NR>1 {print $2}') +case $STORAGE_TYPE in +nfs | dir | cifs) + DISK_EXT=".qcow2" + DISK_REF="$VMID/" + DISK_IMPORT="--format qcow2" + THIN="" + ;; +btrfs) + DISK_EXT=".raw" + DISK_REF="$VMID/" + DISK_IMPORT="--format raw" + THIN="" + ;; +*) + DISK_EXT="" + DISK_REF="" + DISK_IMPORT="--format raw" + ;; +esac + +msg_info "Creating a Arch Linux VM" +qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ + -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci + +if qm disk import --help >/dev/null 2>&1; then + IMPORT_CMD=(qm disk import) +else + IMPORT_CMD=(qm importdisk) +fi + +IMPORT_OUT="$("${IMPORT_CMD[@]}" "$VMID" "${FILE}" "$STORAGE" ${DISK_IMPORT:-} 2>&1 || true)" +DISK_REF_IMPORTED="$(printf '%s\n' "$IMPORT_OUT" | sed -n "s/.*successfully imported disk '\([^']\+\)'.*/\1/p" | tr -d "\r\"'")" +[[ -z "$DISK_REF_IMPORTED" ]] && DISK_REF_IMPORTED="$(pvesm list "$STORAGE" | awk -v id="$VMID" '$5 ~ ("vm-"id"-disk-") {print $1":"$5}' | sort | tail -n1)" +[[ -z "$DISK_REF_IMPORTED" ]] && { + msg_error "Unable to determine imported disk reference." + echo "$IMPORT_OUT" + exit 226 +} +msg_ok "Imported disk (${CL}${BL}${DISK_REF_IMPORTED}${CL})" + +qm set $VMID \ + -efidisk0 ${STORAGE}:0,efitype=4m \ + -scsi0 ${DISK_REF_IMPORTED},${DISK_CACHE}${THIN%,} \ + -ide2 ${STORAGE}:cloudinit \ + -boot order=scsi0 \ + -serial0 socket >/dev/null +DESCRIPTION=$( + cat < + + Logo + + +

Arch Linux VM

+ +

+ + spend Coffee + +

+ + + + GitHub + + + + Discussions + + + + Issues + + +EOF +) +qm set $VMID -description "$DESCRIPTION" >/dev/null +if [ -n "$DISK_SIZE" ]; then + msg_info "Resizing disk to $DISK_SIZE GB" + qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null +else + msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB" + qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null +fi + +msg_ok "Created a Arch Linux VM ${CL}${BL}(${HN})" +if [ "$START_VM" == "yes" ]; then + msg_info "Starting Arch Linux VM" + qm start $VMID + msg_ok "Started Arch Linux VM" +fi +post_update_to_api "done" "none" + +msg_ok "Completed successfully!\n" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/debian-13-vm.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/debian-13-vm.sh new file mode 100644 index 000000000..18cb1a681 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/debian-13-vm.sh @@ -0,0 +1,653 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) + +function header_info { + clear + cat <<"EOF" + ____ __ _ ________ + / __ \___ / /_ (_)___ _____ < /__ / + / / / / _ \/ __ \/ / __ `/ __ \ / / /_ < + / /_/ / __/ /_/ / / /_/ / / / / / /___/ / +/_____/\___/_.___/_/\__,_/_/ /_/ /_//____/ + (Trixie) +EOF +} +header_info +echo -e "\n Loading..." +GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') +RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" +METHOD="" +NSAPP="debian13vm" +var_os="debian" +var_version="13" + +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +RD=$(echo "\033[01;31m") +BGN=$(echo "\033[4;92m") +GN=$(echo "\033[1;92m") +DGN=$(echo "\033[32m") +CL=$(echo "\033[m") + +CL=$(echo "\033[m") +BOLD=$(echo "\033[1m") +BFR="\\r\\033[K" +HOLD=" " +TAB=" " + +CM="${TAB}âœ”ī¸${TAB}${CL}" +CROSS="${TAB}âœ–ī¸${TAB}${CL}" +INFO="${TAB}💡${TAB}${CL}" +OS="${TAB}đŸ–Ĩī¸${TAB}${CL}" +CONTAINERTYPE="${TAB}đŸ“Ļ${TAB}${CL}" +DISKSIZE="${TAB}💾${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}đŸ› ī¸${TAB}${CL}" +CONTAINERID="${TAB}🆔${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}🌉${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DEFAULT="${TAB}âš™ī¸${TAB}${CL}" +MACADDRESS="${TAB}🔗${TAB}${CL}" +VLANTAG="${TAB}đŸˇī¸${TAB}${CL}" +CREATING="${TAB}🚀${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" +CLOUD="${TAB}â˜ī¸${TAB}${CL}" + +THIN="discard=on,ssd=1," +set -e +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP +function error_handler() { + local exit_code="$?" + local line_number="$1" + local command="$2" + local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}" + post_update_to_api "failed" "${exit_code}" + echo -e "\n$error_message\n" + cleanup_vmid +} + +function get_valid_nextid() { + local try_id + try_id=$(pvesh get /cluster/nextid) + while true; do + if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then + try_id=$((try_id + 1)) + continue + fi + if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then + try_id=$((try_id + 1)) + continue + fi + break + done + echo "$try_id" +} + +function cleanup_vmid() { + if qm status $VMID &>/dev/null; then + qm stop $VMID &>/dev/null + qm destroy $VMID &>/dev/null + fi +} + +function cleanup() { + local exit_code=$? + popd >/dev/null + if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then + if [[ $exit_code -eq 0 ]]; then + post_update_to_api "done" "none" + else + post_update_to_api "failed" "$exit_code" + fi + fi + rm -rf $TEMP_DIR +} + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Debian 13 VM" --yesno "This will create a New Debian 13 VM. Proceed?" 10 58; then + : +else + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit +fi + +function msg_info() { + local msg="$1" + echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR}${CM}${GN}${msg}${CL}" +} + +function msg_error() { + local msg="$1" + echo -e "${BFR}${CROSS}${RD}${msg}${CL}" +} + +function check_root() { + if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then + clear + msg_error "Please run this script as root." + echo -e "\nExiting..." + sleep 2 + exit + fi +} + +# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. +# Supported: Proxmox VE 8.0.x – 8.9.x, 9.0 and 9.1 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x: allow 8.0–8.9 + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 9)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 8.0 – 8.9" + exit 105 + fi + return 0 + fi + + # Check for Proxmox VE 9.x: allow 9.0 and 9.1 + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 1)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 9.0 – 9.1" + exit 105 + fi + return 0 + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0 – 9.1" + exit 105 +} + +function arch_check() { + if [ "$(dpkg --print-architecture)" != "amd64" ]; then + echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" + echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function ssh_check() { + if command -v pveversion >/dev/null 2>&1; then + if [ -n "${SSH_CLIENT:+x}" ]; then + if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then + echo "you've been warned" + else + clear + exit + fi + fi + fi +} + +function exit-script() { + clear + echo -e "\n${CROSS}${RD}User exited script${CL}\n" + exit +} + +function select_cloud_init() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "CLOUD-INIT" \ + --yesno "Enable Cloud-Init for VM configuration?\n\nCloud-Init allows automatic configuration of:\n- User accounts and passwords\n- SSH keys\n- Network settings (DHCP/Static)\n- DNS configuration\n\nYou can also configure these settings later in Proxmox UI.\n\nNote: Without Cloud-Init, the nocloud image will be used with console auto-login." --defaultno 18 68); then + CLOUD_INIT="yes" + echo -e "${CLOUD}${BOLD}${DGN}Cloud-Init: ${BGN}yes${CL}" + else + CLOUD_INIT="no" + echo -e "${CLOUD}${BOLD}${DGN}Cloud-Init: ${BGN}no${CL}" + fi +} + +function default_settings() { + VMID=$(get_valid_nextid) + FORMAT=",efitype=4m" + MACHINE="" + DISK_SIZE="8G" + DISK_CACHE="" + HN="debian" + CPU_TYPE="" + CORE_COUNT="2" + RAM_SIZE="2048" + BRG="vmbr0" + MAC="$GEN_MAC" + VLAN="" + MTU="" + START_VM="yes" + METHOD="default" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" + select_cloud_init + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a Debian 13 VM using the above default settings${CL}" +} + +function advanced_settings() { + METHOD="advanced" + [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid) + while true; do + if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 "$VMID" --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VMID" ]; then + VMID=$(get_valid_nextid) + fi + if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then + echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + break + else + exit-script + fi + done + + if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ + "i440fx" "Machine i440fx" ON \ + "q35" "Machine q35" OFF \ + 3>&1 1>&2 2>&3); then + if [ "$MACH" = q35 ]; then + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT="" + MACHINE=" -machine q35" + else + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT=",efitype=4m" + MACHINE="" + fi + else + exit-script + fi + + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + DISK_SIZE="${DISK_SIZE}G" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + else + echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}" + exit-script + fi + else + exit-script + fi + + if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "None (Default)" ON \ + "1" "Write Through" OFF \ + 3>&1 1>&2 2>&3); then + if [ "$DISK_CACHE" = "1" ]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}" + DISK_CACHE="cache=writethrough," + else + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + DISK_CACHE="" + fi + else + exit-script + fi + + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 debian --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VM_NAME" ]; then + HN="debian" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + else + HN=$(echo "${VM_NAME,,}" | tr -d ' ') + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + fi + else + exit-script + fi + + if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "KVM64 (Default)" ON \ + "1" "Host" OFF \ + 3>&1 1>&2 2>&3); then + if [ "$CPU_TYPE1" = "1" ]; then + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" + CPU_TYPE=" -cpu host" + else + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + CPU_TYPE="" + fi + else + exit-script + fi + + if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$CORE_COUNT" ]; then + CORE_COUNT="2" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + else + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + fi + else + exit-script + fi + + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$RAM_SIZE" ]; then + RAM_SIZE="2048" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + else + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + fi + else + exit-script + fi + + if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$BRG" ]; then + BRG="vmbr0" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + else + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + fi + else + exit-script + fi + + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 "$GEN_MAC" --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$MAC1" ]; then + MAC="$GEN_MAC" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" + else + MAC="$MAC1" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}" + fi + else + exit-script + fi + + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VLAN1" ]; then + VLAN1="Default" + VLAN="" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + else + VLAN=",tag=$VLAN1" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + fi + else + exit-script + fi + + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$MTU1" ]; then + MTU1="Default" + MTU="" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + else + MTU=",mtu=$MTU1" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + fi + else + exit-script + fi + + select_cloud_init + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + else + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}" + START_VM="no" + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Debian 13 VM?" --no-button Do-Over 10 58); then + echo -e "${CREATING}${BOLD}${DGN}Creating a Debian 13 VM using the above advanced settings${CL}" + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +check_root +arch_check +pve_check +ssh_check +start_script + +post_to_api_vm + +msg_info "Validating Storage" +while read -r line; do + TAG=$(echo "$line" | awk '{print $1}') + TYPE=$(echo "$line" | awk '{printf "%-10s", $2}') + FREE=$(echo "$line" | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1') +VALID=$(pvesm status -content images | awk 'NR>1') +if [ -z "$VALID" ]; then + msg_error "Unable to detect a valid storage location." + exit +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + while [ -z "${STORAGE:+x}" ]; do + STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ + "Which storage pool would you like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." + +# ============================================================================== +# PREREQUISITES +# ============================================================================== +if ! command -v virt-customize &>/dev/null; then + msg_info "Installing libguestfs-tools" + apt-get update >/dev/null 2>&1 + apt-get install -y libguestfs-tools >/dev/null 2>&1 + msg_ok "Installed libguestfs-tools" +fi + +msg_info "Retrieving the URL for the Debian 13 Qcow2 Disk Image" +if [ "$CLOUD_INIT" == "yes" ]; then + URL=https://cloud.debian.org/images/cloud/trixie/latest/debian-13-genericcloud-amd64.qcow2 +else + URL=https://cloud.debian.org/images/cloud/trixie/latest/debian-13-nocloud-amd64.qcow2 +fi +sleep 2 +msg_ok "${CL}${BL}${URL}${CL}" +curl -f#SL -o "$(basename "$URL")" "$URL" +echo -en "\e[1A\e[0K" +FILE=$(basename $URL) +msg_ok "Downloaded ${CL}${BL}${FILE}${CL}" + +# ============================================================================== +# IMAGE CUSTOMIZATION +# ============================================================================== +msg_info "Customizing ${FILE} image" + +WORK_FILE=$(mktemp --suffix=.qcow2) +cp "$FILE" "$WORK_FILE" + +# Set hostname +virt-customize -q -a "$WORK_FILE" --hostname "${HN}" >/dev/null 2>&1 + +# Prepare for unique machine-id on first boot +virt-customize -q -a "$WORK_FILE" --run-command "truncate -s 0 /etc/machine-id" >/dev/null 2>&1 +virt-customize -q -a "$WORK_FILE" --run-command "rm -f /var/lib/dbus/machine-id" >/dev/null 2>&1 + +# Disable systemd-firstboot to prevent interactive prompts blocking the console +virt-customize -q -a "$WORK_FILE" --run-command "systemctl disable systemd-firstboot.service 2>/dev/null; rm -f /etc/systemd/system/sysinit.target.wants/systemd-firstboot.service; ln -sf /dev/null /etc/systemd/system/systemd-firstboot.service" >/dev/null 2>&1 || true + +# Pre-seed firstboot settings so it won't prompt even if triggered +virt-customize -q -a "$WORK_FILE" --run-command "echo 'Etc/UTC' > /etc/timezone && ln -sf /usr/share/zoneinfo/Etc/UTC /etc/localtime" >/dev/null 2>&1 || true +virt-customize -q -a "$WORK_FILE" --run-command "touch /etc/locale.conf" >/dev/null 2>&1 || true + +if [ "$CLOUD_INIT" == "yes" ]; then + # Cloud-Init handles SSH and login + virt-customize -q -a "$WORK_FILE" --run-command "sed -i 's/^#*PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config" >/dev/null 2>&1 || true + virt-customize -q -a "$WORK_FILE" --run-command "sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config" >/dev/null 2>&1 || true +else + # Configure auto-login on serial console (ttyS0) and virtual console (tty1) + virt-customize -q -a "$WORK_FILE" --run-command "mkdir -p /etc/systemd/system/serial-getty@ttyS0.service.d" >/dev/null 2>&1 || true + virt-customize -q -a "$WORK_FILE" --run-command 'cat > /etc/systemd/system/serial-getty@ttyS0.service.d/autologin.conf << EOF +[Service] +ExecStart= +ExecStart=-/sbin/agetty --autologin root --noclear %I \$TERM +EOF' >/dev/null 2>&1 || true + virt-customize -q -a "$WORK_FILE" --run-command "mkdir -p /etc/systemd/system/getty@tty1.service.d" >/dev/null 2>&1 || true + virt-customize -q -a "$WORK_FILE" --run-command 'cat > /etc/systemd/system/getty@tty1.service.d/autologin.conf << EOF +[Service] +ExecStart= +ExecStart=-/sbin/agetty --autologin root --noclear %I \$TERM +EOF' >/dev/null 2>&1 || true +fi + +msg_ok "Customized image" + +STORAGE_TYPE=$(pvesm status -storage "$STORAGE" | awk 'NR>1 {print $2}') +case $STORAGE_TYPE in +nfs | dir) + DISK_EXT=".qcow2" + DISK_REF="$VMID/" + DISK_IMPORT="-format qcow2" + THIN="" + ;; +btrfs) + DISK_EXT=".raw" + DISK_REF="$VMID/" + DISK_IMPORT="-format raw" + FORMAT=",efitype=4m" + THIN="" + ;; +*) + DISK_EXT="" + DISK_REF="" + DISK_IMPORT="-format raw" + ;; +esac +for i in {0,1}; do + disk="DISK$i" + eval DISK"${i}"=vm-"${VMID}"-disk-"${i}"${DISK_EXT:-} + eval DISK"${i}"_REF="${STORAGE}":"${DISK_REF:-}"${!disk} +done + +msg_info "Creating a Debian 13 VM" +qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ + -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci +pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null +qm importdisk $VMID ${WORK_FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null +if [ "$CLOUD_INIT" == "yes" ]; then + qm set $VMID \ + -efidisk0 ${DISK0_REF}${FORMAT} \ + -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \ + -scsi1 ${STORAGE}:cloudinit \ + -boot order=scsi0 \ + -serial0 socket >/dev/null +else + qm set $VMID \ + -efidisk0 ${DISK0_REF}${FORMAT} \ + -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \ + -boot order=scsi0 \ + -serial0 socket >/dev/null +fi + +# Clean up work file +rm -f "$WORK_FILE" + +DESCRIPTION=$( + cat < + + Logo + + +

Debian VM

+ +

+ + spend Coffee + +

+ + + + GitHub + + + + Discussions + + + + Issues + + +EOF +) +qm set $VMID -description "$DESCRIPTION" >/dev/null +if [ -n "$DISK_SIZE" ]; then + msg_info "Resizing disk to $DISK_SIZE GB" + qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null +else + msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB" + qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null +fi + +msg_ok "Created a Debian 13 VM ${CL}${BL}(${HN})" +if [ "$START_VM" == "yes" ]; then + msg_info "Starting Debian 13 VM" + qm start $VMID + msg_ok "Started Debian 13 VM" +fi + +msg_ok "Completed successfully!\n" +echo "More Info at https://github.com/community-scripts/ProxmoxVE/discussions/836" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/debian-vm.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/debian-vm.sh new file mode 100644 index 000000000..063057a78 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/debian-vm.sh @@ -0,0 +1,590 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) + +function header_info { + clear + cat <<"EOF" + ____ __ _ ______ + / __ \___ / /_ (_)___ _____ < /__ \ + / / / / _ \/ __ \/ / __ `/ __ \ / /__/ / + / /_/ / __/ /_/ / / /_/ / / / / / // __/ +/_____/\___/_.___/_/\__,_/_/ /_/ /_//____/ + +EOF +} +header_info +echo -e "\n Loading..." +GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') +RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" +METHOD="" +NSAPP="debian12vm" +var_os="debian" +var_version="12" + +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +RD=$(echo "\033[01;31m") +BGN=$(echo "\033[4;92m") +GN=$(echo "\033[1;92m") +DGN=$(echo "\033[32m") +CL=$(echo "\033[m") + +CL=$(echo "\033[m") +BOLD=$(echo "\033[1m") +BFR="\\r\\033[K" +HOLD=" " +TAB=" " + +CM="${TAB}âœ”ī¸${TAB}${CL}" +CROSS="${TAB}âœ–ī¸${TAB}${CL}" +INFO="${TAB}💡${TAB}${CL}" +OS="${TAB}đŸ–Ĩī¸${TAB}${CL}" +CONTAINERTYPE="${TAB}đŸ“Ļ${TAB}${CL}" +DISKSIZE="${TAB}💾${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}đŸ› ī¸${TAB}${CL}" +CONTAINERID="${TAB}🆔${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}🌉${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DEFAULT="${TAB}âš™ī¸${TAB}${CL}" +MACADDRESS="${TAB}🔗${TAB}${CL}" +VLANTAG="${TAB}đŸˇī¸${TAB}${CL}" +CREATING="${TAB}🚀${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" +CLOUD="${TAB}â˜ī¸${TAB}${CL}" + +THIN="discard=on,ssd=1," +set -e +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP +function error_handler() { + local exit_code="$?" + local line_number="$1" + local command="$2" + local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}" + post_update_to_api "failed" "${exit_code}" + echo -e "\n$error_message\n" + cleanup_vmid +} + +function get_valid_nextid() { + local try_id + try_id=$(pvesh get /cluster/nextid) + while true; do + if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then + try_id=$((try_id + 1)) + continue + fi + if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then + try_id=$((try_id + 1)) + continue + fi + break + done + echo "$try_id" +} + +function cleanup_vmid() { + if qm status $VMID &>/dev/null; then + qm stop $VMID &>/dev/null + qm destroy $VMID &>/dev/null + fi +} + +function cleanup() { + local exit_code=$? + popd >/dev/null + if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then + if [[ $exit_code -eq 0 ]]; then + post_update_to_api "done" "none" + else + post_update_to_api "failed" "$exit_code" + fi + fi + rm -rf $TEMP_DIR +} + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Debian 12 VM" --yesno "This will create a New Debian 12 VM. Proceed?" 10 58; then + : +else + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit +fi + +function msg_info() { + local msg="$1" + echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR}${CM}${GN}${msg}${CL}" +} + +function msg_error() { + local msg="$1" + echo -e "${BFR}${CROSS}${RD}${msg}${CL}" +} + +function check_root() { + if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then + clear + msg_error "Please run this script as root." + echo -e "\nExiting..." + sleep 2 + exit + fi +} + +# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. +# Supported: Proxmox VE 8.0.x – 8.9.x, 9.0 and 9.1 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x: allow 8.0–8.9 + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 9)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 8.0 – 8.9" + exit 105 + fi + return 0 + fi + + # Check for Proxmox VE 9.x: allow 9.0 and 9.1 + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 1)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 9.0 – 9.1" + exit 105 + fi + return 0 + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0 – 9.1" + exit 105 +} + +function arch_check() { + if [ "$(dpkg --print-architecture)" != "amd64" ]; then + echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" + echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function ssh_check() { + if command -v pveversion >/dev/null 2>&1; then + if [ -n "${SSH_CLIENT:+x}" ]; then + if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then + echo "you've been warned" + else + clear + exit + fi + fi + fi +} + +function exit-script() { + clear + echo -e "\n${CROSS}${RD}User exited script${CL}\n" + exit +} + +function default_settings() { + VMID=$(get_valid_nextid) + FORMAT=",efitype=4m" + MACHINE="" + DISK_SIZE="8G" + DISK_CACHE="" + HN="debian" + CPU_TYPE="" + CORE_COUNT="2" + RAM_SIZE="2048" + BRG="vmbr0" + MAC="$GEN_MAC" + VLAN="" + MTU="" + START_VM="yes" + CLOUD_INIT="no" + METHOD="default" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" + echo -e "${CLOUD}${BOLD}${DGN}Configure Cloud-init: ${BGN}no${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a Debian 12 VM using the above default settings${CL}" +} + +function advanced_settings() { + METHOD="advanced" + [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid) + while true; do + if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VMID" ]; then + VMID=$(get_valid_nextid) + fi + if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then + echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + break + else + exit-script + fi + done + + if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ + "i440fx" "Machine i440fx" ON \ + "q35" "Machine q35" OFF \ + 3>&1 1>&2 2>&3); then + if [ $MACH = q35 ]; then + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT="" + MACHINE=" -machine q35" + else + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT=",efitype=4m" + MACHINE="" + fi + else + exit-script + fi + + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + DISK_SIZE="${DISK_SIZE}G" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + else + echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}" + exit-script + fi + else + exit-script + fi + + if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "None (Default)" ON \ + "1" "Write Through" OFF \ + 3>&1 1>&2 2>&3); then + if [ $DISK_CACHE = "1" ]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}" + DISK_CACHE="cache=writethrough," + else + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + DISK_CACHE="" + fi + else + exit-script + fi + + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 debian --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VM_NAME ]; then + HN="debian" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + else + HN=$(echo ${VM_NAME,,} | tr -d ' ') + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + fi + else + exit-script + fi + + if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "KVM64 (Default)" ON \ + "1" "Host" OFF \ + 3>&1 1>&2 2>&3); then + if [ $CPU_TYPE1 = "1" ]; then + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" + CPU_TYPE=" -cpu host" + else + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + CPU_TYPE="" + fi + else + exit-script + fi + + if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $CORE_COUNT ]; then + CORE_COUNT="2" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + else + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + fi + else + exit-script + fi + + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $RAM_SIZE ]; then + RAM_SIZE="2048" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + else + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + fi + else + exit-script + fi + + if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $BRG ]; then + BRG="vmbr0" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + else + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + fi + else + exit-script + fi + + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MAC1 ]; then + MAC="$GEN_MAC" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" + else + MAC="$MAC1" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}" + fi + else + exit-script + fi + + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VLAN1 ]; then + VLAN1="Default" + VLAN="" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + else + VLAN=",tag=$VLAN1" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + fi + else + exit-script + fi + + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MTU1 ]; then + MTU1="Default" + MTU="" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + else + MTU=",mtu=$MTU1" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + fi + else + exit-script + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "CLOUD-INIT" --yesno "Configure the VM with Cloud-init?" --defaultno 10 58); then + echo -e "${CLOUD}${BOLD}${DGN}Configure Cloud-init: ${BGN}yes${CL}" + CLOUD_INIT="yes" + else + echo -e "${CLOUD}${BOLD}${DGN}Configure Cloud-init: ${BGN}no${CL}" + CLOUD_INIT="no" + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + else + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}" + START_VM="no" + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Debian 12 VM?" --no-button Do-Over 10 58); then + echo -e "${CREATING}${BOLD}${DGN}Creating a Debian 12 VM using the above advanced settings${CL}" + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +check_root +arch_check +pve_check +ssh_check +start_script + +post_to_api_vm + +msg_info "Validating Storage" +while read -r line; do + TAG=$(echo $line | awk '{print $1}') + TYPE=$(echo $line | awk '{printf "%-10s", $2}') + FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1') +VALID=$(pvesm status -content images | awk 'NR>1') +if [ -z "$VALID" ]; then + msg_error "Unable to detect a valid storage location." + exit +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + while [ -z "${STORAGE:+x}" ]; do + STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ + "Which storage pool would you like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." +msg_info "Retrieving the URL for the Debian 12 Qcow2 Disk Image" +if [ "$CLOUD_INIT" == "yes" ]; then + URL=https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.qcow2 +else + URL=https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-nocloud-amd64.qcow2 +fi +sleep 2 +msg_ok "${CL}${BL}${URL}${CL}" +curl -f#SL -o "$(basename "$URL")" "$URL" +echo -en "\e[1A\e[0K" +FILE=$(basename $URL) +msg_ok "Downloaded ${CL}${BL}${FILE}${CL}" + +STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') +case $STORAGE_TYPE in +nfs | dir) + DISK_EXT=".qcow2" + DISK_REF="$VMID/" + DISK_IMPORT="-format qcow2" + THIN="" + ;; +btrfs) + DISK_EXT=".raw" + DISK_REF="$VMID/" + DISK_IMPORT="-format raw" + FORMAT=",efitype=4m" + THIN="" + ;; +*) + DISK_EXT="" + DISK_REF="" + DISK_IMPORT="-format raw" + ;; +esac +for i in {0,1}; do + disk="DISK$i" + eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-} + eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk} +done + +msg_info "Creating a Debian 12 VM" +qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ + -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci +pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null +qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null +if [ "$CLOUD_INIT" == "yes" ]; then + qm set $VMID \ + -efidisk0 ${DISK0_REF}${FORMAT} \ + -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \ + -scsi1 ${STORAGE}:cloudinit \ + -boot order=scsi0 \ + -serial0 socket >/dev/null +else + qm set $VMID \ + -efidisk0 ${DISK0_REF}${FORMAT} \ + -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \ + -boot order=scsi0 \ + -serial0 socket >/dev/null +fi +DESCRIPTION=$( + cat < + + Logo + + +

Debian VM

+ +

+ + spend Coffee + +

+ + + + GitHub + + + + Discussions + + + + Issues + + +EOF +) +qm set "$VMID" -description "$DESCRIPTION" >/dev/null +if [ -n "$DISK_SIZE" ]; then + msg_info "Resizing disk to $DISK_SIZE GB" + qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null +else + msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB" + qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null +fi + +msg_ok "Created a Debian 12 VM ${CL}${BL}(${HN})" +if [ "$START_VM" == "yes" ]; then + msg_info "Starting Debian 12 VM" + qm start $VMID + msg_ok "Started Debian 12 VM" +fi + +msg_ok "Completed successfully!\n" +echo "More Info at https://github.com/community-scripts/ProxmoxVE/discussions/836" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/docker-vm.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/docker-vm.sh new file mode 100644 index 000000000..42fb22091 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/docker-vm.sh @@ -0,0 +1,716 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: thost96 (thost96) | michelroegl-brunner | MickLesk +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE + +# ============================================================================== +# Docker VM - Creates a Docker-ready Virtual Machine +# ============================================================================== + +source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/misc/api.func) 2>/dev/null +source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/misc/vm-core.func) 2>/dev/null +source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/misc/cloud-init.func) 2>/dev/null || true +load_functions + +# ============================================================================== +# SCRIPT VARIABLES +# ============================================================================== +APP="Docker" +APP_TYPE="vm" +NSAPP="docker-vm" +var_os="debian" +var_version="13" + +GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') +RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" +METHOD="" +DISK_SIZE="10G" +USE_CLOUD_INIT="no" +OS_TYPE="" +OS_VERSION="" +THIN="discard=on,ssd=1," + +# ============================================================================== +# ERROR HANDLING & CLEANUP +# ============================================================================== +set -e +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP + +function error_handler() { + local exit_code="$?" + local line_number="$1" + local command="$2" + local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}" + post_update_to_api "failed" "${exit_code}" + echo -e "\n$error_message\n" + cleanup_vmid +} + +# ============================================================================== +# OS SELECTION FUNCTIONS +# ============================================================================== +function select_os() { + if OS_CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SELECT OS" --radiolist \ + "Choose Operating System for Docker VM" 14 68 4 \ + "debian13" "Debian 13 (Trixie) - Latest" ON \ + "debian12" "Debian 12 (Bookworm) - Stable" OFF \ + "ubuntu2404" "Ubuntu 24.04 LTS (Noble)" OFF \ + "ubuntu2204" "Ubuntu 22.04 LTS (Jammy)" OFF \ + 3>&1 1>&2 2>&3); then + case $OS_CHOICE in + debian13) + OS_TYPE="debian" + OS_VERSION="13" + OS_CODENAME="trixie" + OS_DISPLAY="Debian 13 (Trixie)" + ;; + debian12) + OS_TYPE="debian" + OS_VERSION="12" + OS_CODENAME="bookworm" + OS_DISPLAY="Debian 12 (Bookworm)" + ;; + ubuntu2404) + OS_TYPE="ubuntu" + OS_VERSION="24.04" + OS_CODENAME="noble" + OS_DISPLAY="Ubuntu 24.04 LTS" + ;; + ubuntu2204) + OS_TYPE="ubuntu" + OS_VERSION="22.04" + OS_CODENAME="jammy" + OS_DISPLAY="Ubuntu 22.04 LTS" + ;; + esac + echo -e "${OS}${BOLD}${DGN}Operating System: ${BGN}${OS_DISPLAY}${CL}" + else + exit_script + fi +} + +function select_cloud_init() { + if [ "$OS_TYPE" = "ubuntu" ]; then + USE_CLOUD_INIT="yes" + echo -e "${CLOUD:-${TAB}â˜ī¸${TAB}${CL}}${BOLD}${DGN}Cloud-Init: ${BGN}yes (Ubuntu requires Cloud-Init)${CL}" + return + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "CLOUD-INIT" \ + --yesno "Enable Cloud-Init for VM configuration?\n\nCloud-Init allows automatic configuration of:\n- User accounts and passwords\n- SSH keys\n- Network settings (DHCP/Static)\n- DNS configuration\n\nYou can also configure these settings later in Proxmox UI.\n\nNote: Debian without Cloud-Init will use nocloud image with console auto-login." 18 68); then + USE_CLOUD_INIT="yes" + echo -e "${CLOUD:-${TAB}â˜ī¸${TAB}${CL}}${BOLD}${DGN}Cloud-Init: ${BGN}yes${CL}" + else + USE_CLOUD_INIT="no" + echo -e "${CLOUD:-${TAB}â˜ī¸${TAB}${CL}}${BOLD}${DGN}Cloud-Init: ${BGN}no${CL}" + fi +} + +function get_image_url() { + local arch=$(dpkg --print-architecture) + case $OS_TYPE in + debian) + if [ "$USE_CLOUD_INIT" = "yes" ]; then + echo "https://cloud.debian.org/images/cloud/${OS_CODENAME}/latest/debian-${OS_VERSION}-generic-${arch}.qcow2" + else + echo "https://cloud.debian.org/images/cloud/${OS_CODENAME}/latest/debian-${OS_VERSION}-nocloud-${arch}.qcow2" + fi + ;; + ubuntu) + echo "https://cloud-images.ubuntu.com/${OS_CODENAME}/current/${OS_CODENAME}-server-cloudimg-${arch}.img" + ;; + esac +} + +# ============================================================================== +# SETTINGS FUNCTIONS +# ============================================================================== +function default_settings() { + select_os + select_cloud_init + + VMID=$(get_valid_nextid) + FORMAT="" + MACHINE=" -machine q35" + DISK_CACHE="" + DISK_SIZE="10G" + HN="docker" + CPU_TYPE=" -cpu host" + CORE_COUNT="2" + RAM_SIZE="4096" + BRG="vmbr0" + MAC="$GEN_MAC" + VLAN="" + MTU="" + START_VM="yes" + METHOD="default" + + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}Q35 (Modern)${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a Docker VM using the above settings${CL}" +} + +function advanced_settings() { + select_os + select_cloud_init + + # SSH Key selection for Cloud-Init VMs + if [ "$USE_CLOUD_INIT" = "yes" ]; then + configure_cloudinit_ssh_keys || true + fi + + METHOD="advanced" + [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid) + + # VM ID + while true; do + if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VMID" ]; then + VMID=$(get_valid_nextid) + fi + if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then + echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + break + else + exit_script + fi + done + + # Machine Type + if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ + "q35" "Q35 (Modern, PCIe)" ON \ + "i440fx" "i440fx (Legacy, PCI)" OFF \ + 3>&1 1>&2 2>&3); then + if [ $MACH = q35 ]; then + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}Q35 (Modern)${CL}" + FORMAT="" + MACHINE=" -machine q35" + else + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx (Legacy)${CL}" + FORMAT=",efitype=4m" + MACHINE="" + fi + else + exit_script + fi + + # Disk Size + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + DISK_SIZE="${DISK_SIZE}G" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + else + echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}" + exit_script + fi + else + exit_script + fi + + # Disk Cache + if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "None (Default)" ON \ + "1" "Write Through" OFF \ + 3>&1 1>&2 2>&3); then + if [ $DISK_CACHE = "1" ]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}" + DISK_CACHE="cache=writethrough," + else + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + DISK_CACHE="" + fi + else + exit_script + fi + + # Hostname + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 docker --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VM_NAME ]; then + HN="docker" + else + HN=$(echo ${VM_NAME,,} | tr -d ' ') + fi + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + else + exit_script + fi + + # CPU Model + if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "1" "Host (Recommended)" ON \ + "0" "KVM64" OFF \ + 3>&1 1>&2 2>&3); then + if [ $CPU_TYPE1 = "1" ]; then + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" + CPU_TYPE=" -cpu host" + else + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + CPU_TYPE="" + fi + else + exit_script + fi + + # CPU Cores + if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $CORE_COUNT ]; then + CORE_COUNT="2" + fi + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + else + exit_script + fi + + # RAM Size + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 4096 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $RAM_SIZE ]; then + RAM_SIZE="4096" + fi + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + else + exit_script + fi + + # Bridge + if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $BRG ]; then + BRG="vmbr0" + fi + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + else + exit_script + fi + + # MAC Address + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MAC1 ]; then + MAC="$GEN_MAC" + else + MAC="$MAC1" + fi + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" + else + exit_script + fi + + # VLAN + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan (leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VLAN1 ]; then + VLAN1="Default" + VLAN="" + else + VLAN=",tag=$VLAN1" + fi + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + else + exit_script + fi + + # MTU + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MTU1 ]; then + MTU1="Default" + MTU="" + else + MTU=",mtu=$MTU1" + fi + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + else + exit_script + fi + + # Start VM + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + else + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}" + START_VM="no" + fi + + # Confirm + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Docker VM?" --no-button Do-Over 10 58); then + echo -e "${CREATING}${BOLD}${DGN}Creating a Docker VM using the above advanced settings${CL}" + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +# ============================================================================== +# MAIN EXECUTION +# ============================================================================== +header_info + +check_root +arch_check +pve_check + +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Docker VM" --yesno "This will create a New Docker VM. Proceed?" 10 58; then + : +else + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit +fi + +start_script +post_to_api_vm + +# ============================================================================== +# STORAGE SELECTION +# ============================================================================== +msg_info "Validating Storage" +while read -r line; do + TAG=$(echo $line | awk '{print $1}') + TYPE=$(echo $line | awk '{printf "%-10s", $2}') + FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1') + +VALID=$(pvesm status -content images | awk 'NR>1') +if [ -z "$VALID" ]; then + msg_error "Unable to detect a valid storage location." + exit +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi + printf "\e[?25h" + while [ -z "${STORAGE:+x}" ]; do + STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ + "Which storage pool would you like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." + +# ============================================================================== +# PREREQUISITES +# ============================================================================== +if ! command -v virt-customize &>/dev/null; then + msg_info "Installing libguestfs-tools" + apt-get -qq update >/dev/null + apt-get -qq install libguestfs-tools lsb-release -y >/dev/null + apt-get -qq install dhcpcd-base -y >/dev/null 2>&1 || true + msg_ok "Installed libguestfs-tools" +fi + +# ============================================================================== +# IMAGE DOWNLOAD +# ============================================================================== +msg_info "Retrieving the URL for the ${OS_DISPLAY} Qcow2 Disk Image" +URL=$(get_image_url) +CACHE_DIR="/var/lib/vz/template/cache" +CACHE_FILE="$CACHE_DIR/$(basename "$URL")" +mkdir -p "$CACHE_DIR" +msg_ok "${CL}${BL}${URL}${CL}" + +if [[ ! -s "$CACHE_FILE" ]]; then + curl -f#SL -o "$CACHE_FILE" "$URL" + echo -en "\e[1A\e[0K" + msg_ok "Downloaded ${CL}${BL}$(basename "$CACHE_FILE")${CL}" +else + msg_ok "Using cached image ${CL}${BL}$(basename "$CACHE_FILE")${CL}" +fi + +# ============================================================================== +# STORAGE TYPE DETECTION +# ============================================================================== +STORAGE_TYPE=$(pvesm status -storage "$STORAGE" | awk 'NR>1 {print $2}') +case $STORAGE_TYPE in +nfs | dir) + DISK_EXT=".qcow2" + DISK_REF="$VMID/" + DISK_IMPORT="--format qcow2" + THIN="" + ;; +btrfs) + DISK_EXT=".raw" + DISK_REF="$VMID/" + DISK_IMPORT="--format raw" + FORMAT=",efitype=4m" + THIN="" + ;; +*) + DISK_EXT="" + DISK_REF="" + DISK_IMPORT="--format raw" + ;; +esac + +# ============================================================================== +# IMAGE CUSTOMIZATION WITH DOCKER +# ============================================================================== +msg_info "Preparing ${OS_DISPLAY} image with Docker" + +WORK_FILE=$(mktemp --suffix=.qcow2) +cp "$CACHE_FILE" "$WORK_FILE" + +export LIBGUESTFS_BACKEND_SETTINGS=dns=8.8.8.8,1.1.1.1 + +DOCKER_PREINSTALLED="no" + +# Install qemu-guest-agent and Docker during image customization +msg_info "Installing base packages in image" +if virt-customize -a "$WORK_FILE" --install qemu-guest-agent,curl,ca-certificates >/dev/null 2>&1; then + msg_ok "Installed base packages" + + msg_info "Installing Docker (this may take 2-5 minutes)" + if virt-customize -q -a "$WORK_FILE" --run-command "curl -fsSL https://get.docker.com | sh" >/dev/null 2>&1 && + virt-customize -q -a "$WORK_FILE" --run-command "systemctl enable docker" >/dev/null 2>&1; then + msg_ok "Installed Docker" + + msg_info "Configuring Docker daemon" + # Optimize Docker daemon configuration + virt-customize -q -a "$WORK_FILE" --run-command "mkdir -p /etc/docker" >/dev/null 2>&1 + virt-customize -q -a "$WORK_FILE" --run-command 'cat > /etc/docker/daemon.json << EOF +{ + "storage-driver": "overlay2", + "log-driver": "json-file", + "log-opts": { + "max-size": "10m", + "max-file": "3" + } +} +EOF' >/dev/null 2>&1 + DOCKER_PREINSTALLED="yes" + msg_ok "Configured Docker daemon" + else + msg_ok "Docker will be installed on first boot" + fi +else + msg_ok "Packages will be installed on first boot" +fi + +msg_info "Finalizing image (hostname, SSH config)" +# Set hostname and prepare for unique machine-id +virt-customize -q -a "$WORK_FILE" --hostname "${HN}" >/dev/null 2>&1 || true +virt-customize -q -a "$WORK_FILE" --run-command "truncate -s 0 /etc/machine-id" >/dev/null 2>&1 || true +virt-customize -q -a "$WORK_FILE" --run-command "rm -f /var/lib/dbus/machine-id" >/dev/null 2>&1 || true + +# Configure SSH for Cloud-Init +if [ "$USE_CLOUD_INIT" = "yes" ]; then + virt-customize -q -a "$WORK_FILE" --run-command "sed -i 's/^#*PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config" >/dev/null 2>&1 || true + virt-customize -q -a "$WORK_FILE" --run-command "sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config" >/dev/null 2>&1 || true +else + # Configure auto-login for nocloud images (no Cloud-Init) + virt-customize -q -a "$WORK_FILE" --run-command "mkdir -p /etc/systemd/system/serial-getty@ttyS0.service.d" >/dev/null 2>&1 || true + virt-customize -q -a "$WORK_FILE" --run-command 'cat > /etc/systemd/system/serial-getty@ttyS0.service.d/autologin.conf << EOF +[Service] +ExecStart= +ExecStart=-/sbin/agetty --autologin root --noclear %I \$TERM +EOF' >/dev/null 2>&1 || true + virt-customize -q -a "$WORK_FILE" --run-command "mkdir -p /etc/systemd/system/getty@tty1.service.d" >/dev/null 2>&1 || true + virt-customize -q -a "$WORK_FILE" --run-command 'cat > /etc/systemd/system/getty@tty1.service.d/autologin.conf << EOF +[Service] +ExecStart= +ExecStart=-/sbin/agetty --autologin root --noclear %I \$TERM +EOF' >/dev/null 2>&1 || true +fi +msg_ok "Finalized image" + +# Create first-boot Docker install script (fallback if virt-customize failed) +if [ "$DOCKER_PREINSTALLED" = "no" ]; then + if virt-customize -q -a "$WORK_FILE" --run-command 'cat > /root/install-docker.sh << "DOCKERSCRIPT" +#!/bin/bash +exec > /var/log/install-docker.log 2>&1 +echo "[$(date)] Starting Docker installation" + +for i in {1..30}; do + ping -c 1 8.8.8.8 >/dev/null 2>&1 && break + sleep 2 +done + +apt-get update +apt-get install -y qemu-guest-agent curl ca-certificates +curl -fsSL https://get.docker.com | sh +systemctl enable docker +systemctl start docker + +mkdir -p /etc/docker +cat > /etc/docker/daemon.json << DAEMON +{ + "storage-driver": "overlay2", + "log-driver": "json-file", + "log-opts": { "max-size": "10m", "max-file": "3" } +} +DAEMON +systemctl restart docker + +touch /root/.docker-installed +echo "[$(date)] Docker installation completed" +DOCKERSCRIPT +chmod +x /root/install-docker.sh' >/dev/null 2>&1; then + + virt-customize -q -a "$WORK_FILE" --run-command 'cat > /etc/systemd/system/install-docker.service << "DOCKERSERVICE" +[Unit] +Description=Install Docker on First Boot +After=network-online.target +Wants=network-online.target +ConditionPathExists=!/root/.docker-installed + +[Service] +Type=oneshot +ExecStart=/root/install-docker.sh +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target +DOCKERSERVICE +systemctl enable install-docker.service' >/dev/null 2>&1 || true + else + msg_warn "virt-customize failed for this image. Docker must be installed manually after first boot:" + msg_warn " curl -fsSL https://get.docker.com | sh" + fi +fi + +# Resize disk to target size +msg_info "Resizing disk image to ${DISK_SIZE}" +qemu-img resize "$WORK_FILE" "${DISK_SIZE}" >/dev/null 2>&1 +msg_ok "Resized disk image" + +# ============================================================================== +# VM CREATION +# ============================================================================== +msg_info "Creating Docker VM shell" + +qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ + -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci >/dev/null + +msg_ok "Created VM shell" + +# ============================================================================== +# DISK IMPORT +# ============================================================================== +msg_info "Importing disk into storage ($STORAGE)" + +if qm disk import --help >/dev/null 2>&1; then + IMPORT_CMD=(qm disk import) +else + IMPORT_CMD=(qm importdisk) +fi + +IMPORT_OUT="$("${IMPORT_CMD[@]}" "$VMID" "$WORK_FILE" "$STORAGE" ${DISK_IMPORT:-} 2>&1 || true)" +DISK_REF_IMPORTED="$(printf '%s\n' "$IMPORT_OUT" | sed -n "s/.*successfully imported disk '\([^']\+\)'.*/\1/p" | tr -d "\r\"'")" +[[ -z "$DISK_REF_IMPORTED" ]] && DISK_REF_IMPORTED="$(pvesm list "$STORAGE" | awk -v id="$VMID" '$5 ~ ("vm-"id"-disk-") {print $1":"$5}' | sort | tail -n1)" +[[ -z "$DISK_REF_IMPORTED" ]] && { + msg_error "Unable to determine imported disk reference." + echo "$IMPORT_OUT" + exit 226 +} + +msg_ok "Imported disk (${CL}${BL}${DISK_REF_IMPORTED}${CL})" + +# Clean up work file +rm -f "$WORK_FILE" + +# ============================================================================== +# VM CONFIGURATION +# ============================================================================== +msg_info "Attaching EFI and root disk" + +qm set "$VMID" \ + --efidisk0 "${STORAGE}:0,efitype=4m" \ + --scsi0 "${DISK_REF_IMPORTED},${DISK_CACHE}${THIN%,}" \ + --boot order=scsi0 \ + --serial0 socket >/dev/null + +qm set $VMID --agent enabled=1 >/dev/null + +msg_ok "Attached EFI and root disk" + +# Set VM description +set_description + +# Cloud-Init configuration +if [ "$USE_CLOUD_INIT" = "yes" ]; then + msg_info "Configuring Cloud-Init" + setup_cloud_init "$VMID" "$STORAGE" "$HN" "yes" + msg_ok "Cloud-Init configured" +fi + +# Start VM +if [ "$START_VM" == "yes" ]; then + msg_info "Starting Docker VM" + qm start $VMID >/dev/null 2>&1 + msg_ok "Started Docker VM" +fi + +# ============================================================================== +# FINAL OUTPUT +# ============================================================================== +VM_IP="" +if [ "$START_VM" == "yes" ]; then + set +e + for i in {1..10}; do + VM_IP=$(qm guest cmd "$VMID" network-get-interfaces 2>/dev/null | + jq -r '.[] | select(.name != "lo") | ."ip-addresses"[]? | select(."ip-address-type" == "ipv4") | ."ip-address"' 2>/dev/null | + grep -v "^127\." | head -1) || true + [ -n "$VM_IP" ] && break + sleep 3 + done + set -e +fi + +echo -e "\n${INFO}${BOLD}${GN}Docker VM Configuration Summary:${CL}" +echo -e "${TAB}${DGN}VM ID: ${BGN}${VMID}${CL}" +echo -e "${TAB}${DGN}Hostname: ${BGN}${HN}${CL}" +echo -e "${TAB}${DGN}OS: ${BGN}${OS_DISPLAY}${CL}" +[ -n "$VM_IP" ] && echo -e "${TAB}${DGN}IP Address: ${BGN}${VM_IP}${CL}" + +if [ "$DOCKER_PREINSTALLED" = "yes" ]; then + echo -e "${TAB}${DGN}Docker: ${BGN}Pre-installed (via get.docker.com)${CL}" +else + echo -e "${TAB}${DGN}Docker: ${BGN}Installing on first boot${CL}" + echo -e "${TAB}${YW}âš ī¸ Wait 2-3 minutes for installation to complete${CL}" + echo -e "${TAB}${YW}âš ī¸ Check progress: ${BL}cat /var/log/install-docker.log${CL}" +fi + +if [ "$USE_CLOUD_INIT" = "yes" ]; then + display_cloud_init_info "$VMID" "$HN" 2>/dev/null || true +fi + +post_update_to_api "done" "none" +msg_ok "Completed successfully!\n" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/haos-vm.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/haos-vm.sh new file mode 100644 index 000000000..f0d58afe8 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/haos-vm.sh @@ -0,0 +1,661 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) + +function header_info { + clear + cat <<"EOF" + __ __ ___ _ __ __ ____ _____ + / / / /___ ____ ___ ___ / | __________(_)____/ /_____ _____ / /_ / __ \/ ___/ + / /_/ / __ \/ __ `__ \/ _ \ / /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/ / / / /\__ \ + / __ / /_/ / / / / / / __/ / ___ |(__ |__ ) (__ ) /_/ /_/ / / / / /_ / /_/ /___/ / +/_/ /_/\____/_/ /_/ /_/\___/ /_/ |_/____/____/_/____/\__/\__,_/_/ /_/\__/ \____//____/ + +EOF +} +header_info +echo -e "\n Loading..." +GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') +RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" +VERSIONS=(stable beta dev) +METHOD="" +NSAPP="homeassistant-os" +var_os="homeassistant" +DISK_SIZE="32G" + +for version in "${VERSIONS[@]}"; do + eval "$version=$(curl -fsSL https://raw.githubusercontent.com/home-assistant/version/master/stable.json | grep '"ova"' | cut -d '"' -f 4)" +done +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +HA=$(echo "\033[1;34m") +RD=$(echo "\033[01;31m") +BGN=$(echo "\033[4;92m") +GN=$(echo "\033[1;92m") +DGN=$(echo "\033[32m") +CL=$(echo "\033[m") + +BOLD=$(echo "\033[1m") +BFR="\\r\\033[K" +HOLD=" " +TAB=" " + +CM="${TAB}âœ”ī¸${TAB}${CL}" +CROSS="${TAB}âœ–ī¸${TAB}${CL}" +INFO="${TAB}💡${TAB}${CL}" +OS="${TAB}đŸ–Ĩī¸${TAB}${CL}" +CONTAINERTYPE="${TAB}đŸ“Ļ${TAB}${CL}" +DISKSIZE="${TAB}💾${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}đŸ› ī¸${TAB}${CL}" +CONTAINERID="${TAB}🆔${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}🌉${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DEFAULT="${TAB}âš™ī¸${TAB}${CL}" +MACADDRESS="${TAB}🔗${TAB}${CL}" +VLANTAG="${TAB}đŸˇī¸${TAB}${CL}" +CREATING="${TAB}🚀${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" +CLOUD="${TAB}â˜ī¸${TAB}${CL}" + +THIN="discard=on,ssd=1," +set -e +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP +function error_handler() { + local exit_code="$?" + local line_number="$1" + local command="$2" + local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}" + post_update_to_api "failed" "${exit_code}" + echo -e "\n$error_message\n" + cleanup_vmid +} + +function get_valid_nextid() { + local try_id + try_id=$(pvesh get /cluster/nextid) + while true; do + if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then + try_id=$((try_id + 1)) + continue + fi + if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then + try_id=$((try_id + 1)) + continue + fi + break + done + echo "$try_id" +} + +function cleanup_vmid() { + if qm status $VMID &>/dev/null; then + qm stop $VMID &>/dev/null + qm destroy $VMID &>/dev/null + fi +} + +function cleanup() { + local exit_code=$? + popd >/dev/null + # Only send telemetry if post_to_api_vm was called (installing status was sent) + if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then + if [[ $exit_code -eq 0 ]]; then + post_update_to_api "done" "none" + else + post_update_to_api "failed" "$exit_code" + fi + fi + rm -rf $TEMP_DIR +} + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Homeassistant OS VM" --yesno "This will create a New Homeassistant OS VM. Proceed?" 10 58; then + : +else + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit +fi + +function msg_info() { + local msg="$1" + echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR}${CM}${GN}${msg}${CL}" +} + +function msg_error() { + local msg="$1" + echo -e "${BFR}${CROSS}${RD}${msg}${CL}" +} + +function check_root() { + if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then + clear + msg_error "Please run this script as root." + echo -e "\nExiting..." + sleep 2 + exit + fi +} + +# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. +# Supported: Proxmox VE 8.0.x – 8.9.x, 9.0 and 9.1 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x: allow 8.0–8.9 + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 9)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 8.0 – 8.9" + exit 105 + fi + return 0 + fi + + # Check for Proxmox VE 9.x: allow 9.0 and 9.1 + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 1)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 9.0 – 9.1" + exit 105 + fi + return 0 + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0 – 9.1" + exit 105 +} + +function arch_check() { + if [ "$(dpkg --print-architecture)" != "amd64" ]; then + echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" + echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function ssh_check() { + if command -v pveversion >/dev/null 2>&1; then + if [ -n "${SSH_CLIENT:+x}" ]; then + if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then + echo "you've been warned" + else + clear + exit + fi + fi + fi +} + +function exit-script() { + clear + echo -e "\n${CROSS}${RD}User exited script${CL}\n" + exit +} + +# Ensure pv is installed or abort with instructions +function ensure_pv() { + if ! command -v pv &>/dev/null; then + msg_info "Installing required package: pv" + if ! apt-get update -qq &>/dev/null || ! apt-get install -y pv &>/dev/null; then + msg_error "Failed to install pv automatically." + echo -e "\nPlease run manually on the Proxmox host:\n apt install pv\n" + exit 237 + fi + msg_ok "Installed pv" + fi +} + +# Download an .xz file and validate it +# Args: $1=url $2=cache_file +function download_and_validate_xz() { + local url="$1" + local file="$2" + + # If file exists, check validity + if [[ -s "$file" ]]; then + if xz -t "$file" &>/dev/null; then + msg_ok "Using cached image $(basename "$file")" + return 0 + else + msg_error "Cached file $(basename "$file") is corrupted. Deleting and retrying download..." + rm -f "$file" + fi + fi + + # Download fresh file + msg_info "Downloading image: $(basename "$file")" + if ! curl -fSL -o "$file" "$url"; then + msg_error "Download failed: $url" + rm -f "$file" + exit 115 + fi + + # Validate again + if ! xz -t "$file" &>/dev/null; then + msg_error "Downloaded file $(basename "$file") is corrupted. Please try again later." + rm -f "$file" + exit 115 + fi + msg_ok "Downloaded and validated $(basename "$file")" +} + +# Extract .xz with pv +# Args: $1=cache_file $2=target_img +function extract_xz_with_pv() { + set -o pipefail + local file="$1" + local target="$2" + + msg_info "Decompressing $(basename "$file") to $target" + if ! xz -dc "$file" | pv -N "Extracting" >"$target"; then + msg_error "Failed to extract $file" + rm -f "$target" + exit 115 + fi + msg_ok "Decompressed to $target" +} + +function default_settings() { + BRANCH="$stable" + VMID=$(get_valid_nextid) + MACHINE="q35" + FORMAT="" + DISK_SIZE="32G" + HN="haos-${BRANCH}" + CPU_TYPE="" + CORE_COUNT="2" + RAM_SIZE="4096" + BRG="vmbr0" + MAC="$GEN_MAC" + VLAN="" + MTU="" + START_VM="yes" + METHOD="default" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}q35${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a Homeassistant OS VM using the above default settings${CL}" +} + +function advanced_settings() { + METHOD="advanced" + if BRANCH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Homeassistant OS Version" --radiolist "Choose Version" --cancel-button Exit-Script 10 58 3 \ + "$stable" "Stable " ON \ + "$beta" "Beta " OFF \ + "$dev" "Dev " OFF \ + 3>&1 1>&2 2>&3); then + var_version="${BRANCH}" + echo -e "${DGN}Using HAOS Version: ${BGN}$BRANCH${CL}" + else + exit-script + fi + + [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid) + while true; do + if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VMID" ]; then + VMID=$(get_valid_nextid) + fi + if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then + echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + break + else + exit-script + fi + done + + if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Machine Type" 10 58 2 \ + "q35" "Modern (PCIe, UEFI, default)" ON \ + "i440fx" "Legacy (older compatibility)" OFF \ + 3>&1 1>&2 2>&3); then + if [ "$MACH" = "q35" ]; then + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}q35${CL}" + FORMAT="" + MACHINE=" -machine q35" + else + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}" + FORMAT=",efitype=4m" + MACHINE="" + fi + else + exit-script + fi + + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + DISK_SIZE="${DISK_SIZE}G" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + else + echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}" + exit-script + fi + else + exit-script + fi + + if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "None" OFF \ + "1" "Write Through (Default)" ON \ + 3>&1 1>&2 2>&3); then + if [ $DISK_CACHE = "1" ]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}" + DISK_CACHE="cache=writethrough," + else + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + DISK_CACHE="" + fi + else + exit-script + fi + + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 haos${BRANCH} --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VM_NAME ]; then + HN="haos${BRANCH}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + else + HN=$(echo ${VM_NAME,,} | tr -d ' ') + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + fi + else + exit-script + fi + + if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose CPU Model" --cancel-button Exit-Script 10 58 2 \ + "KVM64" "Default – safe for migration/compatibility" ON \ + "Host" "Use host CPU features (faster, no migration)" OFF \ + 3>&1 1>&2 2>&3); then + case "$CPU_TYPE1" in + Host) + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" + CPU_TYPE=" -cpu host" + ;; + *) + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + CPU_TYPE="" + ;; + esac + else + exit-script + fi + + if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $CORE_COUNT ]; then + CORE_COUNT="2" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + else + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + fi + else + exit-script + fi + + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $RAM_SIZE ]; then + RAM_SIZE="4096" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + else + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + fi + else + exit-script + fi + + if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $BRG ]; then + BRG="vmbr0" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + else + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + fi + else + exit-script + fi + + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MAC1 ]; then + MAC="$GEN_MAC" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" + else + MAC="$MAC1" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}" + fi + else + exit-script + fi + + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VLAN1 ]; then + VLAN1="Default" + VLAN="" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + else + VLAN=",tag=$VLAN1" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + fi + else + exit-script + fi + + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MTU1 ]; then + MTU1="Default" + MTU="" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + else + MTU=",mtu=$MTU1" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + fi + else + exit-script + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + echo -e "${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + else + echo -e "${DGN}Start VM when completed: ${BGN}no${CL}" + START_VM="no" + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create Homeassistant OS ${BRANCH} VM?" --no-button Do-Over 10 58); then + echo -e "${RD}Creating a Homeassistant OS VM using the above advanced settings${CL}" + else + header_info + echo -e "${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +check_root +arch_check +pve_check +ssh_check +ensure_pv +start_script +post_to_api_vm + +msg_info "Validating Storage" +while read -r line; do + TAG=$(echo $line | awk '{print $1}') + TYPE=$(echo $line | awk '{printf "%-10s", $2}') + FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1') +VALID=$(pvesm status -content images | awk 'NR>1') +if [ -z "$VALID" ]; then + msg_error "Unable to detect a valid storage location." + exit +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + while [ -z "${STORAGE:+x}" ]; do + if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi + printf "\e[?25h" + STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ + "Which storage pool would you like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." + +var_version="${BRANCH}" +msg_info "Retrieving the URL for Home Assistant ${BRANCH} Disk Image" +if [ "$BRANCH" == "$dev" ]; then + URL="https://os-artifacts.home-assistant.io/${BRANCH}/haos_ova-${BRANCH}.qcow2.xz" +else + URL="https://github.com/home-assistant/operating-system/releases/download/${BRANCH}/haos_ova-${BRANCH}.qcow2.xz" +fi + +CACHE_DIR="/var/lib/vz/template/cache" +CACHE_FILE="$CACHE_DIR/$(basename "$URL")" +FILE_IMG="/var/lib/vz/template/tmp/${CACHE_FILE##*/%.xz}" # .qcow2 + +mkdir -p "$CACHE_DIR" "$(dirname "$FILE_IMG")" +msg_ok "${CL}${BL}${URL}${CL}" + +download_and_validate_xz "$URL" "$CACHE_FILE" + +msg_info "Creating Home Assistant OS VM shell" +qm create $VMID -machine q35 -bios ovmf -agent 1 -tablet 0 -localtime 1 ${CPU_TYPE} \ + -cores "$CORE_COUNT" -memory "$RAM_SIZE" -name "$HN" -tags community-script \ + -net0 "virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU" -onboot 1 -ostype l26 -scsihw virtio-scsi-pci >/dev/null +msg_ok "Created VM shell" + +extract_xz_with_pv "$CACHE_FILE" "$FILE_IMG" + +msg_info "Importing disk into storage ($STORAGE)" +if qm disk import --help >/dev/null 2>&1; then + IMPORT_CMD=(qm disk import) +else + IMPORT_CMD=(qm importdisk) +fi +IMPORT_OUT="$("${IMPORT_CMD[@]}" "$VMID" "$FILE_IMG" "$STORAGE" --format raw 2>&1 || true)" +DISK_REF="$(printf '%s\n' "$IMPORT_OUT" | sed -n "s/.*successfully imported disk '\([^']\+\)'.*/\1/p" | tr -d "\r\"'")" +[[ -z "$DISK_REF" ]] && DISK_REF="$(pvesm list "$STORAGE" | awk -v id="$VMID" '$5 ~ ("vm-"id"-disk-") {print $1":"$5}' | sort | tail -n1)" +[[ -z "$DISK_REF" ]] && { + msg_error "Unable to determine imported disk reference." + echo "$IMPORT_OUT" + exit 226 +} +msg_ok "Imported disk (${CL}${BL}${DISK_REF}${CL})" + +rm -f "$FILE_IMG" + +msg_info "Attaching EFI and root disk" +qm set $VMID \ + --efidisk0 ${STORAGE}:0,efitype=4m \ + --scsi0 ${DISK_REF},ssd=1,discard=on \ + --boot order=scsi0 \ + --serial0 socket >/dev/null +qm set $VMID --agent enabled=1 >/dev/null +msg_ok "Attached EFI and root disk" + +msg_info "Resizing disk to $DISK_SIZE" +qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null +msg_ok "Resized disk" + +DESCRIPTION=$( + cat < + + Logo + + +

Homeassistant OS VM

+ +

+ + spend Coffee + +

+ + + + GitHub + + + + Discussions + + + + Issues + + +EOF +) +qm set $VMID -description "$DESCRIPTION" >/dev/null +msg_ok "Created Homeassistant OS VM ${CL}${BL}(${HN})" + +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Image Cache" \ + --yesno "Keep downloaded Home Assistant OS image for future VMs?\n\nFile: $CACHE_FILE" 10 70; then + msg_ok "Keeping cached image" +else + rm -f "$CACHE_FILE" + msg_ok "Deleted cached image" +fi + +if [ "$START_VM" == "yes" ]; then + msg_info "Starting Home Assistant OS VM" + qm start $VMID + msg_ok "Started Home Assistant OS VM" +fi +post_update_to_api "done" "none" +msg_ok "Completed successfully!\n" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/headers/docker-vm b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/headers/docker-vm new file mode 100644 index 000000000..907ffbaef --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/headers/docker-vm @@ -0,0 +1,6 @@ + ____ __ + / __ \____ _____/ /_____ _____ + / / / / __ \/ ___/ //_/ _ \/ ___/ + / /_/ / /_/ / /__/ ,< / __/ / +/_____/\____/\___/_/|_|\___/_/ + diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/headers/olares-vm b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/headers/olares-vm new file mode 100644 index 000000000..bf28b330a --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/headers/olares-vm @@ -0,0 +1,7 @@ + ____ __ _ + / __ \/ /___ ____ ___ (_)___ ____ _ + / / / / / __ \/ __ `__ \/ / __ \/ __ `/ +/ /_/ / / /_/ / / / / / / / / / / /_/ / +\____/_/\____/_/ /_/ /_/_/_/ /_/\__,_/ + + Personal Cloud OS - Kubernetes Powered diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/headers/owncloud-vm b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/headers/owncloud-vm new file mode 100644 index 000000000..54d663d75 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/headers/owncloud-vm @@ -0,0 +1,6 @@ + ______ __ __ ________ __ _ ____ ___ + /_ __/_ ___________ / //_/__ __ __ ____ _ ______ / ____/ /___ __ ______/ / | | / / |/ / + / / / / / / ___/ __ \/ ,< / _ \/ / / / / __ \ | /| / / __ \/ / / / __ \/ / / / __ / | | / / /|_/ / + / / / /_/ / / / / / / /| / __/ /_/ / / /_/ / |/ |/ / / / / /___/ / /_/ / /_/ / /_/ / | |/ / / / / +/_/ \__,_/_/ /_/ /_/_/ |_\___/\__, / \____/|__/|__/_/ /_/\____/_/\____/\__,_/\__,_/ |___/_/ /_/ + /____/ diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/mikrotik-routeros.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/mikrotik-routeros.sh new file mode 100644 index 000000000..eb0532d6a --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/mikrotik-routeros.sh @@ -0,0 +1,643 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT +# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) + +function header_info { + clear + cat <<"EOF" + __ ____ __ __ _ __ ____ __ ____ _____ ________ ______ + / |/ (_) /___________ / /_(_) /__ / __ \____ __ __/ /____ _____/ __ \/ ___/ / ____/ / / / __ \ + / /|_/ / / //_/ ___/ __ \/ __/ / //_/ / /_/ / __ \/ / / / __/ _ \/ ___/ / / /\__ \ / / / /_/ / /_/ / + / / / / / ,< / / / /_/ / /_/ / ,< / _, _/ /_/ / /_/ / /_/ __/ / / /_/ /___/ / / /___/ __ / _, _/ +/_/ /_/_/_/|_/_/ \____/\__/_/_/|_| /_/ |_|\____/\__,_/\__/\___/_/ \____//____/ \____/_/ /_/_/ |_| + +EOF +} +header_info +echo -e "Loading..." +GEN_MAC=$(echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /:/g' | tr '[:lower:]' '[:upper:]') +RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" +METHOD="" +NSAPP="mikrotik-router-os" +var_os="mikrotik" +var_version=" " +DISK_SIZE="1G" +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +RD=$(echo "\033[01;31m") +BGN=$(echo "\033[4;92m") +GN=$(echo "\033[1;92m") +DGN=$(echo "\033[32m") +CL=$(echo "\033[m") + +CL=$(echo "\033[m") +BOLD=$(echo "\033[1m") +BFR="\\r\\033[K" +HOLD=" " +TAB=" " + +CM="${TAB}âœ”ī¸${TAB}${CL}" +CROSS="${TAB}âœ–ī¸${TAB}${CL}" +INFO="${TAB}💡${TAB}${CL}" +OS="${TAB}đŸ–Ĩī¸${TAB}${CL}" +CONTAINERTYPE="${TAB}đŸ“Ļ${TAB}${CL}" +DISKSIZE="${TAB}💾${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}đŸ› ī¸${TAB}${CL}" +CONTAINERID="${TAB}🆔${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}🌉${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DEFAULT="${TAB}âš™ī¸${TAB}${CL}" +MACADDRESS="${TAB}🔗${TAB}${CL}" +VLANTAG="${TAB}đŸˇī¸${TAB}${CL}" +CREATING="${TAB}🚀${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" +CLOUD="${TAB}â˜ī¸${TAB}${CL}" + +THIN="discard=on,ssd=1," +set -e +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP +function error_handler() { + local exit_code="$?" + local line_number="$1" + local command="$2" + local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}" + post_update_to_api "failed" "${exit_code}" + echo -e "\n$error_message\n" + cleanup_vmid +} + +function get_valid_nextid() { + local try_id + try_id=$(pvesh get /cluster/nextid) + while true; do + if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then + try_id=$((try_id + 1)) + continue + fi + if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then + try_id=$((try_id + 1)) + continue + fi + break + done + echo "$try_id" +} + +function cleanup_vmid() { + if qm status $VMID &>/dev/null; then + qm stop $VMID &>/dev/null + qm destroy $VMID &>/dev/null + fi +} + +function cleanup() { + local exit_code=$? + popd >/dev/null + if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then + if [[ $exit_code -eq 0 ]]; then + post_update_to_api "done" "none" + else + post_update_to_api "failed" "$exit_code" + fi + fi + rm -rf $TEMP_DIR +} + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Mikrotik RouterOS CHR VM" --yesno "This will create a Mikrotik RouterOS CHR VM. Proceed?" 10 58; then + : +else + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit +fi + +function msg_info() { + local msg="$1" + echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR}${CM}${GN}${msg}${CL}" +} + +function msg_error() { + local msg="$1" + echo -e "${BFR}${CROSS}${RD}${msg}${CL}" +} + +function check_root() { + if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then + clear + msg_error "Please run this script as root." + echo -e "\nExiting..." + sleep 2 + exit + fi +} + +# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. +# Supported: Proxmox VE 8.0.x – 8.9.x, 9.0 and 9.1 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x: allow 8.0–8.9 + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 9)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 8.0 – 8.9" + exit 105 + fi + return 0 + fi + + # Check for Proxmox VE 9.x: allow 9.0 and 9.1 + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 1)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 9.0 – 9.1" + exit 105 + fi + return 0 + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0 – 9.1" + exit 105 +} + +function arch_check() { + if [ "$(dpkg --print-architecture)" != "amd64" ]; then + echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" + echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function ssh_check() { + if command -v pveversion >/dev/null 2>&1; then + if [ -n "${SSH_CLIENT:+x}" ]; then + if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then + echo "you've been warned" + else + clear + exit + fi + fi + fi +} + +function exit-script() { + clear + echo -e "\n${CROSS}${RD}User exited script${CL}\n" + exit +} + +function default_settings() { + VMID=$(get_valid_nextid) + FORMAT=",efitype=4m" + MACHINE="" + DISK_SIZE="8G" + DISK_CACHE="" + HN="mikrotik-routeros-chr" + CPU_TYPE="" + CORE_COUNT="2" + RAM_SIZE="512" + BRG="vmbr0" + MAC="$GEN_MAC" + VLAN="" + MTU="" + START_VM="yes" + CLOUD_INIT="no" + METHOD="default" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a Mikrotik RouterOS VM using the above default settings${CL}" +} + +function get_mikrotik_version() { + local mode="$1" + local rss_url + local tree_name + + case "$mode" in + s) rss_url="https://cdn.mikrotik.com/routeros/latest-stable.rss" ;; + d) rss_url="https://cdn.mikrotik.com/routeros/latest-development.rss" ;; + l) rss_url="https://cdn.mikrotik.com/routeros/latest-long-term.rss" ;; + t) rss_url="https://cdn.mikrotik.com/routeros/latest-testing.rss" ;; + *) return 0 ;; + esac + + local rss_content + rss_content=$(curl -fsSL $rss_url 2>/dev/null) + if [ -n "$rss_content" ]; then + local version + version=$(echo "$rss_content" | grep -oP 'RouterOS \K[0-9.]+(?= \[)' 2>/dev/null || echo "$rss_content" | sed -n 's/.*<title>RouterOS \([0-9.]\+\) \[.*/\1/p' 2>/dev/null) + if [[ "$version" =~ ^[0-9]+\.[0-9]+ ]]; then + echo "$version" + return 0 + fi + fi + + case "$mode" in + s) tree_name="Stable release tree" ;; + d) tree_name="Development release tree" ;; + l) tree_name="Long-term release tree" ;; + t) tree_name="Testing release tree" ;; + esac + + local html + html=$(curl -fsSL "https://mikrotik.com/download/changelogs" 2>/dev/null) + if [ -n "$html" ]; then + local start_line + start_line=$(echo "$html" | grep -n "$tree_name" | cut -d: -f1 | head -n1) + if [[ "$start_line" =~ ^[0-9]+$ ]]; then + local line + line=$(echo "$html" | tail -n +"$start_line" | grep -m 1 -E "c-(stable|longTerm|testing|development)-v|RouterOS [0-9]+\.[0-9]+" 2>/dev/null) + + local version + version=$(echo "$line" | sed -n 's/.*c-[^"]*-v\([0-9_.a-zA-Z-]\+\).*/\1/p' | tr '_' '.' 2>/dev/null) + [ -z "$version" ] && version=$(echo "$line" | grep -oP 'RouterOS \K[0-9]+\.[0-9]+(\.[0-9]+)?' 2>/dev/null) + + if [[ "$version" =~ ^[0-9]+\.[0-9]+ ]]; then + echo "$version" + return 0 + fi + fi + fi + + for minor in $(seq 50 -1 15); do + local test_version="7.${minor}" + if curl -fsSL -I "https://download.mikrotik.com/routeros/${test_version}/chr-${test_version}.img.zip" 2>/dev/null | grep -q "200 OK"; then + echo "$test_version" + return 0 + fi + done + + return 0 +} + +function advanced_settings() { + METHOD="advanced" + [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid) + while true; do + if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VMID" ]; then + VMID=$(get_valid_nextid) + fi + if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then + echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + break + else + exit-script + fi + done + + if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ + "i440fx" "Machine i440fx" ON \ + "q35" "Machine q35" OFF \ + 3>&1 1>&2 2>&3); then + if [ $MACH = q35 ]; then + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT="" + MACHINE=" -machine q35" + else + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT=",efitype=4m" + MACHINE="" + fi + else + exit-script + fi + + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + DISK_SIZE="${DISK_SIZE}G" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + else + echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}" + exit-script + fi + else + exit-script + fi + + if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "None (Default)" ON \ + "1" "Write Through" OFF \ + 3>&1 1>&2 2>&3); then + if [ $DISK_CACHE = "1" ]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}" + DISK_CACHE="cache=writethrough," + else + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + DISK_CACHE="" + fi + else + exit-script + fi + + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 mikrotik-routeros-chr --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VM_NAME ]; then + HN="mikrotik-routeros-chr" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + else + HN=$(echo ${VM_NAME,,} | tr -d ' ') + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + fi + else + exit-script + fi + + if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "KVM64 (Default)" ON \ + "1" "Host" OFF \ + 3>&1 1>&2 2>&3); then + if [ $CPU_TYPE1 = "1" ]; then + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" + CPU_TYPE=" -cpu host" + else + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + CPU_TYPE="" + fi + else + exit-script + fi + + if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $CORE_COUNT ]; then + CORE_COUNT="2" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + else + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + fi + else + exit-script + fi + + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $RAM_SIZE ]; then + RAM_SIZE="2048" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + else + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + fi + else + exit-script + fi + + if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $BRG ]; then + BRG="vmbr0" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + else + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + fi + else + exit-script + fi + + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MAC1 ]; then + MAC="$GEN_MAC" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" + else + MAC="$MAC1" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}" + fi + else + exit-script + fi + + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VLAN1 ]; then + VLAN1="Default" + VLAN="" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + else + VLAN=",tag=$VLAN1" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + fi + else + exit-script + fi + + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MTU1 ]; then + MTU1="Default" + MTU="" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + else + MTU=",mtu=$MTU1" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + fi + else + exit-script + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + else + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}" + START_VM="no" + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Mikrotik RouterOS CHR VM?" --no-button Do-Over 10 58); then + echo -e "${CREATING}${BOLD}${DGN}Creating a Mikrotik RouterOS CHR VM using the above advanced settings${CL}" + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +check_root +arch_check +pve_check +ssh_check +start_script + +post_to_api_vm +msg_info "Validating Storage" +while read -r line; do + TAG=$(echo $line | awk '{print $1}') + TYPE=$(echo $line | awk '{printf "%-10s", $2}') + FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1') +VALID=$(pvesm status -content images | awk 'NR>1') +if [ -z "$VALID" ]; then + echo -e "\n${RD}⚠ Unable to detect a valid storage location.${CL}" + echo -e "Exiting..." + exit +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + while [ -z "${STORAGE:+x}" ]; do + STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ + "Which storage pool would you like to use for the Mikrotik RouterOS CHR VM?\n\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." +msg_info "Getting URL for Latest Mikrotik RouterOS CHR Disk Image" + +MIK_VER=$(get_mikrotik_version s) + +if [ -n "$MIK_VER" ]; then + msg_ok "Latest stable version: ${CL}${BL}$MIK_VER${CL}." +else + msg_error "Could not get latest version" + msg_ok "Defaulting to version 7.20" + MIK_VER="7.20" +fi + +URL=https://download.mikrotik.com/routeros/$MIK_VER/chr-$MIK_VER.img.zip + +sleep 2 +msg_ok "Downloading from URL: ${CL}${BL}${URL}${CL}" +curl -f#SL -o "$(basename "$URL")" "$URL" +echo -en "\e[1A\e[0K" +FILE=$(basename $URL) +msg_ok "Downloaded ${CL}${BL}$FILE${CL}" +msg_info "Extracting Mikrotik RouterOS CHR Disk Image" +gunzip -f -S .zip $FILE +STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') +case $STORAGE_TYPE in +nfs | dir) + DISK_EXT=".qcow2" + DISK_REF="$VMID/" + DISK_IMPORT="-format qcow2" + ;; +btrfs) + DISK_EXT=".raw" + DISK_REF="$VMID/" + DISK_IMPORT="-format raw" + ;; +zfspool) + DISK_EXT="" + DISK_REF="" + DISK_IMPORT="-format raw" + ;; +*) + DISK_EXT="" + DISK_REF="" + DISK_IMPORT="-format raw" + ;; +esac + +DISK_VAR="vm-${VMID}-disk-0${DISK_EXT:-}" +DISK_REF="${STORAGE}:${DISK_REF:-}${DISK_VAR:-}" + +msg_ok "Extracted Mikrotik RouterOS CHR Disk Image" +msg_info "Creating Mikrotik RouterOS CHR VM" +qm create $VMID -tablet 0 -localtime 1 -cores $CORE_COUNT -memory $RAM_SIZE -name $HN \ + -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU \ + -onboot 1 -ostype l26 -scsihw virtio-scsi-pci +qm importdisk $VMID ${FILE%.*} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null +qm set $VMID \ + -scsi0 "$DISK_REF" \ + -boot order=scsi0 >/dev/null + +DESCRIPTION=$( + cat <<EOF +<div align='center'> + <a href='https://Helper-Scripts.com' target='_blank' rel='noopener noreferrer'> + <img src='https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/images/logo-81x112.png' alt='Logo' style='width:81px;height:112px;'/> + </a> + + <h2 style='font-size: 24px; margin: 20px 0;'>Mikrotik RouterOS CHR</h2> + + <p style='margin: 16px 0;'> + <a href='https://ko-fi.com/community_scripts' target='_blank' rel='noopener noreferrer'> + <img src='https://img.shields.io/badge/☕-Buy us a coffee-blue' alt='spend Coffee' /> + </a> + </p> + + <span style='margin: 0 10px;'> + <i class="fa fa-github fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>GitHub</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-comments fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/discussions' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Discussions</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-exclamation-circle fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/issues' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Issues</a> + </span> +</div> +EOF +) +qm set $VMID -description "$DESCRIPTION" >/dev/null +if [ -n "$DISK_SIZE" ]; then + msg_info "Resizing disk to $DISK_SIZE GB" + qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null +else + msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB" + qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null +fi + +msg_ok "Mikrotik RouterOS CHR VM ${CL}${BL}(${HN})" +if [ "$START_VM" == "yes" ]; then + msg_info "Starting Mikrotik RouterOS CHR VM" + qm start $VMID + msg_ok "Started Mikrotik RouterOS CHR VM" +fi +post_update_to_api "done" "none" +msg_ok "Completed successfully!\n" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/nextcloud-vm.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/nextcloud-vm.sh new file mode 100644 index 000000000..c17b299be --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/nextcloud-vm.sh @@ -0,0 +1,567 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT +# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) + +function header_info { + clear + cat <<"EOF" + ______ __ __ _ __ __ __ __ _ ____ ___ +/_ __/_ _________ / //_/__ __ __ / |/ /____ __/ /_____/ /__ __ _____/ / | | / / |/ / + / / / // / __/ _ \/ ,< / -_) // / / / -_) \ / __/ __/ / _ \/ // / _ / | |/ / /|_/ / +/_/ \_,_/_/ /_//_/_/|_|\__/\_, / /_/|_/\__/_\_\\__/\__/_/\___/\_,_/\_,_/ |___/_/ /_/ + /___/ +EOF +} +header_info +echo -e "\n Loading..." +GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') +RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" +METHOD="" +NSAPP="turnkey-nextcloud" +var_os="turnkey-nextcloud" +var_version="n.d." + +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +RD=$(echo "\033[01;31m") +BGN=$(echo "\033[4;92m") +GN=$(echo "\033[1;92m") +DGN=$(echo "\033[32m") +CL=$(echo "\033[m") + +CL=$(echo "\033[m") +BOLD=$(echo "\033[1m") +BFR="\\r\\033[K" +HOLD=" " +TAB=" " + +CM="${TAB}âœ”ī¸${TAB}${CL}" +CROSS="${TAB}âœ–ī¸${TAB}${CL}" +INFO="${TAB}💡${TAB}${CL}" +OS="${TAB}đŸ–Ĩī¸${TAB}${CL}" +CONTAINERTYPE="${TAB}đŸ“Ļ${TAB}${CL}" +DISKSIZE="${TAB}💾${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}đŸ› ī¸${TAB}${CL}" +CONTAINERID="${TAB}🆔${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}🌉${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DEFAULT="${TAB}âš™ī¸${TAB}${CL}" +MACADDRESS="${TAB}🔗${TAB}${CL}" +VLANTAG="${TAB}đŸˇī¸${TAB}${CL}" +CREATING="${TAB}🚀${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" +CLOUD="${TAB}â˜ī¸${TAB}${CL}" + +THIN="discard=on,ssd=1," +set -e +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP +function error_handler() { + local exit_code="$?" + local line_number="$1" + local command="$2" + local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}" + post_update_to_api "failed" "${exit_code}" + echo -e "\n$error_message\n" + cleanup_vmid +} + +function get_valid_nextid() { + local try_id + try_id=$(pvesh get /cluster/nextid) + while true; do + if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then + try_id=$((try_id + 1)) + continue + fi + if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then + try_id=$((try_id + 1)) + continue + fi + break + done + echo "$try_id" +} + +function cleanup_vmid() { + if qm status $VMID &>/dev/null; then + qm stop $VMID &>/dev/null + qm destroy $VMID &>/dev/null + fi +} + +function cleanup() { + local exit_code=$? + popd >/dev/null + if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then + if [[ $exit_code -eq 0 ]]; then + post_update_to_api "done" "none" + else + post_update_to_api "failed" "$exit_code" + fi + fi + rm -rf $TEMP_DIR +} + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Nextcloud VM" --yesno "This will create a New Nextcloud VM. Proceed?" 10 58; then + : +else + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit +fi + +function msg_info() { + local msg="$1" + echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR}${CM}${GN}${msg}${CL}" +} + +function msg_error() { + local msg="$1" + echo -e "${BFR}${CROSS}${RD}${msg}${CL}" +} + +function check_root() { + if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then + clear + msg_error "Please run this script as root." + echo -e "\nExiting..." + sleep 2 + exit + fi +} + +# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. +# Supported: Proxmox VE 8.0.x – 8.9.x, 9.0 and 9.1 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x: allow 8.0–8.9 + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 9)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 8.0 – 8.9" + exit 105 + fi + return 0 + fi + + # Check for Proxmox VE 9.x: allow 9.0 and 9.1 + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 1)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 9.0 – 9.1" + exit 105 + fi + return 0 + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0 – 9.1" + exit 105 +} + +function arch_check() { + if [ "$(dpkg --print-architecture)" != "amd64" ]; then + echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" + echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function ssh_check() { + if command -v pveversion >/dev/null 2>&1; then + if [ -n "${SSH_CLIENT:+x}" ]; then + if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then + echo "you've been warned" + else + clear + exit + fi + fi + fi +} + +function exit-script() { + clear + echo -e "\n${CROSS}${RD}User exited script${CL}\n" + exit +} + +function default_settings() { + VMID=$(get_valid_nextid) + FORMAT=",efitype=4m" + MACHINE="" + DISK_SIZE="10G" + DISK_CACHE="" + HN="nextcloud-vm" + CPU_TYPE="" + CORE_COUNT="2" + RAM_SIZE="2048" + BRG="vmbr0" + MAC="$GEN_MAC" + VLAN="" + MTU="" + START_VM="yes" + METHOD="default" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a Nextcloud VM using the above default settings${CL}" +} + +function advanced_settings() { + METHOD="advanced" + [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid) + while true; do + if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VMID" ]; then + VMID=$(get_valid_nextid) + fi + if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then + echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + break + else + exit-script + fi + done + + if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ + "i440fx" "Machine i440fx" ON \ + "q35" "Machine q35" OFF \ + 3>&1 1>&2 2>&3); then + if [ $MACH = q35 ]; then + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT="" + MACHINE=" -machine q35" + else + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT=",efitype=4m" + MACHINE="" + fi + else + exit-script + fi + + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + DISK_SIZE="${DISK_SIZE}G" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + else + echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}" + exit-script + fi + else + exit-script + fi + + if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "None (Default)" ON \ + "1" "Write Through" OFF \ + 3>&1 1>&2 2>&3); then + if [ $DISK_CACHE = "1" ]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}" + DISK_CACHE="cache=writethrough," + else + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + DISK_CACHE="" + fi + else + exit-script + fi + + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 nextcloud-vm --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VM_NAME ]; then + HN="nextcloud-vm" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + else + HN=$(echo ${VM_NAME,,} | tr -d ' ') + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + fi + else + exit-script + fi + + if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "KVM64 (Default)" ON \ + "1" "Host" OFF \ + 3>&1 1>&2 2>&3); then + if [ $CPU_TYPE1 = "1" ]; then + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" + CPU_TYPE=" -cpu host" + else + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + CPU_TYPE="" + fi + else + exit-script + fi + + if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $CORE_COUNT ]; then + CORE_COUNT="2" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + else + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + fi + else + exit-script + fi + + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $RAM_SIZE ]; then + RAM_SIZE="2048" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + else + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + fi + else + exit-script + fi + + if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $BRG ]; then + BRG="vmbr0" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + else + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + fi + else + exit-script + fi + + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MAC1 ]; then + MAC="$GEN_MAC" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" + else + MAC="$MAC1" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}" + fi + else + exit-script + fi + + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VLAN1 ]; then + VLAN1="Default" + VLAN="" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + else + VLAN=",tag=$VLAN1" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + fi + else + exit-script + fi + + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MTU1 ]; then + MTU1="Default" + MTU="" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + else + MTU=",mtu=$MTU1" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + fi + else + exit-script + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + else + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}" + START_VM="no" + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Nextcloud VM?" --no-button Do-Over 10 58); then + echo -e "${CREATING}${BOLD}${DGN}Creating a Nextcloud VM using the above advanced settings${CL}" + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +check_root +arch_check +pve_check +ssh_check +start_script + +post_to_api_vm + +msg_info "Validating Storage" +while read -r line; do + TAG=$(echo $line | awk '{print $1}') + TYPE=$(echo $line | awk '{printf "%-10s", $2}') + FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1') +VALID=$(pvesm status -content images | awk 'NR>1') +if [ -z "$VALID" ]; then + msg_error "Unable to detect a valid storage location." + exit +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + while [ -z "${STORAGE:+x}" ]; do + STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ + "Which storage pool would you like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." +msg_info "Retrieving the URL for the $NAME Disk Image" +URL=http://mirror.turnkeylinux.org/turnkeylinux/images/iso/turnkey-nextcloud-18.1-bookworm-amd64.iso +sleep 2 +msg_ok "${CL}${BL}${URL}${CL}" +curl -f#SL -o "$(basename "$URL")" "$URL" +echo -en "\e[1A\e[0K" +FILE=$(basename $URL) +msg_ok "Downloaded ${CL}${BL}${FILE}${CL}" + +STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') +case $STORAGE_TYPE in +nfs | dir) + DISK_EXT=".raw" + DISK_REF="$VMID/" + DISK_IMPORT="-format raw" + THIN="" + ;; +btrfs) + DISK_EXT=".raw" + DISK_REF="$VMID/" + DISK_IMPORT="-format raw" + FORMAT=",efitype=4m" + THIN="" + ;; +*) + DISK_EXT="" + DISK_REF="" + DISK_IMPORT="-format raw" + ;; +esac +for i in {0,1,2}; do + disk="DISK$i" + eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-} + eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk} +done + +msg_info "Creating a $NAME" +qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios seabios${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ + -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci +pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null +pvesm alloc $STORAGE $VMID $DISK1 12G 1>&/dev/null +qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null +qm set $VMID \ + -efidisk0 ${DISK0_REF}${FORMAT} \ + -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN} \ + -scsi1 ${DISK2_REF},${DISK_CACHE}${THIN} \ + -boot order='scsi1;scsi0' >/dev/null +DESCRIPTION=$( + cat <<EOF +<div align='center'> + <a href='https://Helper-Scripts.com' target='_blank' rel='noopener noreferrer'> + <img src='https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/images/logo-81x112.png' alt='Logo' style='width:81px;height:112px;'/> + </a> + + <h2 style='font-size: 24px; margin: 20px 0;'>Nextcloud VM</h2> + + <p style='margin: 16px 0;'> + <a href='https://ko-fi.com/community_scripts' target='_blank' rel='noopener noreferrer'> + <img src='https://img.shields.io/badge/☕-Buy us a coffee-blue' alt='spend Coffee' /> + </a> + </p> + + <span style='margin: 0 10px;'> + <i class="fa fa-github fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>GitHub</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-comments fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/discussions' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Discussions</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-exclamation-circle fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/issues' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Issues</a> + </span> +</div> +EOF +) +qm set $VMID -description "$DESCRIPTION" >/dev/null +if [ -n "$DISK_SIZE" ]; then + msg_info "Resizing disk to $DISK_SIZE GB" + qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null +else + msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB" + qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null +fi + +msg_ok "Created a $NAME ${CL}${BL}(${HN})" +if [ "$START_VM" == "yes" ]; then + msg_info "Starting $NAME" + qm start $VMID + msg_ok "Started $NAME" +fi +post_update_to_api "done" "none" +msg_ok "Completed successfully!\n" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/olares-vm.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/olares-vm.sh new file mode 100644 index 000000000..333fac35d --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/olares-vm.sh @@ -0,0 +1,675 @@ +#!/usr/bin/env bash + +# Author: BillyOutlast +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +# ============================================================================== +# Olares VM - Creates a Personal Cloud OS Virtual Machine +# ============================================================================== +# Olares is an open-source personal cloud operating system for self-hosting +# AI models, applications, and data with enterprise-grade security. +# Requirements: 4+ CPU cores, 8+ GB RAM, 150+ GB SSD (x86-64 only) +# ============================================================================== + +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/vm-core.func) 2>/dev/null +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/cloud-init.func) 2>/dev/null || true +load_functions + +# ============================================================================== +# SCRIPT VARIABLES +# ============================================================================== +APP="Olares" +APP_TYPE="vm" +NSAPP="olares-vm" +var_os="ubuntu" +var_version="24.04" + +GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') +RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" +METHOD="" +DISK_SIZE="160G" +USE_CLOUD_INIT="yes" +OS_TYPE="ubuntu" +OS_VERSION="24.04" +OS_CODENAME="noble" +OS_DISPLAY="Ubuntu 24.04 LTS" +THIN="discard=on,ssd=1," + +# ============================================================================== +# ERROR HANDLING & CLEANUP +# ============================================================================== +set -e +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP + +function error_handler() { + local exit_code="$?" + local line_number="$1" + local command="$2" + local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}" + post_update_to_api "failed" "${exit_code}" + echo -e "\n$error_message\n" + cleanup_vmid +} + +# ============================================================================== +# OS SELECTION FUNCTIONS +# ============================================================================== +function select_os() { + if OS_CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SELECT OS" --radiolist \ + "Choose Operating System for Olares VM\n\nOlares officially supports Ubuntu 24.04+ and Debian 12+" 14 68 4 \ + "ubuntu2404" "Ubuntu 24.04 LTS (Noble) - Recommended" ON \ + "ubuntu2204" "Ubuntu 22.04 LTS (Jammy)" OFF \ + "debian12" "Debian 12 (Bookworm)" OFF \ + "debian13" "Debian 13 (Trixie)" OFF \ + 3>&1 1>&2 2>&3); then + case $OS_CHOICE in + ubuntu2404) + OS_TYPE="ubuntu" + OS_VERSION="24.04" + OS_CODENAME="noble" + OS_DISPLAY="Ubuntu 24.04 LTS" + ;; + ubuntu2204) + OS_TYPE="ubuntu" + OS_VERSION="22.04" + OS_CODENAME="jammy" + OS_DISPLAY="Ubuntu 22.04 LTS" + ;; + debian12) + OS_TYPE="debian" + OS_VERSION="12" + OS_CODENAME="bookworm" + OS_DISPLAY="Debian 12 (Bookworm)" + ;; + debian13) + OS_TYPE="debian" + OS_VERSION="13" + OS_CODENAME="trixie" + OS_DISPLAY="Debian 13 (Trixie)" + ;; + esac + echo -e "${OS}${BOLD}${DGN}Operating System: ${BGN}${OS_DISPLAY}${CL}" + else + exit_script + fi +} + +function get_image_url() { + local arch=$(dpkg --print-architecture) + case $OS_TYPE in + ubuntu) + echo "https://cloud-images.ubuntu.com/${OS_CODENAME}/current/${OS_CODENAME}-server-cloudimg-${arch}.img" + ;; + debian) + if [ "$USE_CLOUD_INIT" = "yes" ]; then + echo "https://cloud.debian.org/images/cloud/${OS_CODENAME}/latest/debian-${OS_VERSION}-generic-${arch}.qcow2" + else + echo "https://cloud.debian.org/images/cloud/${OS_CODENAME}/latest/debian-${OS_VERSION}-nocloud-${arch}.qcow2" + fi + ;; + esac +} + +# ============================================================================== +# SETTINGS FUNCTIONS +# ============================================================================== +function default_settings() { + select_os + + VMID=$(get_valid_nextid) + FORMAT="" + MACHINE=" -machine q35" + DISK_CACHE="" + DISK_SIZE="160G" + HN="olares" + CPU_TYPE=" -cpu host" + CORE_COUNT="4" + RAM_SIZE="8192" + BRG="vmbr0" + MAC="$GEN_MAC" + VLAN="" + MTU="" + START_VM="yes" + METHOD="default" + + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}Q35 (Modern)${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating an Olares VM using the above settings${CL}" +} + +function advanced_settings() { + select_os + + # SSH Key selection for Cloud-Init VMs + if [ "$USE_CLOUD_INIT" = "yes" ]; then + configure_cloudinit_ssh_keys || true + fi + + METHOD="advanced" + [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid) + + # VM ID + while true; do + if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 "$VMID" --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VMID" ]; then + VMID=$(get_valid_nextid) + fi + if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then + echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + break + else + exit_script + fi + done + + # Machine Type + if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ + "q35" "Q35 (Modern, PCIe)" ON \ + "i440fx" "i440fx (Legacy, PCI)" OFF \ + 3>&1 1>&2 2>&3); then + if [ "$MACH" = q35 ]; then + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}Q35 (Modern)${CL}" + FORMAT="" + MACHINE=" -machine q35" + else + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx (Legacy)${CL}" + FORMAT=",efitype=4m" + MACHINE="" + fi + else + exit_script + fi + + # Disk Size + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (minimum 150GB for Olares)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + DISK_SIZE="${DISK_SIZE}G" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + else + echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 160 or 160G).${CL}" + exit_script + fi + else + exit_script + fi + + # Disk Cache + if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "None (Default)" ON \ + "1" "Write Through" OFF \ + 3>&1 1>&2 2>&3); then + if [ "$DISK_CACHE" = "1" ]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}" + DISK_CACHE="cache=writethrough," + else + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + DISK_CACHE="" + fi + else + exit_script + fi + + # Hostname + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 olares --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VM_NAME" ]; then + HN="olares" + else + HN=$(echo "${VM_NAME,,}" | tr -d ' ') + fi + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + else + exit_script + fi + + # CPU Model + if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "1" "Host (Recommended for Olares)" ON \ + "0" "KVM64" OFF \ + 3>&1 1>&2 2>&3); then + if [ "$CPU_TYPE1" = "1" ]; then + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" + CPU_TYPE=" -cpu host" + else + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + CPU_TYPE="" + fi + else + exit_script + fi + + # CPU Cores + if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores (minimum 4 for Olares)" 8 58 4 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$CORE_COUNT" ]; then + CORE_COUNT="4" + fi + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + else + exit_script + fi + + # RAM Size + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB (minimum 8192 for Olares)" 8 58 8192 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$RAM_SIZE" ]; then + RAM_SIZE="8192" + fi + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + else + exit_script + fi + + # Bridge + if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$BRG" ]; then + BRG="vmbr0" + fi + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + else + exit_script + fi + + # MAC Address + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 "$GEN_MAC" --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$MAC1" ]; then + MAC="$GEN_MAC" + else + MAC="$MAC1" + fi + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" + else + exit_script + fi + + # VLAN + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan (leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VLAN1" ]; then + VLAN1="Default" + VLAN="" + else + VLAN=",tag=$VLAN1" + fi + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + else + exit_script + fi + + # MTU + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$MTU1" ]; then + MTU1="Default" + MTU="" + else + MTU=",mtu=$MTU1" + fi + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + else + exit_script + fi + + # Start VM + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + else + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}" + START_VM="no" + fi + + # Confirm + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create an Olares VM?" --no-button Do-Over 10 58); then + echo -e "${CREATING}${BOLD}${DGN}Creating an Olares VM using the above advanced settings${CL}" + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +# ============================================================================== +# MAIN EXECUTION +# ============================================================================== +header_info + +check_root +arch_check +pve_check + +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Olares VM" --yesno "This will create a New Olares VM.\n\nOlares is a personal cloud OS for self-hosting:\nâ€ĸ Local AI models (LLMs, image generation)\nâ€ĸ File sync and media streaming\nâ€ĸ Enterprise-grade security\n\nRequirements:\nâ€ĸ 4+ CPU cores (x86-64 only)\nâ€ĸ 8+ GB RAM\nâ€ĸ 150+ GB SSD storage\n\nProceed?" 18 68; then + : +else + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit +fi + +start_script +post_to_api_vm + +# ============================================================================== +# STORAGE SELECTION +# ============================================================================== +msg_info "Validating Storage" +while read -r line; do + TAG=$(echo "$line" | awk '{print $1}') + TYPE=$(echo "$line" | awk '{printf "%-10s", $2}') + FREE=$(echo "$line" | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1') + +VALID=$(pvesm status -content images | awk 'NR>1') +if [ -z "$VALID" ]; then + msg_error "Unable to detect a valid storage location." + exit +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + if [ -n "$SPINNER_PID" ] && ps -p "$SPINNER_PID" >/dev/null; then kill "$SPINNER_PID" >/dev/null; fi + printf "\e[?25h" + while [ -z "${STORAGE:+x}" ]; do + STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ + "Which storage pool would you like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." + +# ============================================================================== +# PREREQUISITES +# ============================================================================== +if ! command -v virt-customize &>/dev/null; then + msg_info "Installing libguestfs-tools" + apt-get -qq update >/dev/null + apt-get -qq install libguestfs-tools lsb-release -y >/dev/null + apt-get -qq install dhcpcd-base -y >/dev/null 2>&1 || true + msg_ok "Installed libguestfs-tools" +fi + +# ============================================================================== +# IMAGE DOWNLOAD +# ============================================================================== +msg_info "Retrieving the URL for the ${OS_DISPLAY} Cloud Image" +URL=$(get_image_url) +CACHE_DIR="/var/lib/vz/template/cache" +CACHE_FILE="$CACHE_DIR/$(basename "$URL")" +mkdir -p "$CACHE_DIR" +msg_ok "${CL}${BL}${URL}${CL}" + +if [[ ! -s "$CACHE_FILE" ]]; then + curl -f#SL -o "$CACHE_FILE" "$URL" + echo -en "\e[1A\e[0K" + msg_ok "Downloaded ${CL}${BL}$(basename "$CACHE_FILE")${CL}" +else + msg_ok "Using cached image ${CL}${BL}$(basename "$CACHE_FILE")${CL}" +fi + +# ============================================================================== +# STORAGE TYPE DETECTION +# ============================================================================== +STORAGE_TYPE=$(pvesm status -storage "$STORAGE" | awk 'NR>1 {print $2}') +case $STORAGE_TYPE in +nfs | dir) + DISK_EXT=".qcow2" + DISK_REF="$VMID/" + DISK_IMPORT="--format qcow2" + THIN="" + ;; +btrfs) + DISK_EXT=".raw" + DISK_REF="$VMID/" + DISK_IMPORT="--format raw" + FORMAT=",efitype=4m" + THIN="" + ;; +*) + DISK_EXT="" + DISK_REF="" + DISK_IMPORT="--format raw" + ;; +esac + +# ============================================================================== +# IMAGE CUSTOMIZATION WITH OLARES INSTALLER +# ============================================================================== +msg_info "Preparing ${OS_DISPLAY} image with Olares installer" + +WORK_FILE=$(mktemp --suffix=.img) +cp "$CACHE_FILE" "$WORK_FILE" + +export LIBGUESTFS_BACKEND_SETTINGS=dns=8.8.8.8,1.1.1.1 + +OLARES_INSTALLED="no" + +# Install qemu-guest-agent and prepare system +msg_info "Installing base packages in image" +if virt-customize -a "$WORK_FILE" --install qemu-guest-agent,curl,ca-certificates >/dev/null 2>&1; then + msg_ok "Installed base packages" + + msg_info "Configuring system for Olares" + # Set hostname + virt-customize -q -a "$WORK_FILE" --hostname "${HN}" >/dev/null 2>&1 || true + + # Prepare machine-id for unique instance + virt-customize -q -a "$WORK_FILE" --run-command "truncate -s 0 /etc/machine-id" >/dev/null 2>&1 || true + virt-customize -q -a "$WORK_FILE" --run-command "rm -f /var/lib/dbus/machine-id" >/dev/null 2>&1 || true + + # Configure SSH for Cloud-Init + if [ "$USE_CLOUD_INIT" = "yes" ]; then + virt-customize -q -a "$WORK_FILE" --run-command "sed -i 's/^#*PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config" >/dev/null 2>&1 || true + virt-customize -q -a "$WORK_FILE" --run-command "sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config" >/dev/null 2>&1 || true + fi + + # Create Olares installation script + msg_info "Creating Olares installation script" + if virt-customize -q -a "$WORK_FILE" --run-command 'cat > /root/install-olares.sh << "OLARESSCRIPT" +#!/bin/bash +exec > /var/log/olares-install.log 2>&1 +echo "[$(date)] Starting Olares installation" + +# Wait for network +for i in {1..30}; do + ping -c 1 8.8.8.8 >/dev/null 2>&1 && break + sleep 2 +done + +# Check if already installed +if [ -f /root/.olares-installed ]; then + echo "[$(date)] Olares already installed, skipping" + exit 0 +fi + +# Install Olares using official installer +echo "[$(date)] Downloading and running Olares installer" +curl -fsSL https://olares.sh | bash - + +# Mark installation complete +touch /root/.olares-installed +echo "[$(date)] Olares installation completed" +echo "[$(date)] Please activate Olares using the LarePass mobile app" +OLARESSCRIPT +chmod +x /root/install-olares.sh' >/dev/null 2>&1; then + + # Create systemd service for first-boot installation + virt-customize -q -a "$WORK_FILE" --run-command 'cat > /etc/systemd/system/olares-install.service << "OLARESSERVICE" +[Unit] +Description=Install Olares on First Boot +After=network-online.target +Wants=network-online.target +ConditionPathExists=!/root/.olares-installed + +[Service] +Type=oneshot +ExecStart=/root/install-olares.sh +RemainAfterExit=yes +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=multi-user.target +OLARESSERVICE +systemctl enable olares-install.service' >/dev/null 2>&1 || true + + OLARES_INSTALLED="yes" + msg_ok "Created Olares installation script" + else + msg_warn "virt-customize failed for this image. Olares must be installed manually after first boot:" + msg_warn " curl -fsSL https://olares.sh | bash -" + fi +else + msg_ok "Packages will be installed on first boot" +fi + +# Resize disk to target size +msg_info "Resizing disk image to ${DISK_SIZE}" +qemu-img resize "$WORK_FILE" "${DISK_SIZE}" >/dev/null 2>&1 +msg_ok "Resized disk image" + +# ============================================================================== +# VM CREATION +# ============================================================================== +msg_info "Creating Olares VM shell" + +qm create "$VMID" -agent 1"${MACHINE}" -tablet 0 -localtime 1 -bios ovmf"${CPU_TYPE}" -cores "$CORE_COUNT" -memory "$RAM_SIZE" \ + -name "$HN" -tags community-script -net0 virtio,bridge="$BRG",macaddr="$MAC""$VLAN""$MTU" -onboot 1 -ostype l26 -scsihw virtio-scsi-pci >/dev/null + +msg_ok "Created VM shell" + +# ============================================================================== +# DISK IMPORT +# ============================================================================== +msg_info "Importing disk into storage ($STORAGE)" + +if qm disk import --help >/dev/null 2>&1; then + IMPORT_CMD=(qm disk import) +else + IMPORT_CMD=(qm importdisk) +fi + +IMPORT_OUT="$("${IMPORT_CMD[@]}" "$VMID" "$WORK_FILE" "$STORAGE" "${DISK_IMPORT:-}" 2>&1 || true)" +DISK_REF_IMPORTED="$(printf '%s\n' "$IMPORT_OUT" | sed -n "s/.*successfully imported disk '\([^']\+\)'.*/\1/p" | tr -d "\r\"'")" +[[ -z "$DISK_REF_IMPORTED" ]] && DISK_REF_IMPORTED="$(pvesm list "$STORAGE" | awk -v id="$VMID" '$5 ~ ("vm-"id"-disk-") {print $1":"$5}' | sort | tail -n1)" +[[ -z "$DISK_REF_IMPORTED" ]] && { + msg_error "Unable to determine imported disk reference." + echo "$IMPORT_OUT" + exit 226 +} + +msg_ok "Imported disk (${CL}${BL}${DISK_REF_IMPORTED}${CL})" + +# Clean up work file +rm -f "$WORK_FILE" + +# ============================================================================== +# VM CONFIGURATION +# ============================================================================== +msg_info "Attaching EFI and root disk" + +qm set "$VMID" \ + --efidisk0 "${STORAGE}:0,efitype=4m" \ + --scsi0 "${DISK_REF_IMPORTED},${DISK_CACHE}${THIN%,}" \ + --boot order=scsi0 \ + --serial0 socket >/dev/null + +qm set "$VMID" --agent enabled=1 >/dev/null + +msg_ok "Attached EFI and root disk" + +# Set VM description +set_description + +# Cloud-Init configuration +if [ "$USE_CLOUD_INIT" = "yes" ]; then + msg_info "Configuring Cloud-Init" + setup_cloud_init "$VMID" "$STORAGE" "$HN" "yes" + msg_ok "Cloud-Init configured" +fi + +# Start VM +if [ "$START_VM" == "yes" ]; then + msg_info "Starting Olares VM" + qm start "$VMID" >/dev/null 2>&1 + msg_ok "Started Olares VM" +fi + +# ============================================================================== +# FINAL OUTPUT +# ============================================================================== +VM_IP="" +if [ "$START_VM" == "yes" ]; then + set +e + for i in {1..10}; do + VM_IP=$(qm guest cmd "$VMID" network-get-interfaces 2>/dev/null | + jq -r '.[] | select(.name != "lo") | ."ip-addresses"[]? | select(."ip-address-type" == "ipv4") | ."ip-address"' 2>/dev/null | + grep -v "^127\." | head -1) || true + [ -n "$VM_IP" ] && break + sleep 3 + done + set -e +fi + +echo -e "\n${INFO}${BOLD}${GN}Olares VM Configuration Summary:${CL}" +echo -e "${TAB}${DGN}VM ID: ${BGN}${VMID}${CL}" +echo -e "${TAB}${DGN}Hostname: ${BGN}${HN}${CL}" +echo -e "${TAB}${DGN}OS: ${BGN}${OS_DISPLAY}${CL}" +[ -n "$VM_IP" ] && echo -e "${TAB}${DGN}IP Address: ${BGN}${VM_IP}${CL}" + +if [ "$OLARES_INSTALLED" = "yes" ]; then + echo -e "${TAB}${DGN}Olares: ${BGN}Installing on first boot${CL}" + echo -e "${TAB}${YW}âš ī¸ Wait 5-10 minutes for installation to complete${CL}" + echo -e "${TAB}${YW}âš ī¸ Check progress: ${BL}cat /var/log/olares-install.log${CL}" +else + echo -e "${TAB}${DGN}Olares: ${BGN}Manual installation required${CL}" + echo -e "${TAB}${YW}âš ī¸ Run after first boot: ${BL}curl -fsSL https://olares.sh | bash -${CL}" +fi + +echo -e "\n${INFO}${BOLD}${GN}Post-Installation Steps:${CL}" +echo -e "${TAB}1. Wait for Olares installation to complete (5-10 minutes)" +echo -e "${TAB}2. Install LarePass mobile app" +echo -e "${TAB}3. Scan QR code or visit Wizard URL to activate" +echo -e "${TAB}4. Access Olares at: ${BL}https://desktop.{your-id}.olares.com${CL}" +echo -e "${TAB}5. Documentation: ${BL}https://docs.olares.com/${CL}" + +if [ "$USE_CLOUD_INIT" = "yes" ]; then + display_cloud_init_info "$VMID" "$HN" 2>/dev/null || true +fi + +post_update_to_api "done" "none" +msg_ok "Completed successfully!\n" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/openwrt-vm.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/openwrt-vm.sh new file mode 100644 index 000000000..c7e030245 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/openwrt-vm.sh @@ -0,0 +1,664 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# Jon Spriggs (jontheniceguy) +# License: MIT +# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Based on work from https://i12bretro.github.io/tutorials/0405.html + +source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) + +function header_info { + clear + cat <<"EOF" + ____ _ __ __ + / __ \____ ___ ____| | / /____/ /_ + / / / / __ \/ _ \/ __ \ | /| / / ___/ __/ +/ /_/ / /_/ / __/ / / / |/ |/ / / / /_ +\____/ .___/\___/_/ /_/|__/|__/_/ \__/ + /_/ W I R E L E S S F R E E D O M + +EOF +} +header_info +echo -e "\n Loading..." +RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" +METHOD="" +NSAPP="openwrt-vm" +var_os="openwrt" +var_version=" " +DISK_SIZE="1G" +GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') +GEN_MAC_LAN=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') + +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +HA=$(echo "\033[1;34m") +RD=$(echo "\033[01;31m") +BGN=$(echo "\033[4;92m") +GN=$(echo "\033[1;92m") +DGN=$(echo "\033[32m") +CL=$(echo "\033[m") + +BOLD=$(echo "\033[1m") +BFR="\\r\\033[K" +HOLD=" " +TAB=" " + +CM="${TAB}âœ”ī¸${TAB}${CL}" +CROSS="${TAB}âœ–ī¸${TAB}${CL}" +INFO="${TAB}💡${TAB}${CL}" +OS="${TAB}đŸ–Ĩī¸${TAB}${CL}" +CONTAINERTYPE="${TAB}đŸ“Ļ${TAB}${CL}" +DISKSIZE="${TAB}💾${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}đŸ› ī¸${TAB}${CL}" +CONTAINERID="${TAB}🆔${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}🌉${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DEFAULT="${TAB}âš™ī¸${TAB}${CL}" +MACADDRESS="${TAB}🔗${TAB}${CL}" +VLANTAG="${TAB}đŸˇī¸${TAB}${CL}" +CREATING="${TAB}🚀${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" +CLOUD="${TAB}â˜ī¸${TAB}${CL}" + +set -Eeo pipefail +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP +function error_handler() { + local exit_code="$?" + local line_number="$1" + local command="$2" + post_update_to_api "failed" "$exit_code" + local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}" + echo -e "\n$error_message\n" + cleanup_vmid +} + +function get_valid_nextid() { + local try_id + try_id=$(pvesh get /cluster/nextid) + while true; do + if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then + try_id=$((try_id + 1)) + continue + fi + if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then + try_id=$((try_id + 1)) + continue + fi + break + done + echo "$try_id" +} + +function cleanup_vmid() { + if qm status $VMID &>/dev/null; then + qm stop $VMID &>/dev/null + qm destroy $VMID &>/dev/null + fi +} + +function cleanup() { + local exit_code=$? + popd >/dev/null + if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then + if [[ $exit_code -eq 0 ]]; then + post_update_to_api "done" "none" + else + post_update_to_api "failed" "$exit_code" + fi + fi + rm -rf $TEMP_DIR +} + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null +function send_line_to_vm() { + echo -e "${DGN}Sending line: ${YW}$1${CL}" + for ((i = 0; i < ${#1}; i++)); do + character=${1:i:1} + case $character in + " ") character="spc" ;; + "-") character="minus" ;; + "=") character="equal" ;; + ",") character="comma" ;; + ".") character="dot" ;; + "/") character="slash" ;; + "'") character="apostrophe" ;; + ";") character="semicolon" ;; + '\') character="backslash" ;; + '`') character="grave_accent" ;; + "[") character="bracket_left" ;; + "]") character="bracket_right" ;; + "_") character="shift-minus" ;; + "+") character="shift-equal" ;; + "?") character="shift-slash" ;; + "<") character="shift-comma" ;; + ">") character="shift-dot" ;; + '"') character="shift-apostrophe" ;; + ":") character="shift-semicolon" ;; + "|") character="shift-backslash" ;; + "~") character="shift-grave_accent" ;; + "{") character="shift-bracket_left" ;; + "}") character="shift-bracket_right" ;; + "A") character="shift-a" ;; + "B") character="shift-b" ;; + "C") character="shift-c" ;; + "D") character="shift-d" ;; + "E") character="shift-e" ;; + "F") character="shift-f" ;; + "G") character="shift-g" ;; + "H") character="shift-h" ;; + "I") character="shift-i" ;; + "J") character="shift-j" ;; + "K") character="shift-k" ;; + "L") character="shift-l" ;; + "M") character="shift-m" ;; + "N") character="shift-n" ;; + "O") character="shift-o" ;; + "P") character="shift-p" ;; + "Q") character="shift-q" ;; + "R") character="shift-r" ;; + "S") character="shift-s" ;; + "T") character="shift-t" ;; + "U") character="shift-u" ;; + "V") character="shift-v" ;; + "W") character="shift-w" ;; + "X") character="shift=x" ;; + "Y") character="shift-y" ;; + "Z") character="shift-z" ;; + "!") character="shift-1" ;; + "@") character="shift-2" ;; + "#") character="shift-3" ;; + '$') character="shift-4" ;; + "%") character="shift-5" ;; + "^") character="shift-6" ;; + "&") character="shift-7" ;; + "*") character="shift-8" ;; + "(") character="shift-9" ;; + ")") character="shift-0" ;; + esac + qm sendkey $VMID "$character" + done + qm sendkey $VMID ret +} + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null + +if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "OpenWrt VM" --yesno "This will create a New OpenWrt VM. Proceed?" 10 58); then + : +else + header_info && echo -e "⚠ User exited script \n" && exit +fi + +function msg_info() { + local msg="$1" + echo -ne " ${HOLD} ${YW}${msg}..." +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR} ${CM} ${GN}${msg}${CL}" +} + +function msg_error() { + local msg="$1" + echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" +} + +# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. +# Supported: Proxmox VE 8.0.x – 8.9.x, 9.0 and 9.1 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x: allow 8.0–8.9 + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 9)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 8.0 – 8.9" + exit 105 + fi + return 0 + fi + + # Check for Proxmox VE 9.x: allow 9.0 and 9.1 + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 1)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 9.0 – 9.1" + exit 105 + fi + return 0 + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0 – 9.1" + exit 105 +} + +function arch_check() { + if [ "$(dpkg --print-architecture)" != "amd64" ]; then + echo -e "\n ${CROSS} This script will not work with PiMox! \n" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function ssh_check() { + if command -v pveversion >/dev/null 2>&1; then + if [ -n "${SSH_CLIENT:+x}" ]; then + if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then + echo "you've been warned" + else + clear + exit + fi + fi + fi +} + +function exit-script() { + clear + echo -e "⚠ User exited script \n" + exit +} + +function default_settings() { + VMID=$(get_valid_nextid) + HN="openwrt" + CORE_COUNT="1" + RAM_SIZE="256" + BRG="vmbr0" + LAN_BRG="vmbr0" + MAC=$GEN_MAC + LAN_MAC=$GEN_MAC_LAN + VLAN="" + LAN_VLAN="" + LAN_IP_ADDR="192.168.1.1" + LAN_NETMASK="255.255.255.0" + MTU="" + START_VM="yes" + METHOD="default" + DISK_SIZE="1G" + echo -e "${CONTAINERID}${BOLD}${DGN}VMID: ${BGN}${VMID}${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM: ${BGN}${RAM_SIZE}${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}WAN Bridge: ${BGN}${BRG}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}LAN Bridge: ${BGN}${LAN_BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}WAN MAC: ${BGN}${MAC}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}LAN MAC: ${BGN}${LAN_MAC}${CL}" +} + +function advanced_settings() { + METHOD="advanced" + [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid) + while true; do + if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VMID" ]; then + VMID=$(get_valid_nextid) + fi + if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then + echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + break + else + exit-script + fi + done + + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 openwrt --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VM_NAME ]; then + HN="openwrt" + else + HN=$(echo ${VM_NAME,,} | tr -d ' ') + fi + echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}" + else + exit-script + fi + + if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 1 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $CORE_COUNT ]; then + CORE_COUNT="1" + fi + echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}" + else + exit-script + fi + + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 256 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $RAM_SIZE ]; then + RAM_SIZE="256" + fi + echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}" + else + exit-script + fi + + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" \ + --inputbox "Set Disk Size in GiB (e.g., 1, 2, 4)" 8 58 "1" \ + --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + DISK_SIZE="${DISK_SIZE}G" + fi + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + else + exit-script + fi + + if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a WAN Bridge" 8 58 vmbr0 --title "WAN BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $BRG ]; then + BRG="vmbr0" + fi + echo -e "${DGN}Using WAN Bridge: ${BGN}$BRG${CL}" + else + exit-script + fi + + if LAN_BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a LAN Bridge" 8 58 vmbr0 --title "LAN BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $LAN_BRG ]; then + LAN_BRG="vmbr0" + fi + echo -e "${DGN}Using LAN Bridge: ${BGN}$LAN_BRG${CL}" + else + exit-script + fi + + if LAN_IP_ADDR=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a router IP" 8 58 $LAN_IP_ADDR --title "LAN IP ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $LAN_IP_ADDR ]; then + LAN_IP_ADDR="192.168.1.1" + fi + echo -e "${DGN}Using LAN IP ADDRESS: ${BGN}$LAN_IP_ADDR${CL}" + else + exit-script + fi + + if LAN_NETMASK=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a router netmask" 8 58 $LAN_NETMASK --title "LAN NETMASK" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $LAN_NETMASK ]; then + LAN_NETMASK="255.255.255.0" + fi + echo -e "${DGN}Using LAN NETMASK: ${BGN}$LAN_NETMASK${CL}" + else + exit-script + fi + + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a WAN MAC Address" 8 58 $GEN_MAC --title "WAN MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MAC1 ]; then + MAC="$GEN_MAC" + else + MAC="$MAC1" + fi + echo -e "${DGN}Using WAN MAC Address: ${BGN}$MAC${CL}" + else + exit-script + fi + + if MAC2=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a LAN MAC Address" 8 58 $GEN_MAC_LAN --title "LAN MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MAC2 ]; then + LAN_MAC="$GEN_MAC_LAN" + else + LAN_MAC="$MAC2" + fi + echo -e "${DGN}Using LAN MAC Address: ${BGN}$LAN_MAC${CL}" + else + exit-script + fi + + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a WAN Vlan (leave blank for default)" 8 58 --title "WAN VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VLAN1 ]; then + VLAN1="Default" + VLAN="" + else + VLAN=",tag=$VLAN1" + fi + echo -e "${DGN}Using WAN Vlan: ${BGN}$VLAN1${CL}" + else + exit-script + fi + + if VLAN2=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a LAN Vlan" 8 58 999 --title "LAN VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VLAN2 ]; then + VLAN2="Default" + LAN_VLAN="" + else + LAN_VLAN=",tag=$VLAN2" + fi + echo -e "${DGN}Using LAN Vlan: ${BGN}$VLAN2${CL}" + else + exit-script + fi + + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MTU1 ]; then + MTU1="Default" + MTU="" + else + MTU=",mtu=$MTU1" + fi + echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}" + else + exit-script + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + START_VM="yes" + else + START_VM="no" + fi + echo -e "${DGN}Start VM when completed: ${BGN}$START_VM${CL}" + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create OpenWrt VM?" --no-button Do-Over 10 58); then + echo -e "${RD}Creating a OpenWrt VM using the above advanced settings${CL}" + else + header_info + echo -e "${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +arch_check +pve_check +ssh_check +start_script +post_to_api_vm + +msg_info "Validating Storage" +while read -r line; do + TAG=$(echo $line | awk '{print $1}') + TYPE=$(echo $line | awk '{printf "%-10s", $2}') + FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1') +VALID=$(pvesm status -content images | awk 'NR>1') +if [ -z "$VALID" ]; then + echo -e "\n${RD}⚠ Unable to detect a valid storage location.${CL}" + echo -e "Exiting..." + exit +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + while [ -z "${STORAGE:+x}" ]; do + STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ + "Which storage pool would you like to use for the OpenWrt VM?\n\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." +msg_info "Getting URL for OpenWrt Disk Image" + +response=$(curl -fsSL https://openwrt.org) +stableversion=$(echo "$response" | sed -n 's/.*Current stable release - OpenWrt \([0-9.]\+\).*/\1/p' | head -n 1) +URL="https://downloads.openwrt.org/releases/$stableversion/targets/x86/64/openwrt-$stableversion-x86-64-generic-ext4-combined.img.gz" + +msg_ok "${CL}${BL}${URL}${CL}" +curl -f#SL -o "$(basename "$URL")" "$URL" +FILE=$(basename "$URL") +msg_ok "Downloaded ${CL}${BL}$FILE${CL}" + +gunzip -f "$FILE" >/dev/null 2>&1 || true +FILE="${FILE%.*}" +msg_ok "Extracted OpenWrt Disk Image ${CL}${BL}$FILE${CL}" + +msg_info "Creating OpenWrt VM" +qm create $VMID -cores $CORE_COUNT -memory $RAM_SIZE -name $HN \ + -onboot 1 -ostype l26 -scsihw virtio-scsi-pci --tablet 0 +if [[ "$(pvesm status | awk -v s=$STORAGE '$1==s {print $2}')" == "dir" ]]; then + qm set $VMID -efidisk0 ${STORAGE}:0,efitype=4m,size=4M +else + pvesm alloc $STORAGE $VMID vm-$VMID-disk-0 4M >/dev/null + qm set $VMID -efidisk0 ${STORAGE}:vm-$VMID-disk-0,efitype=4m,size=4M +fi + +IMPORT_OUT="$(qm importdisk $VMID $FILE $STORAGE --format raw 2>&1 || true)" +DISK_REF="$(printf '%s\n' "$IMPORT_OUT" | sed -n "s/.*successfully imported disk '\([^']\+\)'.*/\1/p")" + +if [[ -z "$DISK_REF" ]]; then + DISK_REF="$(pvesm list "$STORAGE" | awk -v id="$VMID" '$1 ~ ("vm-"id"-disk-") {print $1}' | sort | tail -n1)" +fi + +if [[ -z "$DISK_REF" ]]; then + msg_error "Unable to determine imported disk reference." + echo "$IMPORT_OUT" + exit 226 +fi + +qm set $VMID \ + -efidisk0 ${STORAGE}:0,efitype=4m,size=4M \ + -scsi0 ${DISK_REF} \ + -boot order=scsi0 \ + -tags community-script >/dev/null +msg_ok "Attached disk" + +msg_info "Resizing disk to ${DISK_SIZE}" +qm disk resize "$VMID" scsi0 "${DISK_SIZE}" >/dev/null +msg_ok "Resized disk to ${DISK_SIZE}" + +DESCRIPTION=$( + cat <<EOF +<div align='center'> + <a href='https://Helper-Scripts.com' target='_blank' rel='noopener noreferrer'> + <img src='https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/images/logo-81x112.png' alt='Logo' style='width:81px;height:112px;'/> + </a> + + <h2 style='font-size: 24px; margin: 20px 0;'>OpenWrt VM</h2> + + <p style='margin: 16px 0;'> + <a href='https://ko-fi.com/community_scripts' target='_blank' rel='noopener noreferrer'> + <img src='https://img.shields.io/badge/☕-Buy us a coffee-blue' alt='spend Coffee' /> + </a> + </p> + + <span style='margin: 0 10px;'> + <i class="fa fa-github fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>GitHub</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-comments fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/discussions' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Discussions</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-exclamation-circle fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/issues' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Issues</a> + </span> +</div> +EOF +) +qm set $VMID -description "$DESCRIPTION" >/dev/null + +msg_ok "Created OpenWrt VM ${CL}${BL}(${HN})" +msg_info "OpenWrt is being started in order to configure the network interfaces." +qm start $VMID +sleep 15 +msg_info "Waiting for OpenWrt to boot..." +for i in {1..30}; do + if qm status "$VMID" | grep -q "running"; then + sleep 5 + msg_ok "OpenWrt is running" + break + fi + sleep 1 +done + +msg_ok "Network interfaces are being configured as OpenWrt initiates." + +if qm status "$VMID" | grep -q "running"; then + send_line_to_vm "" + send_line_to_vm "uci delete network.@device[0]" + send_line_to_vm "uci set network.wan=interface" + send_line_to_vm "uci set network.wan.device=eth1" + send_line_to_vm "uci set network.wan.proto=dhcp" + send_line_to_vm "uci delete network.lan" + send_line_to_vm "uci set network.lan=interface" + send_line_to_vm "uci set network.lan.device=eth0" + send_line_to_vm "uci set network.lan.proto=static" + send_line_to_vm "uci set network.lan.ipaddr=${LAN_IP_ADDR}" + send_line_to_vm "uci set network.lan.netmask=${LAN_NETMASK}" + send_line_to_vm "uci commit" + send_line_to_vm "halt" + msg_ok "Network interfaces configured in OpenWrt" +else + msg_error "VM is not running" + exit 226 +fi + +msg_info "Waiting for OpenWrt to shut down..." +until qm status "$VMID" | grep -q "stopped"; do + sleep 2 +done +msg_ok "OpenWrt has shut down" + +msg_info "Adding bridge interfaces on Proxmox side" +qm set $VMID \ + -net0 virtio,bridge=${LAN_BRG},macaddr=${LAN_MAC}${LAN_VLAN}${MTU} \ + -net1 virtio,bridge=${BRG},macaddr=${MAC}${VLAN}${MTU} >/dev/null +msg_ok "Bridge interfaces added" + +if [ "$START_VM" = "yes" ]; then + msg_info "Starting OpenWrt VM" + qm start $VMID + msg_ok "Started OpenWrt VM" +fi + +VLAN_FINISH="" +if [ -z "$VLAN" ] && [ "$VLAN2" != "999" ]; then + VLAN_FINISH=" Please remember to adjust the VLAN tags to suit your network." +fi +post_update_to_api "done" "none" +msg_ok "Completed Successfully!${VLAN_FINISH:+\n$VLAN_FINISH}" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/opnsense-vm.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/opnsense-vm.sh new file mode 100644 index 000000000..71ec65f41 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/opnsense-vm.sh @@ -0,0 +1,851 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: michelroegl-brunner +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) + +function header_info { + clear + cat <<"EOF" + ____ ____ _ __ + / __ \/ __ \/ | / /_______ ____ ________ + / / / / /_/ / |/ / ___/ _ \/ __ \/ ___/ _ \ +/ /_/ / ____/ /| (__ ) __/ / / (__ ) __/ +\____/_/ /_/ |_/____/\___/_/ /_/____/\___/ + +EOF +} +header_info +echo -e "Loading..." +#API VARIABLES +RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" +METHOD="" +NSAPP="opnsense-vm" +var_os="opnsense" +var_version="25.7" +# +GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') +GEN_MAC_LAN=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') + +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +HA=$(echo "\033[1;34m") +RD=$(echo "\033[01;31m") +BGN=$(echo "\033[4;92m") +GN=$(echo "\033[1;92m") +DGN=$(echo "\033[32m") +CL=$(echo "\033[m") +BFR="\\r\\033[K" +HOLD="-" +CM="${GN}✓${CL}" +CROSS="${RD}✗${CL}" +set -Eeo pipefail +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP +function error_handler() { + local exit_code="$?" + local line_number="$1" + local command="$2" + post_update_to_api "failed" "$exit_code" + local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}" + echo -e "\n$error_message\n" + cleanup_vmid +} + +function get_valid_nextid() { + local try_id + try_id=$(pvesh get /cluster/nextid) + while true; do + if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then + try_id=$((try_id + 1)) + continue + fi + if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then + try_id=$((try_id + 1)) + continue + fi + break + done + echo "$try_id" +} + +function cleanup_vmid() { + if qm status $VMID &>/dev/null; then + qm stop $VMID &>/dev/null + qm destroy $VMID &>/dev/null + fi +} + +function cleanup() { + local exit_code=$? + popd >/dev/null + if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then + if [[ $exit_code -eq 0 ]]; then + post_update_to_api "done" "none" + else + post_update_to_api "failed" "$exit_code" + fi + fi + rm -rf $TEMP_DIR +} + +function check_disk_space() { + local path="$1" + local required_gb="$2" + local available_kb=$(df -k "$path" | awk 'NR==2 {print $4}') + local available_gb=$((available_kb / 1024 / 1024)) + if [ $available_gb -lt $required_gb ]; then + return 1 + fi + return 0 +} + +# Use disk-backed temp directory to avoid tmpfs/RAM size limits in /tmp +if [ -d "/var/tmp" ] && check_disk_space "/var/tmp" 20; then + TEMP_DIR=$(mktemp -d /var/tmp/opnsense-vm.XXXXXX) +elif [ -d "/tmp" ] && check_disk_space "/tmp" 20; then + TEMP_DIR=$(mktemp -d) +else + # Fallback: try /var/tmp anyway, disk space check will catch it later + TEMP_DIR=$(mktemp -d /var/tmp/opnsense-vm.XXXXXX) +fi +pushd $TEMP_DIR >/dev/null +function send_line_to_vm() { + echo -e "${DGN}Sending line: ${YW}$1${CL}" + for ((i = 0; i < ${#1}; i++)); do + character=${1:i:1} + case $character in + " ") character="spc" ;; + "-") character="minus" ;; + "=") character="equal" ;; + ",") character="comma" ;; + ".") character="dot" ;; + "/") character="slash" ;; + "'") character="apostrophe" ;; + ";") character="semicolon" ;; + '\') character="backslash" ;; + '`') character="grave_accent" ;; + "[") character="bracket_left" ;; + "]") character="bracket_right" ;; + "_") character="shift-minus" ;; + "+") character="shift-equal" ;; + "?") character="shift-slash" ;; + "<") character="shift-comma" ;; + ">") character="shift-dot" ;; + '"') character="shift-apostrophe" ;; + ":") character="shift-semicolon" ;; + "|") character="shift-backslash" ;; + "~") character="shift-grave_accent" ;; + "{") character="shift-bracket_left" ;; + "}") character="shift-bracket_right" ;; + "A") character="shift-a" ;; + "B") character="shift-b" ;; + "C") character="shift-c" ;; + "D") character="shift-d" ;; + "E") character="shift-e" ;; + "F") character="shift-f" ;; + "G") character="shift-g" ;; + "H") character="shift-h" ;; + "I") character="shift-i" ;; + "J") character="shift-j" ;; + "K") character="shift-k" ;; + "L") character="shift-l" ;; + "M") character="shift-m" ;; + "N") character="shift-n" ;; + "O") character="shift-o" ;; + "P") character="shift-p" ;; + "Q") character="shift-q" ;; + "R") character="shift-r" ;; + "S") character="shift-s" ;; + "T") character="shift-t" ;; + "U") character="shift-u" ;; + "V") character="shift-v" ;; + "W") character="shift-w" ;; + "X") character="shift-x" ;; + "Y") character="shift-y" ;; + "Z") character="shift-z" ;; + "!") character="shift-1" ;; + "@") character="shift-2" ;; + "#") character="shift-3" ;; + '$') character="shift-4" ;; + "%") character="shift-5" ;; + "^") character="shift-6" ;; + "&") character="shift-7" ;; + "*") character="shift-8" ;; + "(") character="shift-9" ;; + ")") character="shift-0" ;; + esac + qm sendkey $VMID "$character" + done + qm sendkey $VMID ret +} + +if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "OPNsense VM" --yesno "This will create a New OPNsense VM. Proceed?" 10 58); then + : +else + header_info && echo -e "⚠ User exited script \n" && exit +fi + +function msg_info() { + local msg="$1" + echo -ne " ${HOLD} ${YW}${msg}..." +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR} ${CM} ${GN}${msg}${CL}" +} + +function msg_error() { + local msg="$1" + echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" +} + +# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. +# Supported: Proxmox VE 8.0.x – 8.9.x, 9.0 and 9.1 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x: allow 8.0–8.9 + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 9)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 8.0 – 8.9" + exit 105 + fi + return 0 + fi + + # Check for Proxmox VE 9.x: allow 9.0 and 9.1 + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 1)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 9.0 – 9.1" + exit 105 + fi + return 0 + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0 – 9.1" + exit 105 +} + +function arch_check() { + if [ "$(dpkg --print-architecture)" != "amd64" ]; then + echo -e "\n ${CROSS} This script will not work with PiMox! \n" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function ssh_check() { + if command -v pveversion >/dev/null 2>&1; then + if [ -n "${SSH_CLIENT:+x}" ]; then + if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then + echo "you've been warned" + else + clear + exit + fi + fi + fi +} + +function exit-script() { + clear + echo -e "⚠ User exited script \n" + exit +} + +function get_available_bridges() { + ip -o link show type bridge 2>/dev/null | awk -F': ' '{print $2}' | sort +} + +function default_settings() { + VMID=$(get_valid_nextid) + FORMAT=",efitype=4m" + MACHINE="" + DISK_CACHE="" + HN="opnsense" + CPU_TYPE="" + CORE_COUNT="4" + RAM_SIZE="8192" + BRG="vmbr0" + IP_ADDR="" + WAN_IP_ADDR="" + LAN_GW="" + WAN_GW="" + NETMASK="" + WAN_NETMASK="" + VLAN="" + MAC=$GEN_MAC + WAN_MAC=$GEN_MAC_LAN + WAN_BRG="" + MTU="" + START_VM="yes" + METHOD="default" + + # Detect available bridges + local AVAILABLE_BRIDGES + AVAILABLE_BRIDGES=$(get_available_bridges) + local BRIDGE_COUNT + BRIDGE_COUNT=$(echo "$AVAILABLE_BRIDGES" | wc -l) + + echo -e "${DGN}Using Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${DGN}Using Hostname: ${BGN}${HN}${CL}" + echo -e "${DGN}Allocated Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${DGN}Allocated RAM: ${BGN}${RAM_SIZE}${CL}" + if ! ip link show "${BRG}" &>/dev/null; then + msg_error "Bridge '${BRG}' does not exist" + exit + else + echo -e "${DGN}Using LAN Bridge: ${BGN}${BRG}${CL}" + fi + echo -e "${DGN}Using LAN VLAN: ${BGN}Default${CL}" + echo -e "${DGN}Using LAN MAC Address: ${BGN}${MAC}${CL}" + + # Determine available network modes based on bridge count + local DEFAULT_WAN_BRG + DEFAULT_WAN_BRG=$(echo "$AVAILABLE_BRIDGES" | grep -v "^${BRG}$" | head -n1) + + if [ "$BRIDGE_COUNT" -ge 2 ]; then + # Multiple bridges available - offer dual or single mode + if NETWORK_MODE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "NETWORK CONFIGURATION" --radiolist --cancel-button Exit-Script \ + "Choose network setup mode for OPNsense:\n" 14 70 2 \ + "dual" "Dual Interface (Firewall/Router) - uses ${DEFAULT_WAN_BRG}" ON \ + "single" "Single Interface (Proxy/VPN/IDS Server)" OFF \ + 3>&1 1>&2 2>&3); then + if [ "$NETWORK_MODE" = "dual" ]; then + WAN_BRG="$DEFAULT_WAN_BRG" + echo -e "${DGN}Network Mode: ${BGN}Dual Interface (Firewall)${CL}" + echo -e "${DGN}Using WAN Bridge: ${BGN}${WAN_BRG}${CL}" + echo -e "${DGN}Using WAN MAC Address: ${BGN}${WAN_MAC}${CL}" + else + echo -e "${DGN}Network Mode: ${BGN}Single Interface (Proxy/VPN/IDS)${CL}" + WAN_BRG="" + fi + else + exit-script + fi + else + # Only one bridge available - single interface mode only + echo -e "${DGN}Network Mode: ${BGN}Single Interface (Proxy/VPN/IDS)${CL}" + echo -e "${YW} (Only one bridge detected, dual interface requires a second bridge)${CL}" + WAN_BRG="" + fi + echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}" + echo -e "${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${BL}Creating a OPNsense VM using the above default settings${CL}" +} + +function advanced_settings() { + local ip_regex='^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$' + METHOD="advanced" + [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid) + while true; do + if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VMID" ]; then + VMID=$(get_valid_nextid) + fi + if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then + echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + break + else + exit-script + fi + done + + if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ + "i440fx" "Machine i440fx" ON \ + "q35" "Machine q35" OFF \ + 3>&1 1>&2 2>&3); then + if [ $MACH = q35 ]; then + echo -e "${DGN}Using Machine Type: ${BGN}$MACH${CL}" + FORMAT="" + MACHINE=" -machine q35" + else + echo -e "${DGN}Using Machine Type: ${BGN}$MACH${CL}" + FORMAT=",efitype=4m" + MACHINE="" + fi + else + exit-script + fi + + if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "KVM64 (Default)" ON \ + "1" "Host" OFF \ + 3>&1 1>&2 2>&3); then + if [ $CPU_TYPE1 = "1" ]; then + echo -e "${DGN}Using CPU Model: ${BGN}Host${CL}" + CPU_TYPE=" -cpu host" + else + echo -e "${DGN}Using CPU Model: ${BGN}KVM64${CL}" + CPU_TYPE="" + fi + else + exit-script + fi + + if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "None (Default)" ON \ + "1" "Write Through" OFF \ + 3>&1 1>&2 2>&3); then + if [ $DISK_CACHE = "1" ]; then + echo -e "${DGN}Using Disk Cache: ${BGN}Write Through${CL}" + DISK_CACHE="cache=writethrough," + else + echo -e "${DGN}Using Disk Cache: ${BGN}None${CL}" + DISK_CACHE="" + fi + else + exit-script + fi + + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 OPNsense --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VM_NAME" ]; then + HN="OPNsense" + else + HN=$(echo ${VM_NAME,,} | tr -d ' ') + fi + echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}" + else + exit-script + fi + + if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 4 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$CORE_COUNT" ]; then + CORE_COUNT="2" + fi + echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}" + else + exit-script + fi + + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 8192 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $RAM_SIZE ]; then + RAM_SIZE="8192" + fi + echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}" + else + exit-script + fi + + if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a LAN Bridge" 8 58 vmbr0 --title "LAN BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $BRG ]; then + BRG="vmbr0" + fi + if ! ip link show "${BRG}" &>/dev/null; then + msg_error "Bridge '${BRG}' does not exist" + exit + fi + echo -e "${DGN}Using LAN Bridge: ${BGN}$BRG${CL}" + else + exit-script + fi + + if IP_ADDR=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a LAN IP" 8 58 $IP_ADDR --title "LAN IP ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $IP_ADDR ]; then + echo -e "${DGN}Using DHCP AS LAN IP ADDRESS${CL}" + else + if [[ -n "$IP_ADDR" && ! "$IP_ADDR" =~ $ip_regex ]]; then + msg_error "Invalid IP Address format for LAN IP. Needs to be 0.0.0.0, was $IP_ADDR" + exit + fi + echo -e "${DGN}Using LAN IP ADDRESS: ${BGN}$IP_ADDR${CL}" + if LAN_GW=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a LAN GATEWAY IP" 8 58 $LAN_GW --title "LAN GATEWAY IP ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $LAN_GW ]; then + echo -e "${DGN}Gateway needs to be set if ip is not dhcp${CL}" + exit-script + fi + if [[ -n "$LAN_GW" && ! "$LAN_GW" =~ $ip_regex ]]; then + msg_error "Invalid IP Address format for Gateway. Needs to be 0.0.0.0, was $LAN_GW" + exit + fi + echo -e "${DGN}Using LAN GATEWAY ADDRESS: ${BGN}$LAN_GW${CL}" + fi + if NETMASK=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a LAN netmmask (24 for example)" 8 58 $NETMASK --title "LAN NETMASK" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $NETMASK ]; then + echo -e "${DGN}Netmask needs to be set if ip is not dhcp${CL}" + fi + if [[ -n "$NETMASK" && ! ("$NETMASK" =~ ^[0-9]+$ && "$NETMASK" -ge 1 && "$NETMASK" -le 32) ]]; then + msg_error "Invalid LAN NETMASK format. Needs to be 1-32, was $NETMASK" + exit + fi + echo -e "${DGN}Using LAN NETMASK: ${BGN}$NETMASK${CL}" + else + exit-script + fi + fi + else + exit-script + fi + + # Build WAN bridge selection from available bridges (excluding LAN bridge) + local WAN_BRIDGES + WAN_BRIDGES=$(get_available_bridges | grep -v "^${BRG}$") + if [ -z "$WAN_BRIDGES" ]; then + msg_error "No additional bridge available for WAN. Only '${BRG}' exists." + msg_error "Create a second bridge (e.g. vmbr1) in Proxmox network config first." + exit + fi + local WAN_MENU=() + local first=true + while IFS= read -r brg; do + if $first; then + WAN_MENU+=("$brg" "" "ON") + first=false + else + WAN_MENU+=("$brg" "" "OFF") + fi + done <<<"$WAN_BRIDGES" + + if WAN_BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "WAN BRIDGE" --radiolist "Select WAN Bridge" 14 58 6 \ + "${WAN_MENU[@]}" 3>&1 1>&2 2>&3); then + if [ -z "$WAN_BRG" ]; then + WAN_BRG=$(echo "$WAN_BRIDGES" | head -n1) + fi + echo -e "${DGN}Using WAN Bridge: ${BGN}$WAN_BRG${CL}" + else + exit-script + fi + + if WAN_IP_ADDR=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a WAN IP" 8 58 $WAN_IP_ADDR --title "WAN IP ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $WAN_IP_ADDR ]; then + echo -e "${DGN}Using DHCP AS WAN IP ADDRESS${CL}" + else + if [[ -n "$WAN_IP_ADDR" && ! "$WAN_IP_ADDR" =~ $ip_regex ]]; then + msg_error "Invalid IP Address format for WAN IP. Needs to be 0.0.0.0, was $WAN_IP_ADDR" + exit + fi + echo -e "${DGN}Using WAN IP ADDRESS: ${BGN}$WAN_IP_ADDR${CL}" + if WAN_GW=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a WAN GATEWAY IP" 8 58 $WAN_GW --title "WAN GATEWAY IP ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $WAN_GW ]; then + echo -e "${DGN}Gateway needs to be set if ip is not dhcp${CL}" + exit-script + fi + if [[ -n "$WAN_GW" && ! "$WAN_GW" =~ $ip_regex ]]; then + msg_error "Invalid IP Address format for WAN Gateway. Needs to be 0.0.0.0, was $WAN_GW" + exit + fi + echo -e "${DGN}Using WAN GATEWAY ADDRESS: ${BGN}$WAN_GW${CL}" + else + exit-script + fi + if WAN_NETMASK=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a WAN netmmask (24 for example)" 8 58 $WAN_NETMASK --title "WAN NETMASK" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $WAN_NETMASK ]; then + echo -e "${DGN}WAN Netmask needs to be set if ip is not dhcp${CL}" + fi + if [[ -n "$WAN_NETMASK" && ! ("$WAN_NETMASK" =~ ^[0-9]+$ && "$WAN_NETMASK" -ge 1 && "$WAN_NETMASK" -le 32) ]]; then + msg_error "Invalid WAN NETMASK format. Needs to be 1-32, was $WAN_NETMASK" + exit + fi + echo -e "${DGN}Using WAN NETMASK: ${BGN}$WAN_NETMASK${CL}" + else + exit-script + fi + fi + else + exit-script + fi + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a WAN MAC Address" 8 58 $GEN_MAC --title "WAN MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MAC1 ]; then + MAC="$GEN_MAC" + else + MAC="$MAC1" + fi + echo -e "${DGN}Using LAN MAC Address: ${BGN}$MAC${CL}" + else + exit-script + fi + + if MAC2=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a LAN MAC Address" 8 58 $GEN_MAC_LAN --title "LAN MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MAC2 ]; then + WAN_MAC="$GEN_MAC_LAN" + else + WAN_MAC="$MAC2" + fi + echo -e "${DGN}Using WAN MAC Address: ${BGN}$WAN_MAC${CL}" + else + exit-script + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create OPNsense VM?" --no-button Do-Over 10 58); then + echo -e "${RD}Creating a OPNsense VM using the above advanced settings${CL}" + else + header_info + echo -e "${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +arch_check +pve_check +ssh_check +start_script +post_to_api_vm + +msg_info "Validating Storage" +while read -r line; do + TAG=$(echo $line | awk '{print $1}') + TYPE=$(echo $line | awk '{printf "%-10s", $2}') + FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1') +VALID=$(pvesm status -content images | awk 'NR>1') +if [ -z "$VALID" ]; then + msg_error "Unable to detect a valid storage location." + exit +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + while [ -z "${STORAGE:+x}" ]; do + STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ + "Which storage pool would you like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." +msg_info "Retrieving the URL for the OPNsense Qcow2 Disk Image" +# Use latest stable FreeBSD amd64 qcow2 VM image (generic, not UFS/ZFS) +RELEASE_LIST="$(curl -s https://download.freebsd.org/releases/VM-IMAGES/ | + grep -Eo '[0-9]+\.[0-9]+-RELEASE' | + sort -Vr | + uniq)" +URL="" +FREEBSD_VER="" +for ver in $RELEASE_LIST; do + candidate="https://download.freebsd.org/releases/VM-IMAGES/${ver}/amd64/Latest/FreeBSD-${ver}-amd64.qcow2.xz" + if curl -fsI "$candidate" >/dev/null 2>&1; then + FREEBSD_VER="$ver" + URL="$candidate" + break + fi +done +if [ -z "$URL" ]; then + msg_error "Could not find generic FreeBSD amd64 qcow2 image (non-UFS/ZFS)." + exit 115 +fi +msg_ok "Download URL: ${CL}${BL}${URL}${CL}" + +# Check available disk space (require at least 20GB for safety) +if ! check_disk_space "$TEMP_DIR" 20; then + AVAILABLE_GB=$(df -h "$TEMP_DIR" | awk 'NR==2 {print $4}') + msg_error "Insufficient disk space in temporary directory ($TEMP_DIR)." + msg_error "Available: ${AVAILABLE_GB}, Required: ~20GB for FreeBSD image decompression." + msg_error "Please free up space or ensure /tmp has sufficient storage." + exit 214 +fi + +msg_info "Downloading FreeBSD Image" +curl -f#SL -o "$(basename "$URL")" "$URL" +echo -en "\e[1A\e[0K" +msg_ok "Downloaded ${CL}${BL}$(basename "$URL")${CL}" + +# Check disk space again before decompression +if ! check_disk_space "$TEMP_DIR" 15; then + AVAILABLE_GB=$(df -h "$TEMP_DIR" | awk 'NR==2 {print $4}') + msg_error "Insufficient disk space for decompression." + msg_error "Available: ${AVAILABLE_GB}, Required: ~15GB for decompressed image." + exit 214 +fi + +msg_info "Decompressing FreeBSD Image (this may take a few minutes)" +FILE=FreeBSD.qcow2 +if ! unxz -cv $(basename $URL) >${FILE}; then + msg_error "Failed to decompress FreeBSD image." + msg_error "This is usually caused by insufficient disk space." + df -h "$TEMP_DIR" + exit 115 +fi + +# Remove the compressed file to save space +rm -f "$(basename "$URL")" +msg_ok "Decompressed ${CL}${BL}${FILE}${CL}" + +STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') +case $STORAGE_TYPE in +nfs | dir) + DISK_EXT=".qcow2" + DISK_REF="$VMID/" + DISK_IMPORT="-format qcow2" + THIN="" + ;; +btrfs) + DISK_EXT=".raw" + DISK_REF="$VMID/" + DISK_IMPORT="-format raw" + FORMAT=",efitype=4m" + THIN="" + ;; +*) + DISK_EXT="" + DISK_REF="" + DISK_IMPORT="-format raw" + ;; +esac +for i in {0,1}; do + disk="DISK$i" + eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-} + eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk} +done + +msg_info "Creating a OPNsense VM" +qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ + -name $HN -tags proxmox-helper-scripts -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci +pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null +qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null +qm set $VMID \ + -efidisk0 ${DISK0_REF}${FORMAT} \ + -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=2G \ + -boot order=scsi0 \ + -serial0 socket \ + -tags community-script >/dev/null +qm resize $VMID scsi0 20G >/dev/null +DESCRIPTION=$( + cat <<EOF +<div align='center'> + <a href='https://Helper-Scripts.com' target='_blank' rel='noopener noreferrer'> + <img src='https://raw.githubusercontent.com/michelroegl-brunner/ProxmoxVE/refs/heads/develop/misc/images/logo-81x112.png' alt='Logo' style='width:81px;height:112px;'/> + </a> + + <h2 style='font-size: 24px; margin: 20px 0;'>OPNsense VM</h2> + + <p style='margin: 16px 0;'> + <a href='https://ko-fi.com/community_scripts' target='_blank' rel='noopener noreferrer'> + <img src='https://img.shields.io/badge/☕-Buy us a coffee-blue' alt='spend Coffee' /> + </a> + </p> + + <span style='margin: 0 10px;'> + <i class="fa fa-github fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>GitHub</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-comments fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/discussions' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Discussions</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-exclamation-circle fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/issues' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Issues</a> + </span> +</div> +EOF +) +qm set $VMID -description "$DESCRIPTION" >/dev/null + +msg_info "Bridge interfaces are being added." +qm set $VMID \ + -net0 virtio,bridge=${BRG},macaddr=${MAC}${VLAN}${MTU} 2>/dev/null +msg_ok "Bridge interfaces have been successfully added." + +msg_ok "Created a OPNsense VM ${CL}${BL}(${HN})" +msg_ok "Starting OPNsense VM (Patience this takes 20-30 minutes)" +qm start $VMID +sleep 90 +send_line_to_vm "root" +send_line_to_vm "fetch https://raw.githubusercontent.com/opnsense/update/master/src/bootstrap/opnsense-bootstrap.sh.in" +if [ -n "$WAN_BRG" ]; then + msg_info "Adding WAN interface" + qm set $VMID \ + -net1 virtio,bridge=${WAN_BRG},macaddr=${WAN_MAC} &>/dev/null + msg_ok "WAN interface added" + sleep 5 # Brief pause after adding network interface +fi +send_line_to_vm "sh ./opnsense-bootstrap.sh.in -y -f -r 25.7" +msg_ok "OPNsense VM is being installed, do not close the terminal, or the installation will fail." +#We need to wait for the OPNsense build proccess to finish, this takes a few minutes +sleep 1000 +send_line_to_vm "root" +send_line_to_vm "opnsense" +send_line_to_vm "2" + +if [ "$IP_ADDR" != "" ]; then + send_line_to_vm "1" + send_line_to_vm "n" + send_line_to_vm "${IP_ADDR}" + send_line_to_vm "${NETMASK}" + send_line_to_vm "${LAN_GW}" + send_line_to_vm "n" + send_line_to_vm " " + send_line_to_vm "n" + send_line_to_vm "n" + send_line_to_vm " " + send_line_to_vm "n" + send_line_to_vm "n" + send_line_to_vm "n" + send_line_to_vm "n" + send_line_to_vm "n" +else + send_line_to_vm "1" + send_line_to_vm "y" + send_line_to_vm "n" + send_line_to_vm "n" + send_line_to_vm " " + send_line_to_vm "n" + send_line_to_vm "n" + send_line_to_vm "n" +fi +#Wait for config changes to be saved +sleep 20 +if [ -n "$WAN_BRG" ] && [ "$WAN_IP_ADDR" != "" ]; then + send_line_to_vm "2" + send_line_to_vm "2" + send_line_to_vm "n" + send_line_to_vm "${WAN_IP_ADDR}" + send_line_to_vm "${NETMASK}" + send_line_to_vm "${LAN_GW}" + send_line_to_vm "n" + send_line_to_vm " " + send_line_to_vm "n" + send_line_to_vm " " + send_line_to_vm "n" + send_line_to_vm "n" + send_line_to_vm "n" +fi +sleep 10 +send_line_to_vm "0" +msg_ok "Started OPNsense VM" + +msg_ok "Completed successfully!\n" +if [ "$IP_ADDR" != "" ]; then + echo -e "${INFO}${YW} Access it using the following URL:${CL}" + echo -e "${TAB}${GATEWAY}${BGN}http://${IP_ADDR}${CL}" +else + echo -e "${INFO}${YW} LAN IP was DHCP.${CL}" + echo -e "${INFO}${BGN}To find the IP login to the VM shell${CL}" +fi diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/owncloud-vm.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/owncloud-vm.sh new file mode 100644 index 000000000..5efe13ca4 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/owncloud-vm.sh @@ -0,0 +1,581 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT +# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) + +function header_info { + clear + cat <<"EOF" + ______ __ __ _______ __ _ ____ ___ +/_ __/_ _________ / //_/__ __ __ ___ _ _____ / ___/ /__ __ _____/ / | | / / |/ / + / / / // / __/ _ \/ ,< / -_) // / / _ \ |/|/ / _ \/ /__/ / _ \/ // / _ / | |/ / /|_/ / +/_/ \_,_/_/ /_//_/_/|_|\__/\_, / \___/__,__/_//_/\___/_/\___/\_,_/\_,_/ |___/_/ /_/ + /___/ +EOF +} +header_info +echo -e "\n Loading..." +GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') +RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" +METHOD="" +NSAPP="turnkey-owncloud-vm" +var_os="owncloud" +var_version="18.0" +APP="TurnKey ownCloud VM" + +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +RD=$(echo "\033[01;31m") +BGN=$(echo "\033[4;92m") +GN=$(echo "\033[1;92m") +DGN=$(echo "\033[32m") +CL=$(echo "\033[m") + +CL=$(echo "\033[m") +BOLD=$(echo "\033[1m") +BFR="\\r\\033[K" +HOLD=" " +TAB=" " + +CM="${TAB}âœ”ī¸${TAB}${CL}" +CROSS="${TAB}âœ–ī¸${TAB}${CL}" +INFO="${TAB}💡${TAB}${CL}" +OS="${TAB}đŸ–Ĩī¸${TAB}${CL}" +CONTAINERTYPE="${TAB}đŸ“Ļ${TAB}${CL}" +DISKSIZE="${TAB}💾${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}đŸ› ī¸${TAB}${CL}" +CONTAINERID="${TAB}🆔${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}🌉${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DEFAULT="${TAB}âš™ī¸${TAB}${CL}" +MACADDRESS="${TAB}🔗${TAB}${CL}" +VLANTAG="${TAB}đŸˇī¸${TAB}${CL}" +CREATING="${TAB}🚀${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" +CLOUD="${TAB}â˜ī¸${TAB}${CL}" + +THIN="discard=on,ssd=1," +set -e +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP +function error_handler() { + local exit_code="$?" + local line_number="$1" + local command="$2" + local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}" + post_update_to_api "failed" "${exit_code}" + echo -e "\n$error_message\n" + cleanup_vmid +} + +function get_valid_nextid() { + local try_id + try_id=$(pvesh get /cluster/nextid) + while true; do + if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then + try_id=$((try_id + 1)) + continue + fi + if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then + try_id=$((try_id + 1)) + continue + fi + break + done + echo "$try_id" +} + +function cleanup_vmid() { + if qm status $VMID &>/dev/null; then + qm stop $VMID &>/dev/null + qm destroy $VMID &>/dev/null + fi +} + +function cleanup() { + local exit_code=$? + popd >/dev/null + if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then + if [[ $exit_code -eq 0 ]]; then + post_update_to_api "done" "none" + else + post_update_to_api "failed" "$exit_code" + fi + fi + rm -rf $TEMP_DIR +} + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Owncloud VM" --yesno "This will create a New Owncloud VM. Proceed?" 10 58; then + : +else + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit +fi + +function msg_info() { + local msg="$1" + echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR}${CM}${GN}${msg}${CL}" +} + +function msg_error() { + local msg="$1" + echo -e "${BFR}${CROSS}${RD}${msg}${CL}" +} + +function check_root() { + if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then + clear + msg_error "Please run this script as root." + echo -e "\nExiting..." + sleep 2 + exit + fi +} + +# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. +# Supported: Proxmox VE 8.0.x – 8.9.x, 9.0 and 9.1 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x: allow 8.0–8.9 + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 9)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 8.0 – 8.9" + exit 105 + fi + return 0 + fi + + # Check for Proxmox VE 9.x: allow 9.0 and 9.1 + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 1)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 9.0 – 9.1" + exit 105 + fi + return 0 + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0 – 9.1" + exit 105 +} + +function arch_check() { + if [ "$(dpkg --print-architecture)" != "amd64" ]; then + echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" + echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function ssh_check() { + if command -v pveversion >/dev/null 2>&1; then + if [ -n "${SSH_CLIENT:+x}" ]; then + if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then + echo "you've been warned" + else + clear + exit + fi + fi + fi +} + +function exit-script() { + clear + echo -e "\n${CROSS}${RD}User exited script${CL}\n" + exit +} + +function default_settings() { + VMID=$(get_valid_nextid) + FORMAT=",efitype=4m" + MACHINE="" + DISK_SIZE="10G" + DISK_CACHE="" + HN="owncloud-vm" + CPU_TYPE="" + CORE_COUNT="2" + RAM_SIZE="2048" + BRG="vmbr0" + MAC="$GEN_MAC" + VLAN="" + MTU="" + START_VM="yes" + METHOD="default" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a Owncloud VM using the above default settings${CL}" +} + +function advanced_settings() { + METHOD="advanced" + [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid) + while true; do + if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VMID" ]; then + VMID=$(get_valid_nextid) + fi + if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then + echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + break + else + exit-script + fi + done + + if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ + "i440fx" "Machine i440fx" ON \ + "q35" "Machine q35" OFF \ + 3>&1 1>&2 2>&3); then + if [ $MACH = q35 ]; then + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT="" + MACHINE=" -machine q35" + else + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT=",efitype=4m" + MACHINE="" + fi + else + exit-script + fi + + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + DISK_SIZE="${DISK_SIZE}G" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + else + echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}" + exit-script + fi + else + exit-script + fi + + if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "None (Default)" ON \ + "1" "Write Through" OFF \ + 3>&1 1>&2 2>&3); then + if [ $DISK_CACHE = "1" ]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}" + DISK_CACHE="cache=writethrough," + else + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + DISK_CACHE="" + fi + else + exit-script + fi + + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 owncloud-vm --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VM_NAME ]; then + HN="owncloud-vm" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + else + HN=$(echo ${VM_NAME,,} | tr -d ' ') + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + fi + else + exit-script + fi + + if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "KVM64 (Default)" ON \ + "1" "Host" OFF \ + 3>&1 1>&2 2>&3); then + if [ $CPU_TYPE1 = "1" ]; then + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" + CPU_TYPE=" -cpu host" + else + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + CPU_TYPE="" + fi + else + exit-script + fi + + if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $CORE_COUNT ]; then + CORE_COUNT="2" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + else + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + fi + else + exit-script + fi + + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $RAM_SIZE ]; then + RAM_SIZE="2048" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + else + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + fi + else + exit-script + fi + + if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $BRG ]; then + BRG="vmbr0" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + else + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + fi + else + exit-script + fi + + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MAC1 ]; then + MAC="$GEN_MAC" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" + else + MAC="$MAC1" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}" + fi + else + exit-script + fi + + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VLAN1 ]; then + VLAN1="Default" + VLAN="" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + else + VLAN=",tag=$VLAN1" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + fi + else + exit-script + fi + + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MTU1 ]; then + MTU1="Default" + MTU="" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + else + MTU=",mtu=$MTU1" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + fi + else + exit-script + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + else + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}" + START_VM="no" + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Owncloud VM?" --no-button Do-Over 10 58); then + echo -e "${CREATING}${BOLD}${DGN}Creating a Owncloud VM using the above advanced settings${CL}" + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +check_root +arch_check +pve_check +ssh_check +start_script + +post_to_api_vm + +msg_info "Validating Storage" +while read -r line; do + TAG=$(echo $line | awk '{print $1}') + TYPE=$(echo $line | awk '{printf "%-10s", $2}') + FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1') +VALID=$(pvesm status -content images | awk 'NR>1') +if [ -z "$VALID" ]; then + msg_error "Unable to detect a valid storage location." + exit +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + while [ -z "${STORAGE:+x}" ]; do + STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ + "Which storage pool would you like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." +msg_info "Retrieving the URL for the $APP Disk Image" +URL=http://mirror.turnkeylinux.org/turnkeylinux/images/iso/turnkey-owncloud-18.0-bookworm-amd64.iso +sleep 2 +msg_ok "${CL}${BL}${URL}${CL}" +curl -f#SL -o "$(basename "$URL")" "$URL" +echo -en "\e[1A\e[0K" +FILE=$(basename $URL) +msg_ok "Downloaded ${CL}${BL}${FILE}${CL}" + +STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') +case $STORAGE_TYPE in +nfs | dir) + DISK_EXT=".raw" + DISK_REF="$VMID/" + DISK_IMPORT="-format raw" + THIN="" + ;; +btrfs) + DISK_EXT=".raw" + DISK_REF="$VMID/" + DISK_IMPORT="-format raw" + FORMAT=",efitype=4m" + THIN="" + ;; +*) + DISK_EXT="" + DISK_REF="" + DISK_IMPORT="-format raw" + ;; +esac +for i in {0,1,2}; do + disk="DISK$i" + eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-} + eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk} +done + +msg_info "Creating a $APP" +qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios seabios${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ + -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci +pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null +pvesm alloc $STORAGE $VMID $DISK1 12G 1>&/dev/null +qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null +qm set $VMID \ + -efidisk0 ${DISK0_REF}${FORMAT} \ + -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN} \ + -scsi1 ${DISK2_REF},${DISK_CACHE}${THIN} \ + -boot order='scsi1;scsi0' >/dev/null + +DESCRIPTION=$( + cat <<EOF +<div align='center'> + <a href='https://Helper-Scripts.com' target='_blank' rel='noopener noreferrer'> + <img src='https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/images/logo-81x112.png' alt='Logo' style='width:81px;height:112px;'/> + </a> + + <h2 style='font-size: 24px; margin: 20px 0;'>Owncloud VM</h2> + + <p style='margin: 16px 0;'> + <a href='https://ko-fi.com/community_scripts' target='_blank' rel='noopener noreferrer'> + <img src='https://img.shields.io/badge/☕-Buy us a coffee-blue' alt='spend Coffee' /> + </a> + </p> + + <span style='margin: 0 10px;'> + <i class="fa fa-github fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>GitHub</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-comments fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/discussions' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Discussions</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-exclamation-circle fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/issues' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Issues</a> + </span> +</div> +EOF +) +qm set $VMID -description "$DESCRIPTION" >/dev/null +if [ -n "$DISK_SIZE" ]; then + msg_info "Resizing disk to $DISK_SIZE GB" + qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null +else + msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB" + qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null +fi + +msg_ok "Created a $APP ${CL}${BL}(${HN})" +if [ "$START_VM" == "yes" ]; then + msg_info "Starting $APP" + qm start $VMID + msg_ok "Started $APP" +fi +post_update_to_api "done" "none" +msg_ok "Completed successfully!\n" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/pimox-haos-vm.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/pimox-haos-vm.sh new file mode 100644 index 000000000..a3bbba24d --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/pimox-haos-vm.sh @@ -0,0 +1,482 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT +# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) + +function header_info { + cat <<"EOF" + ____ _ __ ___ + / __ \(_) |/ /___ _ __ + / /_/ / / /|_/ / __ \| |/_/ + / ____/ / / / / /_/ /> < + __ __ /_/_ /_/_/ /_/\____/_/|_| __ ____ _____ + / / / /___ ____ ___ ___ / | __________(_)____/ /_____ _____ / /_ / __ \/ ___/ + / /_/ / __ \/ __ `__ \/ _ \ / /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/ / / / /\__ \ + / __ / /_/ / / / / / / __/ / ___ |(__ |__ ) (__ ) /_/ /_/ / / / / /_ / /_/ /___/ / +/_/ /_/\____/_/ /_/ /_/\___/ /_/ |_/____/____/_/____/\__/\__,_/_/ /_/\__/ \____//____/ + +EOF +} +clear +header_info +echo -e "\n Loading..." +GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') +RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" +VERSIONS=(stable beta dev) +METHOD="" +NSAPP="pimox-haos-vm" +var_os="pimox-haos" +DISK_SIZE="32G" + +for version in "${VERSIONS[@]}"; do + eval "$version=$(curl -fsSL https://raw.githubusercontent.com/home-assistant/version/master/stable.json | grep '"ova"' | cut -d '"' -f 4)" +done +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +RD=$(echo "\033[01;31m") +BGN=$(echo "\033[4;92m") +GN=$(echo "\033[1;92m") +DGN=$(echo "\033[32m") +CL=$(echo "\033[m") + +CL=$(echo "\033[m") +BOLD=$(echo "\033[1m") +BFR="\\r\\033[K" +HOLD=" " +TAB=" " + +CM="${TAB}âœ”ī¸${TAB}${CL}" +CROSS="${TAB}âœ–ī¸${TAB}${CL}" +INFO="${TAB}💡${TAB}${CL}" +OS="${TAB}đŸ–Ĩī¸${TAB}${CL}" +CONTAINERTYPE="${TAB}đŸ“Ļ${TAB}${CL}" +DISKSIZE="${TAB}💾${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}đŸ› ī¸${TAB}${CL}" +CONTAINERID="${TAB}🆔${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}🌉${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DEFAULT="${TAB}âš™ī¸${TAB}${CL}" +MACADDRESS="${TAB}🔗${TAB}${CL}" +VLANTAG="${TAB}đŸˇī¸${TAB}${CL}" +CREATING="${TAB}🚀${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" +CLOUD="${TAB}â˜ī¸${TAB}${CL}" + +THIN="discard=on,ssd=1," +set -e +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP +function error_handler() { + local exit_code="$?" + local line_number="$1" + local command="$2" + local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}" + post_update_to_api "failed" "${exit_code}" + echo -e "\n$error_message\n" + cleanup_vmid +} + +function get_valid_nextid() { + local try_id + try_id=$(pvesh get /cluster/nextid) + while true; do + if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then + try_id=$((try_id + 1)) + continue + fi + if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then + try_id=$((try_id + 1)) + continue + fi + break + done + echo "$try_id" +} + +function cleanup_vmid() { + if qm status $VMID &>/dev/null; then + qm stop $VMID &>/dev/null + qm destroy $VMID &>/dev/null + fi +} + +function cleanup() { + local exit_code=$? + popd >/dev/null + if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then + if [[ $exit_code -eq 0 ]]; then + post_update_to_api "done" "none" + else + post_update_to_api "failed" "$exit_code" + fi + fi + rm -rf $TEMP_DIR +} + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Pimox Homeassistant OS VM" --yesno "This will create a New Pimox Homeassistant OS VM. Proceed?" 10 58; then + : +else + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit +fi + +function msg_info() { + local msg="$1" + echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR}${CM}${GN}${msg}${CL}" +} + +function msg_error() { + local msg="$1" + echo -e "${BFR}${CROSS}${RD}${msg}${CL}" +} + +function check_root() { + if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then + clear + msg_error "Please run this script as root." + echo -e "\nExiting..." + sleep 2 + exit + fi +} + +# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. +# Supported: Proxmox VE 8.0.x – 8.9.x, 9.0 and 9.1 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x: allow 8.0–8.9 + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 9)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 8.0 – 8.9" + exit 105 + fi + return 0 + fi + + # Check for Proxmox VE 9.x: allow 9.0 and 9.1 + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 1)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 9.0 – 9.1" + exit 105 + fi + return 0 + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0 – 9.1" + exit 105 +} + +function arch_check() { + if [ "$(dpkg --print-architecture)" != "amd64" ]; then + echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" + echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function ssh_check() { + if command -v pveversion >/dev/null 2>&1; then + if [ -n "${SSH_CLIENT:+x}" ]; then + if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then + echo "you've been warned" + else + clear + exit + fi + fi + fi +} + +function exit-script() { + clear + echo -e "\n${CROSS}${RD}User exited script${CL}\n" + exit +} + +function default_settings() { + METHOD="default" + echo -e "${DGN}Using HAOS Version: ${BGN}${STABLE}${CL}" + BRANCH=${STABLE} + VMID=$(get_valid_nextid) + echo -e "${DGN}Using Virtual Machine ID: ${BGN}$VMID${CL}" + echo -e "${DGN}Using Hostname: ${BGN}haos${STABLE}${CL}" + HN=haos${STABLE} + echo -e "${DGN}Allocated Cores: ${BGN}2${CL}" + CORE_COUNT="2" + echo -e "${DGN}Allocated RAM: ${BGN}4096${CL}" + RAM_SIZE="4096" + echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}" + BRG="vmbr0" + echo -e "${DGN}Using MAC Address: ${BGN}$GEN_MAC${CL}" + MAC=$GEN_MAC + echo -e "${DGN}Using VLAN: ${BGN}Default${CL}" + VLAN="" + echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}" + MTU="" + echo -e "${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + echo -e "${BL}Creating a HAOS VM using the above default settings${CL}" +} +function advanced_settings() { + METHOD="advanced" + BRANCH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "HAOS VERSION" --radiolist "Choose Version" --cancel-button Exit-Script 10 58 3 \ + "$STABLE" "Stable" ON \ + "$BETA" "Beta" OFF \ + "$DEV" "Dev" OFF \ + 3>&1 1>&2 2>&3) + exitstatus=$? + if [ $exitstatus = 0 ]; then echo -e "${DGN}Using HAOS Version: ${BGN}$BRANCH${CL}"; fi + [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid) + VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3) + exitstatus=$? + if [ -z $VMID ]; then + VMID="$VMID" + echo -e "${DGN}Virtual Machine: ${BGN}$VMID${CL}" + else + if echo "$USEDID" | egrep -q "$VMID"; then + echo -e "\n🚨 ${RD}ID $VMID is already in use${CL} \n" + echo -e "Exiting Script \n" + sleep 2 + exit + else + if [ $exitstatus = 0 ]; then echo -e "${DGN}Virtual Machine ID: ${BGN}$VMID${CL}"; fi + fi + fi + VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 haos${BRANCH} --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3) + exitstatus=$? + if [ -z $VM_NAME ]; then + HN="haos${BRANCH}" + echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}" + else + if [ $exitstatus = 0 ]; then + HN=$(echo ${VM_NAME,,} | tr -d ' ') + echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}" + fi + fi + CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3) + exitstatus=$? + if [ -z $CORE_COUNT ]; then + CORE_COUNT="2" + echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}" + else + if [ $exitstatus = 0 ]; then echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"; fi + fi + RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 4096 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3) + exitstatus=$? + if [ -z $RAM_SIZE ]; then + RAM_SIZE="4096" + echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}" + else + if [ $exitstatus = 0 ]; then echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"; fi + fi + BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3) + exitstatus=$? + if [ -z $BRG ]; then + BRG="vmbr0" + echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}" + else + if [ $exitstatus = 0 ]; then echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"; fi + fi + MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3) + exitstatus=$? + if [ -z $MAC1 ]; then + MAC="$GEN_MAC" + echo -e "${DGN}Using MAC Address: ${BGN}$MAC${CL}" + else + if [ $exitstatus = 0 ]; then + MAC="$MAC1" + echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}" + fi + fi + VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3) + exitstatus=$? + if [ $exitstatus = 0 ]; then + if [ -z $VLAN1 ]; then + VLAN1="Default" VLAN="" + echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}" + else + VLAN=",tag=$VLAN1" + echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}" + fi + fi + MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3) + exitstatus=$? + if [ $exitstatus = 0 ]; then + if [ -z $MTU1 ]; then + MTU1="Default" MTU="" + echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}" + else + MTU=",mtu=$MTU1" + echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}" + fi + fi + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + echo -e "${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + else + echo -e "${DGN}Start VM when completed: ${BGN}no${CL}" + START_VM="no" + fi + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create HAOS ${BRANCH} VM?" --no-button Do-Over 10 58); then + echo -e "${RD}Creating a HAOS VM using the above advanced settings${CL}" + else + clear + header_info + echo -e "${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} +function START_SCRIPT() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + clear + header_info + echo -e "${BL}Using Default Settings${CL}" + default_settings + else + clear + header_info + echo -e "${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} +ARCH_CHECK +START_SCRIPT +post_to_api_vm +while read -r line; do + TAG=$(echo $line | awk '{print $1}') + TYPE=$(echo $line | awk '{printf "%-10s", $2}') + FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1') +if [ $((${#STORAGE_MENU[@]} / 3)) -eq 0 ]; then + echo -e "'Disk image' needs to be selected for at least one storage location." + die "Unable to detect valid storage location." +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + while [ -z "${STORAGE:+x}" ]; do + STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ + "Which storage pool would you like to use for the HAOS VM?\n\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." +msg_info "Getting URL for Home Assistant ${BRANCH} Disk Image" +URL=https://github.com/home-assistant/operating-system/releases/download/${BRANCH}/haos_generic-aarch64-${BRANCH}.qcow2.xz +sleep 2 +msg_ok "${CL}${BL}${URL}${CL}" +curl -f#SL -o "$(basename "$URL")" "$URL" +echo -en "\e[1A\e[0K" +FILE=$(basename $URL) +msg_ok "Downloaded ${CL}${BL}haos_generic-aarch64-${BRANCH}.qcow2.xz${CL}" +msg_info "Extracting Disk Image" +unxz $FILE +STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') +case $STORAGE_TYPE in +nfs | dir) + DISK_EXT=".qcow2" + DISK_REF="$VMID/" + DISK_IMPORT="-format qcow2" + ;; +*) + DISK_EXT="" + DISK_REF="" + DISK_IMPORT="-format raw" + ;; +esac +for i in {0,1}; do + disk="DISK$i" + eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-} + eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk} +done +msg_ok "Extracted Disk Image" +msg_info "Creating HAOS VM" +qm create $VMID -bios ovmf -cores $CORE_COUNT -memory $RAM_SIZE -name $HN \ + -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci +pvesm alloc $STORAGE $VMID $DISK0 64M 1>&/dev/null +qm importdisk $VMID ${FILE%.*} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null +qm set $VMID \ + -efidisk0 ${DISK0_REF},efitype=4m,size=64M \ + -scsi0 ${DISK1_REF},size=32G >/dev/null +qm set $VMID \ + -boot order=scsi0 >/dev/null + +DESCRIPTION=$( + cat <<EOF +<div align='center'> + <a href='https://Helper-Scripts.com' target='_blank' rel='noopener noreferrer'> + <img src='https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/images/logo-81x112.png' alt='Logo' style='width:81px;height:112px;'/> + </a> + + <h2 style='font-size: 24px; margin: 20px 0;'>Homeassistant VM</h2> + + <p style='margin: 16px 0;'> + <a href='https://ko-fi.com/community_scripts' target='_blank' rel='noopener noreferrer'> + <img src='https://img.shields.io/badge/☕-Buy us a coffee-blue' alt='spend Coffee' /> + </a> + </p> + + <span style='margin: 0 10px;'> + <i class="fa fa-github fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>GitHub</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-comments fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/discussions' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Discussions</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-exclamation-circle fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/issues' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Issues</a> + </span> +</div> +EOF +) +qm set $VMID -description "$DESCRIPTION" >/dev/null +if [ -n "$DISK_SIZE" ]; then + msg_info "Resizing disk to $DISK_SIZE GB" + qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null +else + msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB" + qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null +fi + +msg_ok "Created HAOS VM ${CL}${BL}(${HN})" +if [ "$START_VM" == "yes" ]; then + msg_info "Starting Home Assistant OS VM" + qm start $VMID + msg_ok "Started Home Assistant OS VM" +fi +post_update_to_api "done" "none" +msg_ok "Completed successfully!\n" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/truenas-vm.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/truenas-vm.sh new file mode 100644 index 000000000..6066a29d6 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/truenas-vm.sh @@ -0,0 +1,625 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: juronja +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.truenas.com/truenas-community-edition/ + +source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) + +function header_info() { + clear + cat <<"EOF" + ______ _ _____ _____ + /_ __/______ _____ / | / / | / ___/ + / / / ___/ / / / _ \/ |/ / /| | \__ \ + / / / / / /_/ / __/ /| / ___ |___/ / +/_/ /_/ \__,_/\___/_/ |_/_/ |_/____/ + (Community Edition) +EOF +} +header_info +echo -e "\n Loading..." +GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') +RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" +METHOD="" + +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +RD=$(echo "\033[01;31m") +BGN=$(echo "\033[4;92m") +GN=$(echo "\033[1;92m") +DGN=$(echo "\033[32m") +CL=$(echo "\033[m") + +CL=$(echo "\033[m") +BOLD=$(echo "\033[1m") +BFR="\\r\\033[K" +HOLD=" " +TAB=" " + +CM="${TAB}âœ”ī¸${TAB}${CL}" +CROSS="${TAB}âœ–ī¸${TAB}${CL}" +INFO="${TAB}💡${TAB}${CL}" +OS="${TAB}đŸ–Ĩī¸${TAB}${CL}" +CONTAINERTYPE="${TAB}đŸ“Ļ${TAB}${CL}" +ISO="${TAB}📀${TAB}${CL}" +DISKSIZE="${TAB}💾${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}đŸ› ī¸${TAB}${CL}" +CONTAINERID="${TAB}🆔${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}🌉${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DISK="${TAB}đŸ’Ŋ${TAB}${CL}" +DEFAULT="${TAB}âš™ī¸${TAB}${CL}" +MACADDRESS="${TAB}🔗${TAB}${CL}" +VLANTAG="${TAB}đŸˇī¸${TAB}${CL}" +CREATING="${TAB}🚀${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" +CLOUD="${TAB}â˜ī¸${TAB}${CL}" + +set -e +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP +function error_handler() { + local exit_code="$?" + local line_number="$1" + local command="$2" + local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}" + post_update_to_api "failed" "${command}" + echo -e "\n$error_message\n" + cleanup_vmid +} + +function truenas_iso_lookup() { + local BASE_URL="https://download.truenas.com" + local current_year=$(date +%y) + local last_year=$(date -d "1 year ago" +%y) + local year_pattern="${current_year}\.|${last_year}\." + + declare -A latest_stables + local pre_releases=() + + local all_paths=$( + curl -sL "$BASE_URL" | + grep -oE 'href="[^"]+\.iso"' | + sed 's/href="//; s/"$//' | + grep -vE '(MASTER|ALPHA)' | + grep -E "$year_pattern" + ) + + while read -r path; do + local filename=$(basename "$path") + local version=$(echo "$filename" | sed -E 's/.*TrueNAS-SCALE-([0-9]{2}\.[0-9]{2}(\.[0-9]+)*(-RC[0-9]|-BETA[0-9])?)\.iso.*/\1/') + if [[ "$version" =~ (RC|BETA) ]]; then + pre_releases+=("$path") + else + local major_version=$(echo "$version" | cut -d'.' -f1,2) + local current_stored_path=${latest_stables["$major_version"]} + if [[ -z "$current_stored_path" ]]; then + latest_stables["$major_version"]="$path" + else + local stored_version=$(basename "$current_stored_path" | sed -E 's/.*TrueNAS-SCALE-([0-9]{2}\.[0-9]{2}(\.[0-9]+)*)\.iso.*/\1/') + if printf '%s\n' "$version" "$stored_version" | sort -V | tail -n 1 | grep -q "$version"; then + latest_stables["$major_version"]="$path" + fi + fi + fi + done <<<"$all_paths" + + for key in "${!latest_stables[@]}"; do + echo "${latest_stables[$key]#/}" + done + + for pre in "${pre_releases[@]}"; do + echo "${pre#/}" + done | sort -V +} + +function get_valid_nextid() { + local try_id + try_id=$(pvesh get /cluster/nextid) + while true; do + if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then + try_id=$((try_id + 1)) + continue + fi + if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then + try_id=$((try_id + 1)) + continue + fi + break + done + echo "$try_id" +} + +function cleanup_vmid() { + if qm status $VMID &>/dev/null; then + qm stop $VMID &>/dev/null + qm destroy $VMID &>/dev/null + fi +} + +function cleanup() { + popd >/dev/null + post_update_to_api "done" "none" + rm -rf $TEMP_DIR +} + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "TrueNAS VM" --yesno "This will create a New TrueNAS VM. Proceed?" 10 58; then + : +else + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit +fi + +function msg_info() { + local msg="$1" + echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR}${CM}${GN}${msg}${CL}" +} + +function msg_error() { + local msg="$1" + echo -e "${BFR}${CROSS}${RD}${msg}${CL}" +} + +function check_root() { + if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then + clear + msg_error "Please run this script as root." + echo -e "\nExiting..." + sleep 2 + exit + fi +} + +function pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 9)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 8.0 – 8.9" + exit 105 + fi + return 0 + fi + + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 1)); then + msg_error "This version of Proxmox VE is not yet supported." + msg_error "Supported: Proxmox VE version 9.0 – 9.1" + exit 105 + fi + return 0 + fi + + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0 – 9.1" + exit 105 +} + +function arch_check() { + if [ "$(dpkg --print-architecture)" != "amd64" ]; then + echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" + echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function ssh_check() { + if command -v pveversion >/dev/null 2>&1; then + if [ -n "${SSH_CLIENT:+x}" ]; then + if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then + echo "you've been warned" + else + clear + exit + fi + fi + fi +} + +function exit-script() { + clear + echo -e "\n${CROSS}${RD}User exited script${CL}\n" + exit +} + +function default_settings() { + VMID=$(get_valid_nextid) + ISO_DEFAULT="latest stable" + FORMAT="" + MACHINE="q35" + DISK_SIZE="16" + HN="truenas" + CPU_TYPE="host" + CORE_COUNT="2" + RAM_SIZE="8192" + BRG="vmbr0" + MAC="$GEN_MAC" + VLAN="" + MTU="" + START_VM="yes" + METHOD="default" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${ISO}${BOLD}${DGN}ISO Chosen: ${BGN}${ISO_DEFAULT}${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}${MACHINE}${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}${CPU_TYPE}${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a TrueNAS VM using the above default settings${CL}" +} + +function advanced_settings() { + DISK_SIZE="16" + HN="truenas" + CORE_COUNT="2" + RAM_SIZE="8192" + BRG="vmbr0" + + METHOD="advanced" + [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid) + while true; do + if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VMID" ]; then + VMID=$(get_valid_nextid) + fi + if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then + echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + break + else + exit-script + fi + done + + ISOARRAY=() + mapfile -t ALL_ISOS < <(truenas_iso_lookup | sort -V) + ISO_COUNT=${#ALL_ISOS[@]} + + if [ $ISO_COUNT -eq 0 ]; then + echo "No ISOs found." + exit 115 + fi + + # Identify the index of the last stable release + LAST_STABLE_INDEX=-1 + for i in "${!ALL_ISOS[@]}"; do + if [[ ! "${ALL_ISOS[$i]}" =~ (BETA|RC) ]]; then + LAST_STABLE_INDEX=$i + fi + done + + # Build the whiptail array + for i in "${!ALL_ISOS[@]}"; do + ISOPATH="${ALL_ISOS[$i]}" + FILENAME=$(basename "$ISOPATH") + + # Select ON if it's the last stable found, OR fallback to last item if no stable exists + if [[ "$i" -eq "$LAST_STABLE_INDEX" ]]; then + ISOARRAY+=("$ISOPATH" "$FILENAME" "ON") + elif [[ "$LAST_STABLE_INDEX" -eq -1 && "$i" -eq "$((ISO_COUNT - 1))" ]]; then + # Fallback: if somehow no stable is found, select the very last item + ISOARRAY+=("$ISOPATH" "$FILENAME" "ON") + else + ISOARRAY+=("$ISOPATH" "$FILENAME" "OFF") + fi + done + + if SELECTED_ISO=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SELECT ISO TO INSTALL" --notags --radiolist "\nSelect version (BETA/RC/Latest stable):" 20 58 12 "${ISOARRAY[@]}" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + echo -e "${ISO}${BOLD}${DGN}ISO Chosen: ${BGN}$(basename "$SELECTED_ISO")${CL}" + else + exit-script + fi + + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + else + echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10).${CL}" + exit-script + fi + else + exit-script + fi + + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 "$HN" --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VM_NAME ]; then + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + else + HN=$(echo ${VM_NAME,,} | tr -d ' ') + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + fi + else + exit-script + fi + + if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose CPU Model" --cancel-button Exit-Script 10 58 2 \ + "KVM64" "Default – safe for migration/compatibility" OFF \ + "Host" "Use host CPU features (faster, no migration)" ON \ + 3>&1 1>&2 2>&3); then + case "$CPU_TYPE1" in + Host) + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" + CPU_TYPE="host" + ;; + *) + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + CPU_TYPE="" + ;; + esac + else + exit-script + fi + + if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 "$CORE_COUNT" --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $CORE_COUNT ]; then + CORE_COUNT="2" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + else + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + fi + else + exit-script + fi + + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 "$RAM_SIZE" --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $RAM_SIZE ]; then + RAM_SIZE="8192" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + else + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + fi + else + exit-script + fi + + if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 "$BRG" --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $BRG ]; then + BRG="vmbr0" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + else + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + fi + else + exit-script + fi + + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MAC1 ]; then + MAC="$GEN_MAC" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" + else + MAC="$MAC1" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}" + fi + else + exit-script + fi + + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VLAN1 ]; then + VLAN1="Default" + VLAN="" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + else + VLAN=",tag=$VLAN1" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + fi + else + exit-script + fi + + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MTU1 ]; then + MTU1="Default" + MTU="" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + else + MTU=",mtu=$MTU1" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + fi + else + exit-script + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "IMPORT ONBOARD DISKS" --yesno "Would you like to import onboard disks?" 10 58); then + echo -e "${DISK}${BOLD}${DGN}Import onboard disks: ${BGN}yes${CL}" + IMPORT_DISKS="yes" + else + echo -e "${DISK}${BOLD}${DGN}Import onboard disks: ${BGN}no${CL}" + IMPORT_DISKS="no" + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + else + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}" + START_VM="no" + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a TrueNAS VM?" --no-button Do-Over 10 58); then + echo -e "${CREATING}${BOLD}${DGN}Creating a TrueNAS VM using the above advanced settings${CL}" + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} +check_root +arch_check +pve_check +ssh_check +start_script +post_to_api_vm + +msg_info "Validating Storage" +while read -r line; do + TAG=$(echo $line | awk '{print $1}') + TYPE=$(echo $line | awk '{printf "%-10s", $2}') + FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1') +VALID=$(pvesm status -content images | awk 'NR>1') +if [ -z "$VALID" ]; then + msg_error "Unable to detect a valid storage location." + exit +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + while [ -z "${STORAGE:+x}" ]; do + if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi + printf "\e[?25h" + STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ + "Which storage pool would you like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." + +if [ -z "${SELECTED_ISO:-}" ]; then + SELECTED_ISO=$(truenas_iso_lookup | grep -vE 'RC|BETA' | sort -V | tail -n 1) + + if [ -z "$SELECTED_ISO" ]; then + msg_error "Could not find a stable ISO for fallback." + exit 115 + fi +fi + +FULL_URL="https://download.truenas.com/${SELECTED_ISO#/}" +ISO_NAME=$(basename "$FULL_URL") +CACHE_DIR="/var/lib/vz/template/iso" +CACHE_FILE="$CACHE_DIR/$ISO_NAME" + +if [[ ! -s "$CACHE_FILE" ]]; then + msg_info "Retrieving the ISO for the TrueNAS Disk Image" + curl -f#SL -o "$CACHE_FILE" "$FULL_URL" + msg_ok "Downloaded ${CL}${BL}$(basename "$CACHE_FILE")${CL}" +else + msg_ok "Using cached image ${CL}${BL}$(basename "$CACHE_FILE")${CL}" +fi + +set -o pipefail +msg_info "Creating TrueNAS VM shell" +qm create "$VMID" -machine q35 -bios ovmf -agent enabled=1 -tablet 0 -localtime 1 -cpu "$CPU_TYPE" \ + -cores "$CORE_COUNT" -memory "$RAM_SIZE" -balloon 0 -name "$HN" -tags community-script \ + -net0 "virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU" -onboot 1 -ostype l26 \ + -efidisk0 $STORAGE:1,efitype=4m,pre-enrolled-keys=0 -sata0 $STORAGE:$DISK_SIZE,ssd=1 \ + -scsihw virtio-scsi-single -cdrom local:iso/$ISO_NAME -vga virtio >/dev/null +msg_ok "Created VM shell" + +if [ "$IMPORT_DISKS" == "yes" ]; then + msg_info "Importing onboard disks" + DISKARRAY=() + SCSI_NR=0 + + while read -r LSOUTPUT; do + TRUNCATED="${LSOUTPUT:0:45}" + if [ ${#LSOUTPUT} -gt 45 ]; then + TRUNCATED="${TRUNCATED}..." + fi + DISKARRAY+=("$LSOUTPUT" "$TRUNCATED" "OFF") + done < <(ls /dev/disk/by-id | grep -E '^ata-|^nvme-|^usb-' | grep -v 'part') + + SELECTIONS=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SELECT DISKS TO IMPORT" --checklist "\nSelect disk IDs to import. (Use Spacebar to select)\n" --notags --cancel-button "Exit Script" 20 58 10 "${DISKARRAY[@]}" 3>&1 1>&2 2>&3 | tr -d '"') || exit + + for SELECTION in $SELECTIONS; do + ((++SCSI_NR)) + + ID_SERIAL=$(udevadm info --query=property --value --property=ID_SERIAL_SHORT "/dev/disk/by-id/$SELECTION") + ID_SERIAL=${ID_SERIAL:0:20} + + qm set $VMID --scsi$SCSI_NR /dev/disk/by-id/$SELECTION,serial=$ID_SERIAL + done + msg_ok "Disks imported successfully" +fi + +DESCRIPTION=$( + cat <<EOF +<div align='center'> + <a href='https://Helper-Scripts.com' target='_blank' rel='noopener noreferrer'> + <img src='https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/images/logo-81x112.png' alt='Logo' style='width:81px;height:112px;'/> + </a> + + <h2 style='font-size: 24px; margin: 20px 0;'>TrueNAS Community Edition</h2> + + <p style='margin: 16px 0;'> + <a href='https://ko-fi.com/community_scripts' target='_blank' rel='noopener noreferrer'> + <img src='https://img.shields.io/badge/☕-Buy us a coffee-blue' alt='spend Coffee' /> + </a> + </p> + + <span style='margin: 0 10px;'> + <i class="fa fa-github fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>GitHub</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-comments fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/discussions' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Discussions</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-exclamation-circle fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/issues' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Issues</a> + </span> +</div> +EOF +) +qm set "$VMID" -description "$DESCRIPTION" >/dev/null + +sleep 3 + +msg_ok "Created a TrueNAS VM ${CL}${BL}(${HN})" +if [ "$START_VM" == "yes" ]; then + msg_info "Starting TrueNAS VM" + qm start $VMID + msg_ok "Started TrueNAS VM" +fi + +msg_ok "Completed Successfully!\n" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/ubuntu2204-vm.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/ubuntu2204-vm.sh new file mode 100644 index 000000000..b118863ec --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/ubuntu2204-vm.sh @@ -0,0 +1,565 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) + +function header_info { + clear + cat <<"EOF" + __ ____ __ ___ ___ ____ __ __ _ ____ ___ + / / / / /_ __ ______ / /___ __ |__ \|__ \ / __ \/ // / | | / / |/ / + / / / / __ \/ / / / __ \/ __/ / / / __/ /__/ / / / / / // /_ | | / / /|_/ / +/ /_/ / /_/ / /_/ / / / / /_/ /_/ / / __// __/_/ /_/ /__ __/ | |/ / / / / +\____/_.___/\__,_/_/ /_/\__/\__,_/ /____/____(_)____/ /_/ |___/_/ /_/ + +EOF +} +header_info +echo -e "\n Loading..." +GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') +RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" +METHOD="" +NSAPP="ubuntu-2204-vm" +var_os="ubuntu" +var_version="2204" + +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +RD=$(echo "\033[01;31m") +BGN=$(echo "\033[4;92m") +GN=$(echo "\033[1;92m") +DGN=$(echo "\033[32m") +CL=$(echo "\033[m") +BOLD=$(echo "\033[1m") +BFR="\\r\\033[K" +HOLD=" " +TAB=" " + +CM="${TAB}âœ”ī¸${TAB}${CL}" +CROSS="${TAB}âœ–ī¸${TAB}${CL}" +INFO="${TAB}💡${TAB}${CL}" +OS="${TAB}đŸ–Ĩī¸${TAB}${CL}" +CONTAINERTYPE="${TAB}đŸ“Ļ${TAB}${CL}" +DISKSIZE="${TAB}💾${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}đŸ› ī¸${TAB}${CL}" +CONTAINERID="${TAB}🆔${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}🌉${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DEFAULT="${TAB}âš™ī¸${TAB}${CL}" +MACADDRESS="${TAB}🔗${TAB}${CL}" +VLANTAG="${TAB}đŸˇī¸${TAB}${CL}" +CREATING="${TAB}🚀${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" + +THIN="discard=on,ssd=1," +set -e +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP +function error_handler() { + local exit_code="$?" + local line_number="$1" + local command="$2" + post_update_to_api "failed" "$exit_code" + local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}" + echo -e "\n$error_message\n" + cleanup_vmid +} + +function get_valid_nextid() { + local try_id + try_id=$(pvesh get /cluster/nextid) + while true; do + if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then + try_id=$((try_id + 1)) + continue + fi + if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then + try_id=$((try_id + 1)) + continue + fi + break + done + echo "$try_id" +} + +function cleanup_vmid() { + if qm status $VMID &>/dev/null; then + qm stop $VMID &>/dev/null + qm destroy $VMID &>/dev/null + fi +} + +function cleanup() { + local exit_code=$? + popd >/dev/null + if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then + if [[ $exit_code -eq 0 ]]; then + post_update_to_api "done" "none" + else + post_update_to_api "failed" "$exit_code" + fi + fi + rm -rf $TEMP_DIR +} + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Ubuntu 22.04 VM" --yesno "This will create a New Ubuntu 22.04 VM. Proceed?" 10 58; then + : +else + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit +fi + +function msg_info() { + local msg="$1" + echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR}${CM}${GN}${msg}${CL}" +} + +function msg_error() { + local msg="$1" + echo -e "${BFR}${CROSS}${RD}${msg}${CL}" +} + +function check_root() { + if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then + clear + msg_error "Please run this script as root." + echo -e "\nExiting..." + sleep 2 + exit + fi +} + +# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. +# Supported: Proxmox VE 8.0.x – 8.9.x, 9.0 and 9.1 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x: allow 8.0–8.9 + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 9)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 8.0 – 8.9" + exit 105 + fi + return 0 + fi + + # Check for Proxmox VE 9.x: allow 9.0 and 9.1 + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 1)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 9.0 – 9.1" + exit 105 + fi + return 0 + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0 – 9.1" + exit 105 +} + +function arch_check() { + if [ "$(dpkg --print-architecture)" != "amd64" ]; then + echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" + echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function ssh_check() { + if command -v pveversion >/dev/null 2>&1; then + if [ -n "${SSH_CLIENT:+x}" ]; then + if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then + echo "you've been warned" + else + clear + exit + fi + fi + fi +} + +function exit-script() { + clear + echo -e "\n${CROSS}${RD}User exited script${CL}\n" + exit +} + +function default_settings() { + VMID=$(get_valid_nextid) + FORMAT=",efitype=4m" + MACHINE="" + DISK_SIZE="5G" + DISK_CACHE="" + HN="ubuntu" + CPU_TYPE="" + CORE_COUNT="2" + RAM_SIZE="2048" + BRG="vmbr0" + MAC="$GEN_MAC" + VLAN="" + MTU="" + START_VM="yes" + METHOD="default" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a Ubuntu 22.04 VM using the above default settings${CL}" +} + +function advanced_settings() { + METHOD="advanced" + [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid) + while true; do + if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VMID" ]; then + VMID=$(get_valid_nextid) + fi + if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then + echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + break + else + exit-script + fi + done + + if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ + "i440fx" "Machine i440fx" ON \ + "q35" "Machine q35" OFF \ + 3>&1 1>&2 2>&3); then + if [ $MACH = q35 ]; then + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT="" + MACHINE=" -machine q35" + else + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT=",efitype=4m" + MACHINE="" + fi + else + exit-script + fi + + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + DISK_SIZE="${DISK_SIZE}G" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + else + echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}" + exit-script + fi + else + exit-script + fi + + if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "None (Default)" ON \ + "1" "Write Through" OFF \ + 3>&1 1>&2 2>&3); then + if [ $DISK_CACHE = "1" ]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}" + DISK_CACHE="cache=writethrough," + else + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + DISK_CACHE="" + fi + else + exit-script + fi + + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 ubuntu --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VM_NAME ]; then + HN="ubuntu" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + else + HN=$(echo ${VM_NAME,,} | tr -d ' ') + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + fi + else + exit-script + fi + + if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "KVM64 (Default)" ON \ + "1" "Host" OFF \ + 3>&1 1>&2 2>&3); then + if [ $CPU_TYPE1 = "1" ]; then + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" + CPU_TYPE=" -cpu host" + else + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + CPU_TYPE="" + fi + else + exit-script + fi + + if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $CORE_COUNT ]; then + CORE_COUNT="2" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + else + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + fi + else + exit-script + fi + + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $RAM_SIZE ]; then + RAM_SIZE="2048" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + else + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + fi + else + exit-script + fi + + if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $BRG ]; then + BRG="vmbr0" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + else + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + fi + else + exit-script + fi + + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MAC1 ]; then + MAC="$GEN_MAC" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" + else + MAC="$MAC1" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}" + fi + else + exit-script + fi + + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VLAN1 ]; then + VLAN1="Default" + VLAN="" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + else + VLAN=",tag=$VLAN1" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + fi + else + exit-script + fi + + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MTU1 ]; then + MTU1="Default" + MTU="" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + else + MTU=",mtu=$MTU1" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + fi + else + exit-script + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + else + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}" + START_VM="no" + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Ubuntu 22.04 VM?" --no-button Do-Over 10 58); then + echo -e "${CREATING}${BOLD}${DGN}Creating a Ubuntu 22.04 VM using the above advanced settings${CL}" + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +check_root +arch_check +pve_check +ssh_check +start_script +post_to_api_vm + +msg_info "Validating Storage" +while read -r line; do + TAG=$(echo $line | awk '{print $1}') + TYPE=$(echo $line | awk '{printf "%-10s", $2}') + FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1') +VALID=$(pvesm status -content images | awk 'NR>1') +if [ -z "$VALID" ]; then + msg_error "Unable to detect a valid storage location." + exit +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + while [ -z "${STORAGE:+x}" ]; do + STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ + "Which storage pool would you like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." +msg_info "Retrieving the URL for the Ubuntu 22.04 Disk Image" +URL=https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img +sleep 2 +msg_ok "${CL}${BL}${URL}${CL}" +curl -f#SL -o "$(basename "$URL")" "$URL" +echo -en "\e[1A\e[0K" +FILE=$(basename $URL) +msg_ok "Downloaded ${CL}${BL}${FILE}${CL}" + +STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') +case $STORAGE_TYPE in +nfs | dir | cifs) + DISK_EXT=".qcow2" + DISK_REF="$VMID/" + DISK_IMPORT="-format qcow2" + THIN="" + ;; +btrfs) + DISK_EXT=".raw" + DISK_REF="$VMID/" + DISK_IMPORT="-format raw" + FORMAT=",efitype=4m" + THIN="" + ;; +*) + DISK_EXT="" + DISK_REF="" + DISK_IMPORT="-format raw" + ;; +esac +for i in {0,1}; do + disk="DISK$i" + eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-} + eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk} +done + +msg_info "Creating a Ubuntu 22.04 VM" +qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ + -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci +pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null +qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null +qm set $VMID \ + -efidisk0 ${DISK0_REF}${FORMAT} \ + -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \ + -ide2 ${STORAGE}:cloudinit \ + -boot order=scsi0 \ + -serial0 socket >/dev/null +DESCRIPTION=$( + cat <<EOF +<div align='center'> + <a href='https://Helper-Scripts.com' target='_blank' rel='noopener noreferrer'> + <img src='https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/images/logo-81x112.png' alt='Logo' style='width:81px;height:112px;'/> + </a> + + <h2 style='font-size: 24px; margin: 20px 0;'>ubuntu VM</h2> + + <p style='margin: 16px 0;'> + <a href='https://ko-fi.com/community_scripts' target='_blank' rel='noopener noreferrer'> + <img src='https://img.shields.io/badge/☕-Buy us a coffee-blue' alt='spend Coffee' /> + </a> + </p> + + <span style='margin: 0 10px;'> + <i class="fa fa-github fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>GitHub</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-comments fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/discussions' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Discussions</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-exclamation-circle fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/issues' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Issues</a> + </span> +</div> +EOF +) +qm set $VMID -description "$DESCRIPTION" >/dev/null +if [ -n "$DISK_SIZE" ]; then + msg_info "Resizing disk to $DISK_SIZE GB" + qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null +else + msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB" + qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null +fi + +msg_ok "Created a Ubuntu 22.04 VM ${CL}${BL}(${HN})" +if [ "$START_VM" == "yes" ]; then + msg_info "Starting Ubuntu 22.04 VM" + qm start $VMID + msg_ok "Started Ubuntu 22.04 VM" +fi +post_update_to_api "done" "none" +msg_ok "Completed successfully!\n" +echo -e "Setup Cloud-Init before starting \n +More info at https://github.com/community-scripts/ProxmoxVE/discussions/272 \n" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/ubuntu2404-vm.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/ubuntu2404-vm.sh new file mode 100644 index 000000000..25e5c2ea9 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/ubuntu2404-vm.sh @@ -0,0 +1,567 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT +# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) + +function header_info { + clear + cat <<"EOF" + __ ____ __ ___ __ __ ____ __ __ _ ____ ___ + / / / / /_ __ ______ / /___ __ |__ \/ // / / __ \/ // / | | / / |/ / + / / / / __ \/ / / / __ \/ __/ / / / __/ / // /_ / / / / // /_ | | / / /|_/ / +/ /_/ / /_/ / /_/ / / / / /_/ /_/ / / __/__ __// /_/ /__ __/ | |/ / / / / +\____/_.___/\__,_/_/ /_/\__/\__,_/ /____/ /_/ (_)____/ /_/ |___/_/ /_/ + +EOF +} +header_info +echo -e "\n Loading..." +GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') +RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" +METHOD="" +NSAPP="ubuntu-2404-vm" +var_os="ubuntu" +var_version="2404" + +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +RD=$(echo "\033[01;31m") +BGN=$(echo "\033[4;92m") +GN=$(echo "\033[1;92m") +DGN=$(echo "\033[32m") +CL=$(echo "\033[m") + +CL=$(echo "\033[m") +BOLD=$(echo "\033[1m") +BFR="\\r\\033[K" +HOLD=" " +TAB=" " + +CM="${TAB}âœ”ī¸${TAB}${CL}" +CROSS="${TAB}âœ–ī¸${TAB}${CL}" +INFO="${TAB}💡${TAB}${CL}" +OS="${TAB}đŸ–Ĩī¸${TAB}${CL}" +CONTAINERTYPE="${TAB}đŸ“Ļ${TAB}${CL}" +DISKSIZE="${TAB}💾${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}đŸ› ī¸${TAB}${CL}" +CONTAINERID="${TAB}🆔${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}🌉${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DEFAULT="${TAB}âš™ī¸${TAB}${CL}" +MACADDRESS="${TAB}🔗${TAB}${CL}" +VLANTAG="${TAB}đŸˇī¸${TAB}${CL}" +CREATING="${TAB}🚀${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" + +THIN="discard=on,ssd=1," +set -e +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP +function error_handler() { + local exit_code="$?" + local line_number="$1" + local command="$2" + post_update_to_api "failed" "$exit_code" + local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}" + echo -e "\n$error_message\n" + cleanup_vmid +} + +function get_valid_nextid() { + local try_id + try_id=$(pvesh get /cluster/nextid) + while true; do + if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then + try_id=$((try_id + 1)) + continue + fi + if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then + try_id=$((try_id + 1)) + continue + fi + break + done + echo "$try_id" +} + +function cleanup_vmid() { + if qm status $VMID &>/dev/null; then + qm stop $VMID &>/dev/null + qm destroy $VMID &>/dev/null + fi +} + +function cleanup() { + local exit_code=$? + popd >/dev/null + if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then + if [[ $exit_code -eq 0 ]]; then + post_update_to_api "done" "none" + else + post_update_to_api "failed" "$exit_code" + fi + fi + rm -rf $TEMP_DIR +} + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Ubuntu 24.04 VM" --yesno "This will create a New Ubuntu 24.04 VM. Proceed?" 10 58; then + : +else + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit +fi + +function msg_info() { + local msg="$1" + echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR}${CM}${GN}${msg}${CL}" +} + +function msg_error() { + local msg="$1" + echo -e "${BFR}${CROSS}${RD}${msg}${CL}" +} + +function check_root() { + if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then + clear + msg_error "Please run this script as root." + echo -e "\nExiting..." + sleep 2 + exit + fi +} + +# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. +# Supported: Proxmox VE 8.0.x – 8.9.x, 9.0 and 9.1 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x: allow 8.0–8.9 + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 9)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 8.0 – 8.9" + exit 105 + fi + return 0 + fi + + # Check for Proxmox VE 9.x: allow 9.0 and 9.1 + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 1)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 9.0 – 9.1" + exit 105 + fi + return 0 + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0 – 9.1" + exit 105 +} + +function arch_check() { + if [ "$(dpkg --print-architecture)" != "amd64" ]; then + echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" + echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function ssh_check() { + if command -v pveversion >/dev/null 2>&1; then + if [ -n "${SSH_CLIENT:+x}" ]; then + if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then + echo "you've been warned" + else + clear + exit + fi + fi + fi +} + +function exit-script() { + clear + echo -e "\n${CROSS}${RD}User exited script${CL}\n" + exit +} + +function default_settings() { + VMID=$(get_valid_nextid) + FORMAT=",efitype=4m" + MACHINE="" + DISK_SIZE="7G" + DISK_CACHE="" + HN="ubuntu" + CPU_TYPE="" + CORE_COUNT="2" + RAM_SIZE="2048" + BRG="vmbr0" + MAC="$GEN_MAC" + VLAN="" + MTU="" + START_VM="yes" + METHOD="default" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a Ubuntu 24.04 VM using the above default settings${CL}" +} + +function advanced_settings() { + METHOD="advanced" + [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid) + while true; do + if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VMID" ]; then + VMID=$(get_valid_nextid) + fi + if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then + echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + break + else + exit-script + fi + done + + if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ + "i440fx" "Machine i440fx" ON \ + "q35" "Machine q35" OFF \ + 3>&1 1>&2 2>&3); then + if [ $MACH = q35 ]; then + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT="" + MACHINE=" -machine q35" + else + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT=",efitype=4m" + MACHINE="" + fi + else + exit-script + fi + + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + DISK_SIZE="${DISK_SIZE}G" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + else + echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}" + exit-script + fi + else + exit-script + fi + + if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "None (Default)" ON \ + "1" "Write Through" OFF \ + 3>&1 1>&2 2>&3); then + if [ $DISK_CACHE = "1" ]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}" + DISK_CACHE="cache=writethrough," + else + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + DISK_CACHE="" + fi + else + exit-script + fi + + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 ubuntu --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VM_NAME ]; then + HN="ubuntu" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + else + HN=$(echo ${VM_NAME,,} | tr -d ' ') + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + fi + else + exit-script + fi + + if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "KVM64 (Default)" ON \ + "1" "Host" OFF \ + 3>&1 1>&2 2>&3); then + if [ $CPU_TYPE1 = "1" ]; then + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" + CPU_TYPE=" -cpu host" + else + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + CPU_TYPE="" + fi + else + exit-script + fi + + if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $CORE_COUNT ]; then + CORE_COUNT="2" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + else + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + fi + else + exit-script + fi + + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $RAM_SIZE ]; then + RAM_SIZE="2048" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + else + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + fi + else + exit-script + fi + + if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $BRG ]; then + BRG="vmbr0" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + else + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + fi + else + exit-script + fi + + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MAC1 ]; then + MAC="$GEN_MAC" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" + else + MAC="$MAC1" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}" + fi + else + exit-script + fi + + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VLAN1 ]; then + VLAN1="Default" + VLAN="" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + else + VLAN=",tag=$VLAN1" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + fi + else + exit-script + fi + + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MTU1 ]; then + MTU1="Default" + MTU="" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + else + MTU=",mtu=$MTU1" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + fi + else + exit-script + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + else + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}" + START_VM="no" + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Ubuntu 24.04 VM?" --no-button Do-Over 10 58); then + echo -e "${CREATING}${BOLD}${DGN}Creating a Ubuntu 24.04 VM using the above advanced settings${CL}" + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} +check_root +arch_check +pve_check +ssh_check +start_script +post_to_api_vm + +msg_info "Validating Storage" +while read -r line; do + TAG=$(echo $line | awk '{print $1}') + TYPE=$(echo $line | awk '{printf "%-10s", $2}') + FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1') +VALID=$(pvesm status -content images | awk 'NR>1') +if [ -z "$VALID" ]; then + msg_error "Unable to detect a valid storage location." + exit +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + while [ -z "${STORAGE:+x}" ]; do + STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ + "Which storage pool would you like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." +msg_info "Retrieving the URL for the Ubuntu 24.04 Disk Image" +URL=https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img +sleep 2 +msg_ok "${CL}${BL}${URL}${CL}" +curl -f#SL -o "$(basename "$URL")" "$URL" +echo -en "\e[1A\e[0K" +FILE=$(basename $URL) +msg_ok "Downloaded ${CL}${BL}${FILE}${CL}" + +STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') +case $STORAGE_TYPE in +nfs | dir | cifs) + DISK_EXT=".qcow2" + DISK_REF="$VMID/" + DISK_IMPORT="-format qcow2" + THIN="" + ;; +btrfs) + DISK_EXT=".raw" + DISK_REF="$VMID/" + DISK_IMPORT="-format raw" + FORMAT=",efitype=4m" + THIN="" + ;; +*) + DISK_EXT="" + DISK_REF="" + DISK_IMPORT="-format raw" + ;; +esac +for i in {0,1}; do + disk="DISK$i" + eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-} + eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk} +done + +msg_info "Creating a Ubuntu 24.04 VM" +qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ + -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci +pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null +qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null +qm set $VMID \ + -efidisk0 ${DISK0_REF}${FORMAT} \ + -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \ + -ide2 ${STORAGE}:cloudinit \ + -boot order=scsi0 \ + -serial0 socket >/dev/null +DESCRIPTION=$( + cat <<EOF +<div align='center'> + <a href='https://Helper-Scripts.com' target='_blank' rel='noopener noreferrer'> + <img src='https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/images/logo-81x112.png' alt='Logo' style='width:81px;height:112px;'/> + </a> + + <h2 style='font-size: 24px; margin: 20px 0;'>ubuntu VM</h2> + + <p style='margin: 16px 0;'> + <a href='https://ko-fi.com/community_scripts' target='_blank' rel='noopener noreferrer'> + <img src='https://img.shields.io/badge/☕-Buy us a coffee-blue' alt='spend Coffee' /> + </a> + </p> + + <span style='margin: 0 10px;'> + <i class="fa fa-github fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>GitHub</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-comments fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/discussions' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Discussions</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-exclamation-circle fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/issues' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Issues</a> + </span> +</div> +EOF +) +qm set $VMID -description "$DESCRIPTION" >/dev/null +if [ -n "$DISK_SIZE" ]; then + msg_info "Resizing disk to $DISK_SIZE GB" + qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null +else + msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB" + qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null +fi + +msg_ok "Created a Ubuntu 24.04 VM ${CL}${BL}(${HN})" +if [ "$START_VM" == "yes" ]; then + msg_info "Starting Ubuntu 24.04 VM" + qm start $VMID + msg_ok "Started Ubuntu 24.04 VM" +fi +post_update_to_api "done" "none" +msg_ok "Completed successfully!\n" +echo -e "Setup Cloud-Init before starting \n +More info at https://github.com/community-scripts/ProxmoxVE/discussions/272 \n" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/ubuntu2504-vm.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/ubuntu2504-vm.sh new file mode 100644 index 000000000..7b0176f69 --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/ubuntu2504-vm.sh @@ -0,0 +1,566 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) + +function header_info { + clear + cat <<"EOF" + __ ____ __ ___ ______ ____ __ __ _ ____ ___ + / / / / /_ __ ______ / /___ __ |__ \ / ____// __ \/ // / | | / / |/ / + / / / / __ \/ / / / __ \/ __/ / / / __/ //___ \ / / / / // /_ | | / / /|_/ / +/ /_/ / /_/ / /_/ / / / / /_/ /_/ / / __/____/ // /_/ /__ __/ | |/ / / / / +\____/_.___/\__,_/_/ /_/\__/\__,_/ /____/_____(_)____/ /_/ |___/_/ /_/ (Plucky Puffin) + +EOF +} +header_info +echo -e "\n Loading..." +GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') +RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" +METHOD="" +NSAPP="ubuntu-2504-vm" +var_os="ubuntu" +var_version="2504" + +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +RD=$(echo "\033[01;31m") +BGN=$(echo "\033[4;92m") +GN=$(echo "\033[1;92m") +DGN=$(echo "\033[32m") +CL=$(echo "\033[m") + +CL=$(echo "\033[m") +BOLD=$(echo "\033[1m") +BFR="\\r\\033[K" +HOLD=" " +TAB=" " + +CM="${TAB}âœ”ī¸${TAB}${CL}" +CROSS="${TAB}âœ–ī¸${TAB}${CL}" +INFO="${TAB}💡${TAB}${CL}" +OS="${TAB}đŸ–Ĩī¸${TAB}${CL}" +CONTAINERTYPE="${TAB}đŸ“Ļ${TAB}${CL}" +DISKSIZE="${TAB}💾${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}đŸ› ī¸${TAB}${CL}" +CONTAINERID="${TAB}🆔${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}🌉${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DEFAULT="${TAB}âš™ī¸${TAB}${CL}" +MACADDRESS="${TAB}🔗${TAB}${CL}" +VLANTAG="${TAB}đŸˇī¸${TAB}${CL}" +CREATING="${TAB}🚀${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" + +THIN="discard=on,ssd=1," +set -e +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP +function error_handler() { + local exit_code="$?" + local line_number="$1" + local command="$2" + post_update_to_api "failed" "$exit_code" + local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}" + echo -e "\n$error_message\n" + cleanup_vmid +} + +function get_valid_nextid() { + local try_id + try_id=$(pvesh get /cluster/nextid) + while true; do + if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then + try_id=$((try_id + 1)) + continue + fi + if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then + try_id=$((try_id + 1)) + continue + fi + break + done + echo "$try_id" +} + +function cleanup_vmid() { + if qm status $VMID &>/dev/null; then + qm stop $VMID &>/dev/null + qm destroy $VMID &>/dev/null + fi +} + +function cleanup() { + local exit_code=$? + popd >/dev/null + if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then + if [[ $exit_code -eq 0 ]]; then + post_update_to_api "done" "none" + else + post_update_to_api "failed" "$exit_code" + fi + fi + rm -rf $TEMP_DIR +} + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Ubuntu 25.04 VM" --yesno "This will create a New Ubuntu 25.04 VM. Proceed?" 10 58; then + : +else + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit +fi + +function msg_info() { + local msg="$1" + echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR}${CM}${GN}${msg}${CL}" +} + +function msg_error() { + local msg="$1" + echo -e "${BFR}${CROSS}${RD}${msg}${CL}" +} + +function check_root() { + if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then + clear + msg_error "Please run this script as root." + echo -e "\nExiting..." + sleep 2 + exit + fi +} + +# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. +# Supported: Proxmox VE 8.0.x – 8.9.x, 9.0 and 9.1 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x: allow 8.0–8.9 + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 9)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 8.0 – 8.9" + exit 105 + fi + return 0 + fi + + # Check for Proxmox VE 9.x: allow 9.0 and 9.1 + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 1)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 9.0 – 9.1" + exit 105 + fi + return 0 + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0 – 9.1" + exit 105 +} + +function arch_check() { + if [ "$(dpkg --print-architecture)" != "amd64" ]; then + echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" + echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function ssh_check() { + if command -v pveversion >/dev/null 2>&1; then + if [ -n "${SSH_CLIENT:+x}" ]; then + if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then + echo "you've been warned" + else + clear + exit + fi + fi + fi +} + +function exit-script() { + clear + echo -e "\n${CROSS}${RD}User exited script${CL}\n" + exit +} + +function default_settings() { + VMID=$(get_valid_nextid) + FORMAT=",efitype=4m" + MACHINE="" + DISK_SIZE="7G" + DISK_CACHE="" + HN="ubuntu" + CPU_TYPE="" + CORE_COUNT="2" + RAM_SIZE="2048" + BRG="vmbr0" + MAC="$GEN_MAC" + VLAN="" + MTU="" + START_VM="no" + METHOD="default" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a Ubuntu 25.04 VM using the above default settings${CL}" +} + +function advanced_settings() { + METHOD="advanced" + [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid) + while true; do + if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VMID" ]; then + VMID=$(get_valid_nextid) + fi + if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then + echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + break + else + exit-script + fi + done + + if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ + "i440fx" "Machine i440fx" ON \ + "q35" "Machine q35" OFF \ + 3>&1 1>&2 2>&3); then + if [ $MACH = q35 ]; then + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT="" + MACHINE=" -machine q35" + else + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT=",efitype=4m" + MACHINE="" + fi + else + exit-script + fi + + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + DISK_SIZE="${DISK_SIZE}G" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + else + echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}" + exit-script + fi + else + exit-script + fi + + if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "None (Default)" ON \ + "1" "Write Through" OFF \ + 3>&1 1>&2 2>&3); then + if [ $DISK_CACHE = "1" ]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}" + DISK_CACHE="cache=writethrough," + else + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + DISK_CACHE="" + fi + else + exit-script + fi + + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 ubuntu --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VM_NAME ]; then + HN="ubuntu" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + else + HN=$(echo ${VM_NAME,,} | tr -d ' ') + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + fi + else + exit-script + fi + + if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "KVM64 (Default)" ON \ + "1" "Host" OFF \ + 3>&1 1>&2 2>&3); then + if [ $CPU_TYPE1 = "1" ]; then + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" + CPU_TYPE=" -cpu host" + else + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + CPU_TYPE="" + fi + else + exit-script + fi + + if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $CORE_COUNT ]; then + CORE_COUNT="2" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + else + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + fi + else + exit-script + fi + + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $RAM_SIZE ]; then + RAM_SIZE="2048" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + else + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + fi + else + exit-script + fi + + if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $BRG ]; then + BRG="vmbr0" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + else + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + fi + else + exit-script + fi + + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MAC1 ]; then + MAC="$GEN_MAC" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" + else + MAC="$MAC1" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}" + fi + else + exit-script + fi + + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VLAN1 ]; then + VLAN1="Default" + VLAN="" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + else + VLAN=",tag=$VLAN1" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + fi + else + exit-script + fi + + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MTU1 ]; then + MTU1="Default" + MTU="" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + else + MTU=",mtu=$MTU1" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + fi + else + exit-script + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + else + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}" + START_VM="no" + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Ubuntu 25.04 VM?" --no-button Do-Over 10 58); then + echo -e "${CREATING}${BOLD}${DGN}Creating a Ubuntu 25.04 VM using the above advanced settings${CL}" + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} +check_root +arch_check +pve_check +ssh_check +start_script +post_to_api_vm + +msg_info "Validating Storage" +while read -r line; do + TAG=$(echo $line | awk '{print $1}') + TYPE=$(echo $line | awk '{printf "%-10s", $2}') + FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1') +VALID=$(pvesm status -content images | awk 'NR>1') +if [ -z "$VALID" ]; then + msg_error "Unable to detect a valid storage location." + exit +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + while [ -z "${STORAGE:+x}" ]; do + STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ + "Which storage pool would you like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." +msg_info "Retrieving the URL for the Ubuntu 25.04 Disk Image" +URL=https://cloud-images.ubuntu.com/plucky/current/plucky-server-cloudimg-amd64.img +sleep 2 +msg_ok "${CL}${BL}${URL}${CL}" +curl -f#SL -o "$(basename "$URL")" "$URL" +echo -en "\e[1A\e[0K" +FILE=$(basename $URL) +msg_ok "Downloaded ${CL}${BL}${FILE}${CL}" + +STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') +case $STORAGE_TYPE in +nfs | dir | cifs) + DISK_EXT=".qcow2" + DISK_REF="$VMID/" + DISK_IMPORT="-format qcow2" + THIN="" + ;; +btrfs) + DISK_EXT=".raw" + DISK_REF="$VMID/" + DISK_IMPORT="-format raw" + FORMAT=",efitype=4m" + THIN="" + ;; +*) + DISK_EXT="" + DISK_REF="" + DISK_IMPORT="-format raw" + ;; +esac +for i in {0,1}; do + disk="DISK$i" + eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-} + eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk} +done + +msg_info "Creating a Ubuntu 25.04 VM" +qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ + -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci +pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null +qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null +qm set $VMID \ + -efidisk0 ${DISK0_REF}${FORMAT} \ + -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \ + -ide2 ${STORAGE}:cloudinit \ + -boot order=scsi0 \ + -serial0 socket >/dev/null +DESCRIPTION=$( + cat <<EOF +<div align='center'> + <a href='https://Helper-Scripts.com' target='_blank' rel='noopener noreferrer'> + <img src='https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/images/logo-81x112.png' alt='Logo' style='width:81px;height:112px;'/> + </a> + + <h2 style='font-size: 24px; margin: 20px 0;'>ubuntu VM</h2> + + <p style='margin: 16px 0;'> + <a href='https://ko-fi.com/community_scripts' target='_blank' rel='noopener noreferrer'> + <img src='https://img.shields.io/badge/☕-Buy us a coffee-blue' alt='spend Coffee' /> + </a> + </p> + + <span style='margin: 0 10px;'> + <i class="fa fa-github fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>GitHub</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-comments fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/discussions' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Discussions</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-exclamation-circle fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/issues' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Issues</a> + </span> +</div> +EOF +) +qm set $VMID -description "$DESCRIPTION" >/dev/null +if [ -n "$DISK_SIZE" ]; then + msg_info "Resizing disk to $DISK_SIZE GB" + qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null +else + msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB" + qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null +fi + +msg_ok "Created a Ubuntu 25.04 VM ${CL}${BL}(${HN})" +if [ "$START_VM" == "yes" ]; then + msg_info "Starting Ubuntu 25.04 VM" + qm start $VMID + msg_ok "Started Ubuntu 25.04 VM" +fi +post_update_to_api "done" "none" +msg_ok "Completed successfully!\n" +echo -e "Setup Cloud-Init before starting \n +More info at https://github.com/community-scripts/ProxmoxVE/discussions/272 \n" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/umbrel-os-vm.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/umbrel-os-vm.sh new file mode 100644 index 000000000..fc193d0bb --- /dev/null +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/umbrel-os-vm.sh @@ -0,0 +1,613 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) + +function header_info { + clear + cat <<"EOF" + __ __ __ __ ____ _____ _ ____ ___ + / / / /___ ___ / /_ ________ / / / __ \/ ___/ | | / / |/ / + / / / / __ `__ \/ __ \/ ___/ _ \/ / / / / /\__ \ | | / / /|_/ / +/ /_/ / / / / / / /_/ / / / __/ / / /_/ /___/ / | |/ / / / / +\____/_/ /_/ /_/_.___/_/ \___/_/ \____//____/ |___/_/ /_/ + +EOF +} +header_info +echo -e "\n Loading..." +GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') +RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" +METHOD="" +NSAPP="umbrel-os-vm" +var_os="umbrel-os" +var_version="n.d." + +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +HA=$(echo "\033[1;34m") +RD=$(echo "\033[01;31m") +BGN=$(echo "\033[4;92m") +GN=$(echo "\033[1;92m") +DGN=$(echo "\033[32m") +CL=$(echo "\033[m") + +BOLD=$(echo "\033[1m") +BFR="\\r\\033[K" +HOLD=" " +TAB=" " + +CM="${TAB}âœ”ī¸${TAB}${CL}" +CROSS="${TAB}âœ–ī¸${TAB}${CL}" +INFO="${TAB}💡${TAB}${CL}" +OS="${TAB}đŸ–Ĩī¸${TAB}${CL}" +CONTAINERTYPE="${TAB}đŸ“Ļ${TAB}${CL}" +DISKSIZE="${TAB}💾${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}đŸ› ī¸${TAB}${CL}" +CONTAINERID="${TAB}🆔${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}🌉${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DEFAULT="${TAB}âš™ī¸${TAB}${CL}" +MACADDRESS="${TAB}🔗${TAB}${CL}" +VLANTAG="${TAB}đŸˇī¸${TAB}${CL}" +CREATING="${TAB}🚀${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" + +THIN="discard=on,ssd=1," +set -e +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP +function error_handler() { + local exit_code="$?" + local line_number="$1" + local command="$2" + local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}" + post_update_to_api "failed" "${exit_code}" + echo -e "\n$error_message\n" + cleanup_vmid +} + +function get_valid_nextid() { + local try_id + try_id=$(pvesh get /cluster/nextid) + while true; do + if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then + try_id=$((try_id + 1)) + continue + fi + if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then + try_id=$((try_id + 1)) + continue + fi + break + done + echo "$try_id" +} + +function cleanup_vmid() { + if qm status $VMID &>/dev/null; then + qm stop $VMID &>/dev/null + qm destroy $VMID &>/dev/null + fi +} + +function cleanup() { + local exit_code=$? + popd >/dev/null + if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then + if [[ $exit_code -eq 0 ]]; then + post_update_to_api "done" "none" + else + post_update_to_api "failed" "$exit_code" + fi + fi + rm -rf $TEMP_DIR +} + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Umbrel OS VM" --yesno "This will create a New Umbrel OS VM. Proceed?" 10 58; then + : +else + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit +fi + +function msg_info() { + local msg="$1" + echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR}${CM}${GN}${msg}${CL}" +} + +function msg_error() { + local msg="$1" + echo -e "${BFR}${CROSS}${RD}${msg}${CL}" +} + +function check_root() { + if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then + clear + msg_error "Please run this script as root." + echo -e "\nExiting..." + sleep 2 + exit + fi +} + +# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. +# Supported: Proxmox VE 8.0.x – 8.9.x, 9.0 and 9.1 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x: allow 8.0–8.9 + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 9)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 8.0 – 8.9" + exit 105 + fi + return 0 + fi + + # Check for Proxmox VE 9.x: allow 9.0 and 9.1 + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 0 || MINOR > 1)); then + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported: Proxmox VE version 9.0 – 9.1" + exit 105 + fi + return 0 + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0 – 9.1" + exit 105 +} + +function arch_check() { + if [ "$(dpkg --print-architecture)" != "amd64" ]; then + echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" + echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function ssh_check() { + if command -v pveversion >/dev/null 2>&1; then + if [ -n "${SSH_CLIENT:+x}" ]; then + if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then + echo "you've been warned" + else + clear + exit + fi + fi + fi +} + +function exit-script() { + clear + echo -e "\n${CROSS}${RD}User exited script${CL}\n" + exit +} + +# Ensure pv is installed or abort with instructions +function ensure_pv() { + if ! command -v pv &>/dev/null; then + msg_info "Installing required package: pv" + if ! apt-get update -qq &>/dev/null || ! apt-get install -y pv &>/dev/null; then + msg_error "Failed to install pv automatically." + echo -e "\nPlease run manually on the Proxmox host:\n apt install pv\n" + exit 237 + fi + msg_ok "Installed pv" + fi +} + +# Download an .xz file and validate it +# Args: $1=url $2=cache_file +function download_and_validate_xz() { + local url="$1" + local file="$2" + + # If file exists, check validity + if [[ -s "$file" ]]; then + if xz -t "$file" &>/dev/null; then + msg_ok "Using cached image $(basename "$file")" + return 0 + else + msg_error "Cached file $(basename "$file") is corrupted. Deleting and retrying download..." + rm -f "$file" + fi + fi + + # Download fresh file + msg_info "Downloading image: $(basename "$file")" + if ! curl -fSL -o "$file" "$url"; then + msg_error "Download failed: $url" + rm -f "$file" + exit 115 + fi + + # Validate again + if ! xz -t "$file" &>/dev/null; then + msg_error "Downloaded file $(basename "$file") is corrupted. Please try again later." + rm -f "$file" + exit 115 + fi + msg_ok "Downloaded and validated $(basename "$file")" +} + +# Extract .xz with pv +# Args: $1=cache_file $2=target_img +function extract_xz_with_pv() { + set -o pipefail + local file="$1" + local target="$2" + + msg_info "Decompressing $(basename "$file") to $target" + if ! xz -dc "$file" | pv -N "Extracting" >"$target"; then + msg_error "Failed to extract $file" + rm -f "$target" + exit 115 + fi + msg_ok "Decompressed to $target" +} + +function default_settings() { + VMID=$(get_valid_nextid) + MACHINE="q35" + FORMAT="" + DISK_SIZE="32G" + HN="umbrelos" + CPU_TYPE="" + CORE_COUNT="2" + RAM_SIZE="4096" + BRG="vmbr0" + MAC="$GEN_MAC" + VLAN="" + MTU="" + START_VM="yes" + METHOD="default" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}q35${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a Umbrel OS VM using the above default settings${CL}" +} + +function advanced_settings() { + METHOD="advanced" + [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid) + while true; do + if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VMID" ]; then + VMID=$(get_valid_nextid) + fi + if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then + echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + break + else + exit-script + fi + done + + if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Machine Type" 10 58 2 \ + "q35" "Modern (PCIe, UEFI, default)" ON \ + "i440fx" "Legacy (older compatibility)" OFF \ + 3>&1 1>&2 2>&3); then + if [ "$MACH" = "q35" ]; then + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}q35${CL}" + FORMAT="" + MACHINE=" -machine q35" + else + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}" + FORMAT=",efitype=4m" + MACHINE="" + fi + else + exit-script + fi + + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + DISK_SIZE="${DISK_SIZE}G" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + else + echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}" + exit-script + fi + else + exit-script + fi + + if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "None (Default)" ON \ + "1" "Write Through" OFF \ + 3>&1 1>&2 2>&3); then + if [ $DISK_CACHE = "1" ]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}" + DISK_CACHE="cache=writethrough," + else + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + DISK_CACHE="" + fi + else + exit-script + fi + + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 umbrelos --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VM_NAME ]; then + HN="umbrelos" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + else + HN=$(echo ${VM_NAME,,} | tr -d ' ') + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + fi + else + exit-script + fi + + if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose CPU Model" --cancel-button Exit-Script 10 58 2 \ + "KVM64" "Default – safe for migration/compatibility" ON \ + "Host" "Use host CPU features (faster, no migration)" OFF \ + 3>&1 1>&2 2>&3); then + case "$CPU_TYPE1" in + "Host") + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" + CPU_TYPE=" -cpu host" + ;; + *) + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + CPU_TYPE="" + ;; + esac + else + exit-script + fi + + if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $CORE_COUNT ]; then + CORE_COUNT="2" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + else + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + fi + else + exit-script + fi + + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $RAM_SIZE ]; then + RAM_SIZE="2048" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + else + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + fi + else + exit-script + fi + + if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $BRG ]; then + BRG="vmbr0" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + else + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + fi + else + exit-script + fi + + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MAC1 ]; then + MAC="$GEN_MAC" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" + else + MAC="$MAC1" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}" + fi + else + exit-script + fi + + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VLAN1 ]; then + VLAN1="Default" + VLAN="" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + else + VLAN=",tag=$VLAN1" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + fi + else + exit-script + fi + + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MTU1 ]; then + MTU1="Default" + MTU="" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + else + MTU=",mtu=$MTU1" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + fi + else + exit-script + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + else + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}" + START_VM="no" + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Umbrel OS VM?" --no-button Do-Over 10 58); then + echo -e "${CREATING}${BOLD}${DGN}Creating a Umbrel OS VM using the above advanced settings${CL}" + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +check_root +arch_check +pve_check +ssh_check +ensure_pv +start_script +post_to_api_vm + +msg_info "Validating Storage" +STORAGE_MENU=() +while read -r tag type free; do + ITEM="Type: $type Free: $free" + STORAGE_MENU+=("$tag" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1 {printf "%s %s %s\n", $1, $2, $6}') + +if [ ${#STORAGE_MENU[@]} -eq 0 ]; then + msg_error "Unable to detect a valid storage location." + exit 119 +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + while [ -z "${STORAGE:+x}" ]; do + STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ + "Which storage pool would you like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \ + 16 70 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." + +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." + +URL="https://download.umbrel.com/release/latest/umbrelos-amd64.img.xz" +CACHE_DIR="/var/lib/vz/template/cache" +CACHE_FILE="$CACHE_DIR/$(basename "$URL")" +FILE_IMG="/var/lib/vz/template/tmp/${CACHE_FILE##*/%.xz}" + +mkdir -p "$CACHE_DIR" "$(dirname "$FILE_IMG")" + +download_and_validate_xz "$URL" "$CACHE_FILE" + +qm create $VMID -machine q35 -bios ovmf -agent 1 -tablet 0 -localtime 1 ${CPU_TYPE} \ + -cores "$CORE_COUNT" -memory "$RAM_SIZE" -name "$HN" -tags community-script \ + -net0 "virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU" -onboot 1 -ostype l26 -scsihw virtio-scsi-pci >/dev/null + +extract_xz_with_pv "$CACHE_FILE" "$FILE_IMG" + +if qm disk import --help >/dev/null 2>&1; then + IMPORT_CMD=(qm disk import) +else + IMPORT_CMD=(qm importdisk) +fi +IMPORT_OUT="$("${IMPORT_CMD[@]}" "$VMID" "$FILE_IMG" "$STORAGE" --format raw 2>&1 || true)" +DISK_REF="$(printf '%s\n' "$IMPORT_OUT" | sed -n "s/.*imported disk '\([^']\+\)'.*/\1/p" | tr -d "\r\"'")" +[[ -z "$DISK_REF" ]] && DISK_REF="$(pvesm list "$STORAGE" | awk -v id="$VMID" '$5 ~ ("vm-"id"-disk-") {print $1":"$5}' | sort | tail -n1)" + +qm set $VMID \ + --efidisk0 ${STORAGE}:0,efitype=4m \ + --scsi0 ${DISK_REF},ssd=1,discard=on \ + --boot order=scsi0 \ + --serial0 socket >/dev/null +qm set $VMID --agent enabled=1 >/dev/null +qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null + +DESCRIPTION=$( + cat <<EOF +<div align='center'> + <a href='https://Helper-Scripts.com' target='_blank' rel='noopener noreferrer'> + <img src='https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/images/logo-81x112.png' alt='Logo' style='width:81px;height:112px;'/> + </a> + + <h2 style='font-size: 24px; margin: 20px 0;'>Umbrel OS VM</h2> + + <p style='margin: 16px 0;'> + <a href='https://ko-fi.com/community_scripts' target='_blank' rel='noopener noreferrer'> + <img src='https://img.shields.io/badge/☕-Buy us a coffee-blue' alt='spend Coffee' /> + </a> + </p> + + <span style='margin: 0 10px;'> + <i class="fa fa-github fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>GitHub</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-comments fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/discussions' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Discussions</a> + </span> + <span style='margin: 0 10px;'> + <i class="fa fa-exclamation-circle fa-fw" style="color: #f5f5f5;"></i> + <a href='https://github.com/community-scripts/ProxmoxVE/issues' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Issues</a> + </span> +</div> +EOF +) +qm set $VMID -description "$DESCRIPTION" >/dev/null + +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Image Cache" \ + --yesno "Keep downloaded Umbrel OS image for future VMs?\n\nFile: $CACHE_FILE" 10 70; then + msg_ok "Keeping cached image" +else + rm -f "$CACHE_FILE" + msg_ok "Deleted cached image" +fi +rm -f "$FILE_IMG" + +msg_ok "Created a Umbrel OS VM ${CL}${BL}(${HN})" +if [ "$START_VM" == "yes" ]; then + msg_info "Starting Umbrel OS VM" + qm start $VMID + msg_ok "Started Umbrel OS VM" +fi +post_update_to_api "done" "none" +msg_ok "Completed successfully!\n" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/headers/osx-proxmox-next b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/headers/osx-proxmox-next index a1997c560..1e96c60a5 100644 --- a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/headers/osx-proxmox-next +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/headers/osx-proxmox-next @@ -1,6 +1,6 @@ - ____ ______ __ ____ _ __ __ - / __ \/ ___/ |/ / / __ \_________ _ ______ ___ ____ _ __ / | / /__ _ __/ /_ - / / / /\__ \| / / /_/ / ___/ __ \| |/_/ __ `__ \/ __ \| |/_/ / |/ / _ \| |/_/ __/ -/ /_/ /___/ / | / ____/ / / /_/ /> </ / / / / / /_/ /> < / /| / __/> </ /_ -\____//____/_/|_| /_/ /_/ \____/_/|_/_/ /_/ /_/\____/_/|_| /_/ |_/\___/_/|_|\__/ - \ No newline at end of file + __ + ____ ______ __ ____ _________ _ ______ ___ ____ _ __ ____ ___ _ __/ /_ + / __ \/ ___/ |/_/_____/ __ \/ ___/ __ \| |/_/ __ `__ \/ __ \| |/_/_____/ __ \/ _ \| |/_/ __/ +/ /_/ (__ )> </_____/ /_/ / / / /_/ /> </ / / / / / /_/ /> </_____/ / / / __/> </ /_ +\____/____/_/|_| / .___/_/ \____/_/|_/_/ /_/ /_/\____/_/|_| /_/ /_/\___/_/|_|\__/ + /_/ diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/headers/olares-vm b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/headers/olares-vm index bf28b330a..20201c6ff 100644 --- a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/headers/olares-vm +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/vm/headers/olares-vm @@ -1,7 +1,6 @@ - ____ __ _ - / __ \/ /___ ____ ___ (_)___ ____ _ - / / / / / __ \/ __ `__ \/ / __ \/ __ `/ -/ /_/ / / /_/ / / / / / / / / / / /_/ / -\____/_/\____/_/ /_/ /_/_/_/ /_/\__,_/ - - Personal Cloud OS - Kubernetes Powered + ____ __ + / __ \/ /___ _________ _____ + / / / / / __ `/ ___/ _ \/ ___/ +/ /_/ / / /_/ / / / __(__ ) +\____/_/\__,_/_/ \___/____/ + diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/pve-privilege-converter.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/pve-privilege-converter.sh index 36421a216..3207bb74e 100644 --- a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/pve-privilege-converter.sh +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/pve-privilege-converter.sh @@ -134,16 +134,20 @@ manage_states() { read -rp "Shutdown source and start new container? [Y/n]: " answer answer=${answer:-Y} if [[ $answer =~ ^[Yy] ]]; then - pct shutdown "$CONTAINER_ID" - for i in {1..36}; do - sleep 5 - ! pct status "$CONTAINER_ID" | grep -q running && break - done if pct status "$CONTAINER_ID" | grep -q running; then - read -rp "Timeout reached. Force shutdown? [Y/n]: " force - if [[ ${force:-Y} =~ ^[Yy] ]]; then - pkill -9 -f "lxc-start -F -n $CONTAINER_ID" + pct shutdown "$CONTAINER_ID" + for i in {1..36}; do + sleep 5 + ! pct status "$CONTAINER_ID" | grep -q running && break + done + if pct status "$CONTAINER_ID" | grep -q running; then + read -rp "Timeout reached. Force shutdown? [Y/n]: " force + if [[ ${force:-Y} =~ ^[Yy] ]]; then + pkill -9 -f "lxc-start -F -n $CONTAINER_ID" + fi fi + else + msg_custom "â„šī¸" "\e[36m" "Source container $CONTAINER_ID is already stopped" fi pct start "$NEW_CONTAINER_ID" msg_ok "New container started" diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/update-apps.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/update-apps.sh index e7b26ed5f..4bb668be3 100644 --- a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/update-apps.sh +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/pve/update-apps.sh @@ -426,16 +426,23 @@ for container in $CHOICE; do elif [ $exit_code -eq 75 ]; then echo -e "${YW}[WARN]${CL} Container $container skipped (requires interactive mode)" elif [ "$BACKUP_CHOICE" == "yes" ]; then - msg_info "Restoring LXC from backup" + msg_error "Update failed for container $container (exit code: $exit_code) — attempting restore" + msg_info "Restoring LXC $container from backup ($STORAGE_CHOICE)" pct stop $container LXC_STORAGE=$(pct config $container | awk -F '[:,]' '/rootfs/ {print $2}') - pct restore $container /var/lib/vz/dump/vzdump-lxc-${container}-*.tar.zst --storage $LXC_STORAGE --force >/dev/null 2>&1 - pct start $container + BACKUP_ENTRY=$(pvesm list "$STORAGE_CHOICE" 2>/dev/null | awk -v ctid="$container" '$1 ~ "vzdump-lxc-"ctid"-" || $1 ~ "/ct/"ctid"/" {print $1}' | sort -r | head -n1) + if [ -z "$BACKUP_ENTRY" ]; then + msg_error "No backup found in storage $STORAGE_CHOICE for container $container" + exit 235 + fi + msg_info "Restoring from: $BACKUP_ENTRY" + pct restore $container "$BACKUP_ENTRY" --storage $LXC_STORAGE --force >/dev/null 2>&1 restorestatus=$? if [ $restorestatus -eq 0 ]; then - msg_ok "Restored LXC from backup" + pct start $container + msg_ok "Container $container successfully restored from backup" else - msg_error "Restored LXC from backup failed" + msg_error "Restore failed for container $container" exit 235 fi else diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/addon/rocm.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/addon/rocm.sh index e08031b20..b69360110 100644 --- a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/addon/rocm.sh +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/addon/rocm.sh @@ -1,7 +1,6 @@ #!/usr/bin/env bash -# Copyright (c) 2021-2026 community-scripts ORG -# Author: community-scripts +# Author: BillyOutlast # License: MIT | https://github.com/Heretek-AI/ProxmoxVE/raw/main/LICENSE # Source: https://rocm.docs.amd.com @@ -10,19 +9,23 @@ # Supports: Debian 12, Debian 13, Ubuntu 22.04, Ubuntu 24.04 # ============================================================================== -ensure_dependencies curl - -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func) -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/install.func) +# Source function files FIRST (before calling any functions) +source <(curl -fsSL https://raw.githubusercontent.com/Heretek-AI/ProxmoxVE/main/misc/api.func) 2>/dev/null || true +source <(curl -fsSL https://raw.githubusercontent.com/Heretek-AI/ProxmoxVE/main/misc/core.func) +source <(curl -fsSL https://raw.githubusercontent.com/Heretek-AI/ProxmoxVE/main/misc/tools.func) +source <(curl -fsSL https://raw.githubusercontent.com/Heretek-AI/ProxmoxVE/main/misc/error_handler.func) +source <(curl -fsSL https://raw.githubusercontent.com/Heretek-AI/ProxmoxVE/main/misc/install.func) # Enable error handling set -Eeuo pipefail trap 'error_handler' ERR load_functions -init_tool_telemetry "" "addon" + +# Initialize telemetry AFTER load_functions +declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "" "addon" + +# Now we can use ensure_dependencies (from tools.func) +ensure_dependencies curl function header_info { clear diff --git a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/addon/rocm.sh b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/addon/rocm.sh index b69360110..3682eaab0 100644 --- a/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/addon/rocm.sh +++ b/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/standalone/tools/addon/rocm.sh @@ -403,3 +403,5 @@ else msg_warn "Installation cancelled. Exiting." exit 0 fi + +exit 0