diff --git a/.gitignore b/.gitignore index f673096..012b2ee 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -HELP.md + .gradle build/ !gradle/wrapper/gradle-wrapper.jar @@ -38,3 +38,9 @@ out/ /gradle/wrapper/gradle-wrapper.jar /gradle/wrapper/gradle-wrapper.properties /.gitattributes +/gradle/ +/src/main/resources/public/ +/logs/application.log +/logs/ +/.idea/ +/logs/ diff --git a/HELP.md b/HELP.md new file mode 100644 index 0000000..75481ee --- /dev/null +++ b/HELP.md @@ -0,0 +1,131 @@ + +# How to run the application + +To run the application, follow these steps: + +1. **Build the Project**: + - Ensure you have Java 24, Gradle, and Node.js installed. + - Run the following command to build the project: + ```bash + ./gradlew build + ``` + + 2. **Prepare Frontend Resources**: + - Build the Angular frontend by navigating to the `jambotron-ui` directory and running + ```bash + cd jambotron-ui + ``` + - next: + ```bash + npm install + ``` + - next: + ```bash + npm run build + ``` + - This will generate the frontend files in the `jambotron-ui/dist/jambotron-ui/browser` directory. + + +3. **Copy Frontend Resources**: + - Use the Gradle task to copy the frontend resources to the `jumbotron/src/main/resources/public` directory: + ```bash + cd .. + ``` + - next: + ```bash + ./gradlew copyResources + ``` + then +4. **Create postgres server and database**: + - Create a PostgreSQL database + - named `jambotronDB` with the + - user `admin` and + - password `postgrespw`. + + - You can use a PostgreSQL client or run the following command in your terminal: + ```sql + CREATE DATABASE jambotronDB; + CREATE USER admin WITH PASSWORD 'postgrespw'; + GRANT ALL PRIVILEGES ON DATABASE jambotronDB TO admin; + ``` + - If you are using Docker, you can run PostgreSQL using the following command: + ```bash + docker run --name postgresDB -p 5432:5432 -e POSTGRES_USER=admin -e POSTGRES_PASSWORD=postgrespw -e POSTGRES_DB=jambotronDB -d postgres + ``` + - if you are wont to use pgadmin + ```bash + docker run --name pgadmin -e "PGADMIN_DEFAULT_EMAIL=name@example.com" -e "PGADMIN_DEFAULT_PASSWORD=admin" -p 5050:80 -d dpage/pgadmin4 + ``` + then + - create a network for the containers to communicate: + ```bash + docker network create --driver bridge pgnetwork + ``` + - Show list of networks: + ```bash + docker network ls + ``` + - Connect pgadmin to the network: + ```bash + docker network connect pgnetwork pgadmin + ``` + - Connect postgresDB to the network (postgresDB must by running): + ```bash + docker network connect pgnetwork postgresDB + ``` + - Inspect the network to ensure both containers are connected: + ```bash + docker network inspect pgnetwork + ``` + + + +5. **Run the Application**: + - Start the Spring Boot application: + ```bash + ./gradlew bootRun + ``` + +6. **Access the Application**: + - Open your browser and navigate to `http://localhost:8080`. + +Make sure all dependencies and configurations are correctly set up before running these steps. + + + + +# How to run the application in Docker + +To run the application in Docker, follow these steps: + +- build jar file +```bash +./gradlew bootJar + ``` +- Run docker compose to start the application and PostgreSQL: +```bash +docker-compose -f src/Docker/docker-compose.yml up -d +``` +- For connection from pgadmin use +hostename: **host.docker.internal** +### Reference Documentation +For further reference, please consider the following sections: + +* [Official Gradle documentation](https://docs.gradle.org) +* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/3.5.0/gradle-plugin) +* [Create an OCI image](https://docs.spring.io/spring-boot/3.5.0/gradle-plugin/packaging-oci-image.html) + +### Additional Links +These additional references should also help you: + +* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle) + + + +For docker-compose db connect with pgAdmin used +host.docker.internal + + + + + diff --git a/application.yml b/application.yml new file mode 100644 index 0000000..733c6a1 --- /dev/null +++ b/application.yml @@ -0,0 +1,12 @@ +logging: + level: + root: INFO + com.jambotronGroup.jambotron: DEBUG + org.springframework: WARN + pattern: + console: "%d{yyyy-MM-dd HH:mm:ss} %-5level - %msg%n" + file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" + file: + name: logs/application.log + max-size: 10MB + max-history: 30 diff --git a/build.gradle b/build.gradle index 092dfb4..0be94ee 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,7 @@ plugins { id 'java' id 'org.springframework.boot' version '3.5.0' id 'io.spring.dependency-management' version '1.1.7' + id 'org.flywaydb.flyway' version '10.4.1' } group = 'com.jambotronGroup' @@ -20,6 +21,7 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter' + implementation 'org.projectlombok:lombok:1.18.26' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0' @@ -30,6 +32,64 @@ dependencies { runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5' runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5' // For JSON serialization/deserialization implementation 'org.postgresql:postgresql:42.6.0' + implementation 'org.flywaydb:flyway-core' + implementation("org.flywaydb:flyway-database-postgresql:10.4.1") + + //implementation 'org.springframework.ai:spring-ai-starter-model-zhipuai' + //implementation 'org.springframework.ai:spring-ai-zhipuai-spring-boot-starter' + //implementation platform("org.springframework.ai:spring-ai-bom:1.0.0-SNAPSHOT") + // Replace the following with the starter dependencies of specific modules you wish to use + //implementation 'org.springframework.ai:spring-ai-zhipuai' + //implementation 'org.springframework.boot:spring-boot-starter-webflux' + //implementation("org.springframework.ai:spring-ai-spring-boot-autoconfigure:1.0.0-M6") + // https://mvnrepository.com/artifact/org.springframework.ai/spring-ai-retry + //implementation("org.springframework.ai:spring-ai-retry:1.0.0") + //implementation group: 'org.springframework.ai', name: 'spring-ai-spring-boot-autoconfigure', version: '1.0.0-M6' +} + +apply plugin: 'io.spring.dependency-management' + dependencyManagement { + imports { + mavenBom ("org.springframework.ai:spring-ai-retry:1.0.0") + } + } + +// copyResouces( type:Copy + +//tasks copyResouces( type:Copy){ +// +// def buildDir = "${project.buildDir}" +// +// from "{$buildDir}/jambotron-ui/dist/jambotron-ui/browser" // Source directory +// into "{$buildDir}/build/resources" // Target directory +// include '**/*' +//} + +apply plugin: 'java' + +tasks.register('copyResources', Copy) { + from 'jambotron-ui/dist/jambotron-ui/browser' + into 'src/main/resources/public' +} +processResources.dependsOn(copyResources) +compileJava.dependsOn(copyResources) +//bootRun.dependsOn("flywayMigrate") + +//flyway { +// user='admin' +// password= 'postgrespw' +// url = 'jdbc:postgresql://localhost:5432/jambotronDB' +// driver = 'org.postgresql.Driver' +// baselineOnMigrate = true +// locations = ['filesystem:src/main/resources/db.migration/'] +//} + +sourceSets { + main { + resources { + srcDir 'jambotron-ui/dist/jambotron-ui/browser' + } + } } tasks.named('test') { diff --git a/jambotron-ui/.editorconfig b/jambotron-ui/.editorconfig new file mode 100644 index 0000000..f166060 --- /dev/null +++ b/jambotron-ui/.editorconfig @@ -0,0 +1,17 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single +ij_typescript_use_double_quotes = false + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/jambotron-ui/.gitignore b/jambotron-ui/.gitignore new file mode 100644 index 0000000..cc7b141 --- /dev/null +++ b/jambotron-ui/.gitignore @@ -0,0 +1,42 @@ +# See https://docs.github.com/get-started/getting-started-with-git/ignoring-files for more about ignoring files. + +# Compiled output +/dist +/tmp +/out-tsc +/bazel-out + +# Node +/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# Miscellaneous +/.angular/cache +.sass-cache/ +/connect.lock +/coverage +/libpeerconnection.log +testem.log +/typings + +# System files +.DS_Store +Thumbs.db diff --git a/jambotron-ui/README.md b/jambotron-ui/README.md new file mode 100644 index 0000000..8368063 --- /dev/null +++ b/jambotron-ui/README.md @@ -0,0 +1,59 @@ +# JambotronUi + +This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 20.0.2. + +## Development server + +To start a local development server, run: + +```bash +ng serve +``` + +Once the server is running, open your browser and navigate to `http://localhost:4200/`. The application will automatically reload whenever you modify any of the source files. + +## Code scaffolding + +Angular CLI includes powerful code scaffolding tools. To generate a new component, run: + +```bash +ng generate component component-name +``` + +For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run: + +```bash +ng generate --help +``` + +## Building + +To build the project run: + +```bash +ng build +``` + +This will compile your project and store the build artifacts in the `dist/` directory. By default, the production build optimizes your application for performance and speed. + +## Running unit tests + +To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command: + +```bash +ng test +``` + +## Running end-to-end tests + +For end-to-end (e2e) testing, run: + +```bash +ng e2e +``` + +Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs. + +## Additional Resources + +For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page. diff --git a/jambotron-ui/angular.json b/jambotron-ui/angular.json new file mode 100644 index 0000000..70ac9aa --- /dev/null +++ b/jambotron-ui/angular.json @@ -0,0 +1,110 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "jambotron-ui": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular/build:application", + "options": { + "browser": "src/main.ts", + "polyfills": [ + "zone.js" + ], + "tsConfig": "tsconfig.app.json", + "inlineStyleLanguage": "scss", + "assets": [ + { + "glob": "**/*", + "input": "public" + }, + { + "glob": "**/*", + "input": "src/assets/", + "output": "/assets/" + } + ], + "styles": [ + "@angular/material/prebuilt-themes/azure-blue.css", + "src/styles.scss" + ], + "server": "src/main.server.ts", + "outputMode": "server", + "ssr": { + "entry": "src/server.ts" + } + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kB", + "maximumError": "1MB" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "4kB", + "maximumError": "8kB" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular/build:dev-server", + "configurations": { + "production": { + "buildTarget": "jambotron-ui:build:production" + }, + "development": { + "buildTarget": "jambotron-ui:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular/build:extract-i18n" + }, + "test": { + "builder": "@angular/build:karma", + "options": { + "polyfills": [ + "zone.js", + "zone.js/testing" + ], + "tsConfig": "tsconfig.spec.json", + "inlineStyleLanguage": "scss", + "assets": [ + { + "glob": "**/*", + "input": "public" + } + ], + "styles": [ + "@angular/material/prebuilt-themes/azure-blue.css", + "src/styles.scss" + ] + } + } + } + } + } +} diff --git a/jambotron-ui/package-lock.json b/jambotron-ui/package-lock.json new file mode 100644 index 0000000..4ad1649 --- /dev/null +++ b/jambotron-ui/package-lock.json @@ -0,0 +1,9664 @@ +{ + "name": "jambotron-ui", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "jambotron-ui", + "version": "0.0.0", + "dependencies": { + "@angular/animations": "^20.0.4", + "@angular/cdk": "^20.0.3", + "@angular/common": "^20.0.0", + "@angular/compiler": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/forms": "^20.0.0", + "@angular/material": "^20.0.3", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/router": "^20.0.0", + "@angular/ssr": "^20.0.2", + "@ant-design/icons-angular": "19.0.0", + "@ng-bootstrap/ng-bootstrap": "19.0.0", + "@popperjs/core": "2.11.8", + "@primeng/themes": "^19.1.3", + "bootstrap": "5.3.6", + "express": "^5.1.0", + "ngx-scrollbar": "18.0.0", + "primeng": "^19.1.3", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zone.js": "~0.15.0" + }, + "devDependencies": { + "@angular/build": "^20.0.2", + "@angular/cli": "^20.0.2", + "@angular/compiler-cli": "^20.0.0", + "@types/express": "^5.0.1", + "@types/jasmine": "~5.1.0", + "@types/node": "^20.17.19", + "jasmine-core": "~5.7.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "typescript": "~5.8.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.2000.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2000.3.tgz", + "integrity": "sha512-37S4dzlwB3C8gnBlwxjjvNUqwSeKnDe2j1XWg7sj94kbg/jLJV0Db/Dvb7zJjKher6Ed1Bnj3pMOM206ALJW2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.0.3", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.0.3.tgz", + "integrity": "sha512-XgEIbIky0pMtJSomHRaf16BT1jzJNQCm2geNZ642n3cj8fYLm4jHJX/r738kIfbHWoWXT/hlTmVgIH9TdQPicA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.2", + "source-map": "0.7.4" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.0.3.tgz", + "integrity": "sha512-T679AQXenG6e4fdC/HXrps0Dqy1EYKb4pFNLQqZHR9mfyeq/vxFWs3ga/yMiqvqMPUK5W5FucEpFZJQQmc7M+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.0.3", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "8.2.0", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/animations": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.0.4.tgz", + "integrity": "sha512-s0kRcEply2A1ThvFmb0+o+hEpAbPn08lpK8xjWZryM4cMrwjgsUE0OZHZPBANP4I1xT7Z82l+fmQbH+vX48EyA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/common": "20.0.4", + "@angular/core": "20.0.4" + } + }, + "node_modules/@angular/build": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.0.3.tgz", + "integrity": "sha512-xA5eTGop85SI/+hfiOSJR/xI1w1NK3qylpEZ277YRaw8Ikh7r1DKPJOMGBfXNd8QsZYBSWGHA8SXvCmOh/hvLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.2000.3", + "@babel/core": "7.27.1", + "@babel/helper-annotate-as-pure": "7.27.1", + "@babel/helper-split-export-declaration": "7.24.7", + "@inquirer/confirm": "5.1.10", + "@vitejs/plugin-basic-ssl": "2.0.0", + "beasties": "0.3.4", + "browserslist": "^4.23.0", + "esbuild": "0.25.5", + "https-proxy-agent": "7.0.6", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", + "listr2": "8.3.3", + "magic-string": "0.30.17", + "mrmime": "2.0.1", + "parse5-html-rewriting-stream": "7.1.0", + "picomatch": "4.0.2", + "piscina": "5.0.0", + "rollup": "4.40.2", + "sass": "1.88.0", + "semver": "7.7.2", + "source-map-support": "0.5.21", + "tinyglobby": "0.2.13", + "vite": "6.3.5", + "watchpack": "2.4.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "lmdb": "3.3.0" + }, + "peerDependencies": { + "@angular/compiler": "^20.0.0", + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/localize": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/service-worker": "^20.0.0", + "@angular/ssr": "^20.0.3", + "karma": "^6.4.0", + "less": "^4.2.0", + "ng-packagr": "^20.0.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "tslib": "^2.3.0", + "typescript": ">=5.8 <5.9", + "vitest": "^3.1.1" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + }, + "@angular/localize": { + "optional": true + }, + "@angular/platform-browser": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "karma": { + "optional": true + }, + "less": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@angular/cdk": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.0.3.tgz", + "integrity": "sha512-70KG8GpK4aV9j5hUkpDZJQ6oMgCuaCRY6JX1axPxkNtQaiK6PAmTfQLiGqF2cYhbQneeq3uGvTorAjRfvp8NPQ==", + "license": "MIT", + "dependencies": { + "parse5": "^7.1.2", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^20.0.0 || ^21.0.0", + "@angular/core": "^20.0.0 || ^21.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/cli": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.0.3.tgz", + "integrity": "sha512-tDYcUrxq8Y9wK6EqwJ6Gn+4IF+VpPVikmpuqzqrUtYzqvRTqYtkyhJsAu3Ec6d6941mL2U3ZnMm3sjOxPPNkjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.2000.3", + "@angular-devkit/core": "20.0.3", + "@angular-devkit/schematics": "20.0.3", + "@inquirer/prompts": "7.5.1", + "@listr2/prompt-adapter-inquirer": "2.0.22", + "@schematics/angular": "20.0.3", + "@yarnpkg/lockfile": "1.1.0", + "ini": "5.0.0", + "jsonc-parser": "3.3.1", + "listr2": "8.3.3", + "npm-package-arg": "12.0.2", + "npm-pick-manifest": "10.0.0", + "pacote": "21.0.0", + "resolve": "1.22.10", + "semver": "7.7.2", + "yargs": "17.7.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/common": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.0.4.tgz", + "integrity": "sha512-fWgxe2rgSKgI36ummBYnBN4YUrmp4CHbfEG3RMeJho/vhHKguk2/o6BgL9zvnKybvbWmuaqbkHogi+y0LeJ8Ww==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/core": "20.0.4", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.0.4.tgz", + "integrity": "sha512-1bP3P8Ll/KUYMPiE6TDjkMXkqCDVgSUAUsVCgzAxz4mcMuc9PnlbhQazpWHCkCDIjGFZ5XIAsS49V7tfaTbLDw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@angular/compiler-cli": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.0.4.tgz", + "integrity": "sha512-2FP1WMRexAMcDPNE3YO3zB++sCgND9O/qJC5rgKbAebpbmOrCDMUBRlftkwiLT+UhTM9PjhTtAGtK7C+2iwx1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "7.27.4", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^4.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.2.0", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^18.0.0" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/compiler": "20.0.4", + "typescript": ">=5.8 <5.9" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.4", + "@babel/types": "^7.27.3", + "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/@angular/compiler-cli/node_modules/@babel/core/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/@angular/compiler-cli/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/@angular/compiler-cli/node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@angular/compiler-cli/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@angular/compiler-cli/node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/@angular/compiler-cli/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/@angular/core": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.0.4.tgz", + "integrity": "sha512-JhSl3B6CrJ9kegLffgWVFGF4D4bWLV/9r8R0+h78vU+ppdPFPWDha7WnirF31cPIg3pBzy6wn103Kcy9Ri5M5w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/compiler": "20.0.4", + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.15.0" + }, + "peerDependenciesMeta": { + "@angular/compiler": { + "optional": true + }, + "zone.js": { + "optional": true + } + } + }, + "node_modules/@angular/forms": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.0.4.tgz", + "integrity": "sha512-bFTMgJSHiLr80ELymRykZW6o5QroDlk+g5AFFiY9yxM8I0DV5YpCNBefv8GiuWubE+Lw6LkQ/HMYeXYJMTue3A==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/common": "20.0.4", + "@angular/core": "20.0.4", + "@angular/platform-browser": "20.0.4", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/material": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-20.0.3.tgz", + "integrity": "sha512-kd5Mi6gVxcjDs1nfm8GG2rId59SXWQjkiBMqrYuhy2Trpb+zG0vrLClrpoe3JdWqoX4GJagxGwl3VRDBIoP/cw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/cdk": "20.0.3", + "@angular/common": "^20.0.0 || ^21.0.0", + "@angular/core": "^20.0.0 || ^21.0.0", + "@angular/forms": "^20.0.0 || ^21.0.0", + "@angular/platform-browser": "^20.0.0 || ^21.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.0.4.tgz", + "integrity": "sha512-hMJYvtZlNPh4Tt6JrnK+vmBmHWok04EkuJwyPcPhlle1u6/LihuCj4suELLqCanX9EzyNgvyKnws0i6JE/qh8Q==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/animations": "20.0.4", + "@angular/common": "20.0.4", + "@angular/core": "20.0.4" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-server": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-20.0.4.tgz", + "integrity": "sha512-jCbBPy/KmWw/rW6400My/+2SumnatciWnyWJVy2tKSHU/WDHQdjgk8djMdZODr+2CDORQzdkdBKqf7TuFK6clA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0", + "xhr2": "^0.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/common": "20.0.4", + "@angular/compiler": "20.0.4", + "@angular/core": "20.0.4", + "@angular/platform-browser": "20.0.4", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/router": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.0.4.tgz", + "integrity": "sha512-t02ukwKh+YDZutR09ZYJVLaC+OPyDxu6ll7A2MFK0BNLPpD9oQc0lDwJZSrqfAhlXU0arWUjmwkNvFdh21/Z5Q==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/common": "20.0.4", + "@angular/core": "20.0.4", + "@angular/platform-browser": "20.0.4", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/ssr": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@angular/ssr/-/ssr-20.0.3.tgz", + "integrity": "sha512-AuEO05mdcQU1HBZAJ64eNPEoi4vxgA0zmYjdVK+Z55uwhaAPiyU6Ti/irK7y4IpM5WZ0fTKFzxtgD+GuEqai2w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/router": "^20.0.0" + }, + "peerDependenciesMeta": { + "@angular/platform-server": { + "optional": true + } + } + }, + "node_modules/@ant-design/colors": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.2.1.tgz", + "integrity": "sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^2.0.6" + } + }, + "node_modules/@ant-design/fast-color": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz", + "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@ant-design/icons-angular": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/icons-angular/-/icons-angular-19.0.0.tgz", + "integrity": "sha512-bBWFA1cTZwLAFTgpozkeNIHX1nXyZuiUaRzTcAfFEt85eW1X3ypMcBfS/XEVVVzkdTw5Td+E1vwzgfuUlKiYSA==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": "^19.0.0", + "@angular/core": "^19.0.0", + "@angular/platform-browser": "^19.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", + "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", + "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helpers": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1", + "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/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/@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.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", + "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@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-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "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.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "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.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", + "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.8.tgz", + "integrity": "sha512-d/QAsnwuHX2OPolxvYcgSj7A9DO9H6gVOy2DvBTx+P2LH2iRTo/RSGV3iwCzW024nP9hw98KIuDmdyhZQj1UQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.10.tgz", + "integrity": "sha512-FxbQ9giWxUWKUk2O5XZ6PduVnH2CZ/fmMKMBkH71MHJvWr7WL5AHKevhzF1L5uYWB2P548o1RzVxrNd3dpmk6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.11", + "@inquirer/type": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.1.13", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.13.tgz", + "integrity": "sha512-1viSxebkYN2nJULlzCxES6G9/stgHSepZ9LqqfdIGPHj5OHhiBUXVS0a6R0bEC2A+VL4D9w6QB66ebCr6HGllA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.13.tgz", + "integrity": "sha512-WbicD9SUQt/K8O5Vyk9iC2ojq5RHoCLK6itpp2fHsWe44VxxcA9z3GTWlvjSTGmMQpZr+lbVmrxdHcumJoLbMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7", + "external-editor": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.15.tgz", + "integrity": "sha512-4Y+pbr/U9Qcvf+N/goHzPEXiHH8680lM3Dr3Y9h9FFw4gHS+zVpbj8LfbKWIb/jayIB4aSO4pWiBTrBYWkvi5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.12.tgz", + "integrity": "sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.12.tgz", + "integrity": "sha512-xJ6PFZpDjC+tC1P8ImGprgcsrzQRsUh9aH3IZixm1lAZFK49UGHxM3ltFfuInN2kPYNfyoPRh+tU4ftsjPLKqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.15.tgz", + "integrity": "sha512-xWg+iYfqdhRiM55MvqiTCleHzszpoigUpN5+t1OMcRkJrUrw7va3AzXaxvS+Ak7Gny0j2mFSTv2JJj8sMtbV2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.15.tgz", + "integrity": "sha512-75CT2p43DGEnfGTaqFpbDC2p2EEMrq0S+IRrf9iJvYreMy5mAWj087+mdKyLHapUEPLjN10mNvABpGbk8Wdraw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.5.1.tgz", + "integrity": "sha512-5AOrZPf2/GxZ+SDRZ5WFplCA2TAQgK3OYrXCYmJL5NaTu4ECcoWFlfUZuw7Es++6Njv7iu/8vpYJhuzxUH76Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.1.6", + "@inquirer/confirm": "^5.1.10", + "@inquirer/editor": "^4.2.11", + "@inquirer/expand": "^4.0.13", + "@inquirer/input": "^4.1.10", + "@inquirer/number": "^3.0.13", + "@inquirer/password": "^4.0.13", + "@inquirer/rawlist": "^4.1.1", + "@inquirer/search": "^3.0.13", + "@inquirer/select": "^4.2.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.3.tgz", + "integrity": "sha512-7XrV//6kwYumNDSsvJIPeAqa8+p7GJh7H5kRuxirct2cgOcSWwwNGoXDRgpNFbY/MG2vQ4ccIWCi8+IXXyFMZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.15.tgz", + "integrity": "sha512-YBMwPxYBrADqyvP4nNItpwkBnGGglAvCLVW8u4pRmmvOsHUtCAUIMbUrLX5B3tFL1/WsLGdQ2HNzkqswMs5Uaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.2.3.tgz", + "integrity": "sha512-OAGhXU0Cvh0PhLz9xTF/kx6g6x+sP+PcyTiLvCrewI99P3BBeexD+VbuwkNDvqGkk3y2h5ZiWLeRP7BFlhkUDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz", + "integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/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/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.22.tgz", + "integrity": "sha512-hV36ZoY+xKL6pYOt1nPNnkciFkn89KZwqLhAFzJvYysAvL5uBQdiADZx/8bIDXIukzzwG0QlPYolgMzQUtKgpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/type": "^1.5.5" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 8" + } + }, + "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", + "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.3.0.tgz", + "integrity": "sha512-LipbQobyEfQtu8WixasaFUZZ+JCGlho4OWwWIQ5ol0rB1RKkcZvypu7sS1CBvofBGVAa3vbOh8IOGQMrbmL5dg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.3.0.tgz", + "integrity": "sha512-yA+9P+ZeA3vg76BLXWeUomIAjxfmSmR2eg8fueHXDg5Xe1Xmkl9JCKuHXUhtJ+mMVcH12d5k4kJBLbyXTadfGQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.3.0.tgz", + "integrity": "sha512-EDYrW9kle+8wI19JCj/PhRnGoCN9bked5cdOPdo1wdgH/HzjgoLPFTn9DHlZccgTEVhp3O+bpWXdN/rWySVvjw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.3.0.tgz", + "integrity": "sha512-OeWvSgjXXZ/zmtLqqL78I3910F6UYpUubmsUU+iBHo6nTtjkpXms95rJtGrjkWQqwswKBD7xSMplbYC4LEsiPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.3.0.tgz", + "integrity": "sha512-wDd02mt5ScX4+xd6g78zKBr6ojpgCJCTrllCAabjgap5FzuETqOqaQfKhO+tJuGWv/J5q+GIds6uY7rNFueOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-arm64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.3.0.tgz", + "integrity": "sha512-COotWhHJgzXULLiEjOgWQwqig6PoA+6ji6W+sDl6M1HhMXWIymEVHGs0edsVSNtsNSCAWMxJgR3asv6FNX/2EA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.3.0.tgz", + "integrity": "sha512-kqUgQH+l8HDbkAapx+aoko7Ez4X4DqkIraOqY/k0QY5EN/iialVlFpBUXh4wFXzirdmEVjbIUMrceUh0Kh8LeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@napi-rs/nice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.1.tgz", + "integrity": "sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/nice-android-arm-eabi": "1.0.1", + "@napi-rs/nice-android-arm64": "1.0.1", + "@napi-rs/nice-darwin-arm64": "1.0.1", + "@napi-rs/nice-darwin-x64": "1.0.1", + "@napi-rs/nice-freebsd-x64": "1.0.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.0.1", + "@napi-rs/nice-linux-arm64-gnu": "1.0.1", + "@napi-rs/nice-linux-arm64-musl": "1.0.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.0.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.0.1", + "@napi-rs/nice-linux-s390x-gnu": "1.0.1", + "@napi-rs/nice-linux-x64-gnu": "1.0.1", + "@napi-rs/nice-linux-x64-musl": "1.0.1", + "@napi-rs/nice-win32-arm64-msvc": "1.0.1", + "@napi-rs/nice-win32-ia32-msvc": "1.0.1", + "@napi-rs/nice-win32-x64-msvc": "1.0.1" + } + }, + "node_modules/@napi-rs/nice-android-arm-eabi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.1.tgz", + "integrity": "sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-android-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.1.tgz", + "integrity": "sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.1.tgz", + "integrity": "sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.1.tgz", + "integrity": "sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-freebsd-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.1.tgz", + "integrity": "sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.1.tgz", + "integrity": "sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.1.tgz", + "integrity": "sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-musl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.1.tgz", + "integrity": "sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-ppc64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.1.tgz", + "integrity": "sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-riscv64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.1.tgz", + "integrity": "sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-s390x-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.1.tgz", + "integrity": "sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.1.tgz", + "integrity": "sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-musl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.1.tgz", + "integrity": "sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-arm64-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.1.tgz", + "integrity": "sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-ia32-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.1.tgz", + "integrity": "sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-x64-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.1.tgz", + "integrity": "sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ng-bootstrap/ng-bootstrap": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-19.0.0.tgz", + "integrity": "sha512-Ryd7L3VdT0zQ5+Y9uA5Kze+4FylUQ7FS04DCiFAjU3eCLxrGirhXiwpE2poMSciZi0nqXodKgKKdUSynZEYY+Q==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/forms": "^20.0.0", + "@angular/localize": "^20.0.0", + "@popperjs/core": "^2.11.8", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@npmcli/agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/git": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz", + "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^8.0.0", + "ini": "^5.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^10.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", + "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", + "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.2.0.tgz", + "integrity": "sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^6.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", + "proc-log": "^5.0.0", + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.2.tgz", + "integrity": "sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/redact": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.2.tgz", + "integrity": "sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz", + "integrity": "sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "node-gyp": "^11.0.0", + "proc-log": "^5.0.0", + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@parcel/watcher/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@primeng/themes": { + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@primeng/themes/-/themes-19.1.3.tgz", + "integrity": "sha512-y4VryHHUTPWlmfR56NBANC0QPIxEngTUE/J3pGs4SJquq1n5EE/U16dxa1qW/wXqLF3jn3l/AO/4KZqGj5UuAA==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@primeuix/styled": "^0.3.2" + } + }, + "node_modules/@primeuix/styled": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@primeuix/styled/-/styled-0.3.2.tgz", + "integrity": "sha512-ColZes0+/WKqH4ob2x8DyNYf1NENpe5ZguOvx5yCLxaP8EIMVhLjWLO/3umJiDnQU4XXMLkn2mMHHw+fhTX/mw==", + "license": "MIT", + "dependencies": { + "@primeuix/utils": "^0.3.2" + }, + "engines": { + "node": ">=12.11.0" + } + }, + "node_modules/@primeuix/utils": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@primeuix/utils/-/utils-0.3.2.tgz", + "integrity": "sha512-B+nphqTQeq+i6JuICLdVWnDMjONome2sNz0xI65qIOyeB4EF12CoKRiCsxuZ5uKAkHi/0d1LqlQ9mIWRSdkavw==", + "license": "MIT", + "engines": { + "node": ">=12.11.0" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", + "integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz", + "integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz", + "integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz", + "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz", + "integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz", + "integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz", + "integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz", + "integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz", + "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz", + "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz", + "integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz", + "integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz", + "integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz", + "integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz", + "integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz", + "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz", + "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz", + "integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz", + "integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz", + "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@schematics/angular": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.0.3.tgz", + "integrity": "sha512-oWj5UU1gR12KDxQwOUpxweaaF8PPF7t5ymTa/px/nl4YYWd9s5e1skoDNcGHHl0MPHklJzNLxP7O89BORie5vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.0.3", + "@angular-devkit/schematics": "20.0.3", + "jsonc-parser": "3.3.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sigstore/bundle": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", + "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.4.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz", + "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.3.tgz", + "integrity": "sha512-fk2zjD9117RL9BjqEwF7fwv7Q/P9yGsMV4MUJZ/DocaQJ6+3pKr+syBq1owU5Q5qGw5CUbXzm+4yJ2JVRDQeSA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz", + "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.1.tgz", + "integrity": "sha512-eFFvlcBIoGwVkkwmTi/vEQFSva3xs5Ot3WmBcjgjVdiaoelBLQaQ/ZBfhlG0MnG0cmTYScPpk7eDdGDWUcFUmg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.4.1", + "tuf-js": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.1.tgz", + "integrity": "sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", + "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz", + "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jasmine": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.8.tgz", + "integrity": "sha512-u7/CnvRdh6AaaIzYjCgUuVbREFgulhX05Qtf6ZtW+aOcjCKKVvKgpkPYJBFTZSHtFBYimzU4zP0V2vrEsq9Wcg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.1.tgz", + "integrity": "sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.0.0.tgz", + "integrity": "sha512-gc9Tjg8bUxBVSTzeWT3Njc0Cl3PakHFKdNfABnZWiUgbxqmHDEn7uECv3fHVylxoYgNzAcmU7ZrILz+BwSo3sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "vite": "^6.0.0" + } + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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/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/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/beasties": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.4.tgz", + "integrity": "sha512-NmzN1zN1cvGccXFyZ73335+ASXwBlVWcUPssiUDIlFdfyatHPRRufjCd5w8oPaQPvVnf9ELklaCGb1gi9FBwIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "htmlparser2": "^10.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "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/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "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/bootstrap": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.6.tgz", + "integrity": "sha512-jX0GAcRzvdwISuvArXn3m7KZscWWFAf1MKBcnzaN02qWMb3jpMoUX4/qgeiGzqyIb4ojulRzs89UCUmGcFSzTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT", + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "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/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.25.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", + "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": { + "caniuse-lite": "^1.0.30001718", + "electron-to-chromium": "^1.5.160", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "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==", + "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==", + "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/caniuse-lite": { + "version": "1.0.30001724", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001724.tgz", + "integrity": "sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==", + "dev": true, + "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/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "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/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "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/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/connect/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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/cross-spawn/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/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "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==", + "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/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.171", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.171.tgz", + "integrity": "sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/engine.io": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", + "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz", + "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "punycode": "^1.4.1", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "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==", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" + } + }, + "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-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/exponential-backoff": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "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/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "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/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-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "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==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/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/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "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/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-walk": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz", + "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/immutable": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "dev": true, + "license": "MIT" + }, + "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/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", + "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "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-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-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-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "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-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "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/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jasmine-core": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.7.1.tgz", + "integrity": "sha512-QnurrtpKsPoixxG2R3d1xP0St/2kcX5oTZyDyQJMY+Vzi/HUlu1kGm+2V8Tz+9lV991leB1l0xcsyz40s9xOOw==", + "dev": true, + "license": "MIT" + }, + "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/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true, + "license": "MIT" + }, + "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-parse-even-better-errors": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", + "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "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-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/karma": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", + "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.7.2", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", + "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-coverage": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", + "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/karma-coverage/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma-coverage/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/karma-jasmine": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", + "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "jasmine-core": "^4.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "karma": "^6.0.0" + } + }, + "node_modules/karma-jasmine-html-reporter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", + "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "jasmine-core": "^4.0.0 || ^5.0.0", + "karma": "^6.0.0", + "karma-jasmine": "^5.0.0" + } + }, + "node_modules/karma-jasmine/node_modules/jasmine-core": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz", + "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/karma/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/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/karma/node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/karma/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/karma/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/karma/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/karma/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/karma/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/karma/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/karma/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/karma/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/karma/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/karma/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/karma/node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/karma/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/karma/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/karma/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/karma/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/karma/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/listr2": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", + "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lmdb": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.3.0.tgz", + "integrity": "sha512-MgJocUI6QEiSXQBFWLeyo1R7eQj8Rke5dlPxX0KFwli8/bsCxpM/KbXO5y0qmV/5llQ3wpneDWcTYxa+4vn8iQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "msgpackr": "^1.11.2", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.2.2", + "ordered-binary": "^1.5.3", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "3.3.0", + "@lmdb/lmdb-darwin-x64": "3.3.0", + "@lmdb/lmdb-linux-arm": "3.3.0", + "@lmdb/lmdb-linux-arm64": "3.3.0", + "@lmdb/lmdb-linux-x64": "3.3.0", + "@lmdb/lmdb-win32-arm64": "3.3.0", + "@lmdb/lmdb-win32-x64": "3.3.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "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/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-fetch-happen": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "ssri": "^12.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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", + "optional": true, + "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", + "optional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", + "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/msgpackr": { + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.4.tgz", + "integrity": "sha512-uaff7RG9VIC4jacFW9xzL3jc0iM32DNHe4jYVycBcjUePT/Klnfj7pqtWJt9khvDFizmjN2TlYniYmSS2LIaZg==", + "dev": true, + "license": "MIT", + "optional": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.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==", + "dev": true, + "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/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ngx-scrollbar": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/ngx-scrollbar/-/ngx-scrollbar-18.0.0.tgz", + "integrity": "sha512-+ykmY491x+nzXvnecJvZHvDz0YWuX1r7SYMxNG4RVHXm5Z68P/8kd/3ryLD6DXdNWmJawd4NGvqq2ZkUKb/g3A==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/cdk": ">=19.0.0", + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-gyp": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.2.0.tgz", + "integrity": "sha512-T0S1zqskVUSxcsSTkAsLc7xCycrRYmtDHadDinzocrThjyQCn5kMlEBSj6H4qDbgsIOSLmmlRIeb0lZXj+UArA==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "tar": "^7.4.3", + "tinyglobby": "^0.2.12", + "which": "^5.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/node-gyp/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/node-gyp/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "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/npm-bundled": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", + "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-install-checks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.1.tgz", + "integrity": "sha512-u6DCwbow5ynAX5BdiHQ9qvexme4U3qHW3MWe5NqH+NeBm0LbiH6zvGjNNew1fY+AZZUtVHbOPF3j7mJxbUzpXg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", + "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-packlist": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.0.tgz", + "integrity": "sha512-rht9U6nS8WOBDc53eipZNPo5qkAV4X2rhKE2Oj1DYUQ3DieXfj0mKkVmjnf3iuNdtMd8WfLdi2L6ASkD/8a+Kg==", + "dev": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^7.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", + "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^7.1.0", + "npm-normalize-package-bin": "^4.0.0", + "npm-package-arg": "^12.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", + "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^3.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^14.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^12.0.0", + "proc-log": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.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/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-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ordered-binary": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", + "integrity": "sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-map": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pacote": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.0.tgz", + "integrity": "sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^6.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "@npmcli/run-script": "^9.0.0", + "cacache": "^19.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^12.0.0", + "npm-packlist": "^10.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^3.0.0", + "ssri": "^12.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.1.0.tgz", + "integrity": "sha512-2ifK6Jb+ONoqOy5f+cYHsqvx1obHQdvIk13Jmt/5ezxP0U9p+fqd+R6O73KblGswyuzBYfetmsfK9ThMgnuPPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream/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/parse5-sax-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^7.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==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/piscina": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.0.0.tgz", + "integrity": "sha512-R+arufwL7sZvGjAhSMK3TfH55YdGOqhpKXkcwQJr432AAnJX/xxX19PA4QisrmJ+BTTfZVggaz6HexbkQq1l1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.x" + }, + "optionalDependencies": { + "@napi-rs/nice": "^1.0.1" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "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-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true, + "license": "MIT" + }, + "node_modules/primeng": { + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/primeng/-/primeng-19.1.3.tgz", + "integrity": "sha512-KsrvJFblKg28kA6d4npnnABjKClmJv0CgDT/kOxFq5onQNBy4547DJzRGMba4+CMLKjHWWkYWuC+XSkPMNFrZg==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@primeuix/styled": "^0.3.2", + "@primeuix/utils": "^0.3.2", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/animations": "^19.0.0", + "@angular/cdk": "^19.0.0", + "@angular/common": "^19.0.0", + "@angular/core": "^19.0.0", + "@angular/forms": "^19.0.0", + "@angular/platform-browser": "^19.0.0", + "@angular/router": "^19.0.0", + "rxjs": "^6.0.0 || ^7.8.1" + } + }, + "node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "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/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", + "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.40.2", + "@rollup/rollup-android-arm64": "4.40.2", + "@rollup/rollup-darwin-arm64": "4.40.2", + "@rollup/rollup-darwin-x64": "4.40.2", + "@rollup/rollup-freebsd-arm64": "4.40.2", + "@rollup/rollup-freebsd-x64": "4.40.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", + "@rollup/rollup-linux-arm-musleabihf": "4.40.2", + "@rollup/rollup-linux-arm64-gnu": "4.40.2", + "@rollup/rollup-linux-arm64-musl": "4.40.2", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-musl": "4.40.2", + "@rollup/rollup-linux-s390x-gnu": "4.40.2", + "@rollup/rollup-linux-x64-gnu": "4.40.2", + "@rollup/rollup-linux-x64-musl": "4.40.2", + "@rollup/rollup-win32-arm64-msvc": "4.40.2", + "@rollup/rollup-win32-ia32-msvc": "4.40.2", + "@rollup/rollup-win32-x64-msvc": "4.40.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/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/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.88.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.88.0.tgz", + "integrity": "sha512-sF6TWQqjFvr4JILXzG4ucGOLELkESHL+I5QJhh7CNaE+Yge0SI+ehCatsXhJ7ymU1hAFcIS3/PBpjdIbXoyVbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "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==", + "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==", + "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==", + "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==", + "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/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sigstore": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", + "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socks": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.5.tgz", + "integrity": "sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "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": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/ssri": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "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/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "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/tuf-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.0.1.tgz", + "integrity": "sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "3.0.1", + "debug": "^4.3.6", + "make-fetch-happen": "^14.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.40", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.40.tgz", + "integrity": "sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unique-filename": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/unique-slug": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "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/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.1.tgz", + "integrity": "sha512-OaI//3H0J7ZkR1OqlhGA8cA+Cbk/2xFOQpJOt5+s27/ta9eZwpeervh4Mxh4w0im/kdgktowaqVNR7QOrUd7Yg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "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/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/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/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "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/xhr2": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", + "integrity": "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "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/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zone.js": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", + "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==", + "license": "MIT" + } + } +} diff --git a/jambotron-ui/package.json b/jambotron-ui/package.json new file mode 100644 index 0000000..27242fb --- /dev/null +++ b/jambotron-ui/package.json @@ -0,0 +1,52 @@ +{ + "name": "jambotron-ui", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "watch": "ng build --watch --configuration development", + "test": "ng test", + "serve:ssr:jambotron-ui": "node dist/jambotron-ui/server/server.mjs" + }, + "private": true, + "dependencies": { + "@angular/animations": "^20.0.4", + "@angular/cdk": "^20.0.3", + "@angular/common": "^20.0.0", + "@angular/compiler": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/forms": "^20.0.0", + "@angular/material": "^20.0.3", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/router": "^20.0.0", + "@angular/ssr": "^20.0.2", + "@ant-design/icons-angular": "19.0.0", + "@ng-bootstrap/ng-bootstrap": "19.0.0", + "@popperjs/core": "2.11.8", + "@primeng/themes": "^19.1.3", + "bootstrap": "5.3.6", + "express": "^5.1.0", + "ngx-scrollbar": "18.0.0", + "primeng": "^19.1.3", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zone.js": "~0.15.0" + }, + "devDependencies": { + "@angular/build": "^20.0.2", + "@angular/cli": "^20.0.2", + "@angular/compiler-cli": "^20.0.0", + "@types/express": "^5.0.1", + "@types/jasmine": "~5.1.0", + "@types/node": "^20.17.19", + "jasmine-core": "~5.7.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "typescript": "~5.8.2" + } +} diff --git a/jambotron-ui/public/Firefly_jambo tron 118290.png b/jambotron-ui/public/Firefly_jambo tron 118290.png new file mode 100644 index 0000000..517cb17 Binary files /dev/null and b/jambotron-ui/public/Firefly_jambo tron 118290.png differ diff --git a/jambotron-ui/public/Firefly_jambo-tron-118290.ico b/jambotron-ui/public/Firefly_jambo-tron-118290.ico new file mode 100644 index 0000000..7a97d40 Binary files /dev/null and b/jambotron-ui/public/Firefly_jambo-tron-118290.ico differ diff --git a/jambotron-ui/public/favicon.ico b/jambotron-ui/public/favicon.ico new file mode 100644 index 0000000..57614f9 Binary files /dev/null and b/jambotron-ui/public/favicon.ico differ diff --git a/jambotron-ui/src/app/_shared/event-bus.service.spec.ts b/jambotron-ui/src/app/_shared/event-bus.service.spec.ts new file mode 100644 index 0000000..574fc89 --- /dev/null +++ b/jambotron-ui/src/app/_shared/event-bus.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { EventBusService } from './event-bus.service'; + +describe('EventBusService', () => { + let service: EventBusService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(EventBusService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/_shared/event-bus.service.ts b/jambotron-ui/src/app/_shared/event-bus.service.ts new file mode 100644 index 0000000..f95b6f6 --- /dev/null +++ b/jambotron-ui/src/app/_shared/event-bus.service.ts @@ -0,0 +1,21 @@ +import { Injectable } from '@angular/core'; +import { Subject, Subscription } from 'rxjs'; +import { filter, map } from 'rxjs/operators'; +import { EventData } from './event.class'; + +@Injectable({ + providedIn: 'root', +}) +export class EventBusService { + private subject$ = new Subject(); + + emit(event: EventData) { + this.subject$.next(event); + } + + on(eventName: string, action: any): Subscription { + return this.subject$.pipe( + filter((e: EventData) => e.name === eventName), + map((e: EventData) => e["value"])).subscribe(action); + } +} diff --git a/jambotron-ui/src/app/_shared/event.class.ts b/jambotron-ui/src/app/_shared/event.class.ts new file mode 100644 index 0000000..488e84c --- /dev/null +++ b/jambotron-ui/src/app/_shared/event.class.ts @@ -0,0 +1,9 @@ +export class EventData { + name: string; + value: any; + + constructor(name: string, value: any) { + this.name = name; + this.value = value; + } +} \ No newline at end of file diff --git a/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.html b/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.html new file mode 100644 index 0000000..4c5a4ff --- /dev/null +++ b/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.html @@ -0,0 +1,38 @@ +

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+

admin-welcome.component works!

+ + + + + diff --git a/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.scss b/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.spec.ts b/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.spec.ts new file mode 100644 index 0000000..664e04c --- /dev/null +++ b/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AdminWelcomeComponent } from './admin-welcome.component'; + +describe('AdminWelcomeComponent', () => { + let component: AdminWelcomeComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AdminWelcomeComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(AdminWelcomeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.ts b/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.ts new file mode 100644 index 0000000..ba7feb2 --- /dev/null +++ b/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-admin-welcome.component', + imports: [], + templateUrl: './admin-welcome.component.html', + styleUrl: './admin-welcome.component.scss' +}) +export class AdminWelcomeComponent { + +} diff --git a/jambotron-ui/src/app/admin-module/admin.component/admin.component.html b/jambotron-ui/src/app/admin-module/admin.component/admin.component.html new file mode 100644 index 0000000..3876019 --- /dev/null +++ b/jambotron-ui/src/app/admin-module/admin.component/admin.component.html @@ -0,0 +1,50 @@ + + + + +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+ + + + + + + + + + diff --git a/jambotron-ui/src/app/admin-module/admin.component/admin.component.scss b/jambotron-ui/src/app/admin-module/admin.component/admin.component.scss new file mode 100644 index 0000000..3cde704 --- /dev/null +++ b/jambotron-ui/src/app/admin-module/admin.component/admin.component.scss @@ -0,0 +1,22 @@ +.example-container { + width: 500px; + height: 300px; + border: 1px solid rgba(0, 0, 0, 0.5); +} + +.example-sidenav-content { + display: flex; + height: 100%; + align-items: center; + justify-content: center; +} + +.example-sidenav { + padding: 20px; +} + +.pc-sidebar{ + top: 120px; +} + + diff --git a/jambotron-ui/src/app/admin-module/admin.component/admin.component.spec.ts b/jambotron-ui/src/app/admin-module/admin.component/admin.component.spec.ts new file mode 100644 index 0000000..617b55b --- /dev/null +++ b/jambotron-ui/src/app/admin-module/admin.component/admin.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AdminComponent } from './admin.component'; + +describe('AdminComponent', () => { + let component: AdminComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AdminComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(AdminComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/admin-module/admin.component/admin.component.ts b/jambotron-ui/src/app/admin-module/admin.component/admin.component.ts new file mode 100644 index 0000000..c7496dc --- /dev/null +++ b/jambotron-ui/src/app/admin-module/admin.component/admin.component.ts @@ -0,0 +1,112 @@ +import {Component, CUSTOM_ELEMENTS_SCHEMA, inject, OnInit} from '@angular/core'; +import {BreadcrumbComponent} from "../../components/breadcrumb/breadcrumb.component"; +import {NavBarComponent} from "../../layouts/admin-layout/nav-bar/nav-bar.component"; +import {NavigationComponent} from "../../layouts/admin-layout/navigation/navigation.component"; +import {Router, RouterLink, RouterOutlet} from "@angular/router"; +import {DOCUMENT, NgClass, NgStyle} from '@angular/common'; +import {MatDrawerContainer, MatSidenavModule} from '@angular/material/sidenav'; +import {MatButton} from '@angular/material/button'; +import { ScrollPanelModule } from 'primeng/scrollpanel'; +import {MenuItem} from 'primeng/api'; +import {PanelMenu} from 'primeng/panelmenu'; +@Component({ + selector: 'app-admin.component', + imports: [ + BreadcrumbComponent, + NavBarComponent, + NavigationComponent, + RouterOutlet, + NgClass, + MatDrawerContainer, + MatSidenavModule, + ScrollPanelModule, + MatButton, + RouterLink, + PanelMenu, + NgStyle, + + ], + schemas:[CUSTOM_ELEMENTS_SCHEMA], + templateUrl: './admin.component.html', + styleUrl: './admin.component.scss' +}) +export class AdminComponent implements OnInit { + private document = inject(DOCUMENT); + height = 0; + + items: MenuItem[] | undefined; + + + constructor(private router: Router) { + this.height = 0 + + + } + + // public props + navCollapsed: boolean = false; + navCollapsedMob: boolean = false; + + // public method + navMobClick() { + if (this.navCollapsedMob && !document.querySelector('app-navigation.pc-sidebar')?.classList.contains('mob-open')) { + this.navCollapsedMob = !this.navCollapsedMob; + setTimeout(() => { + this.navCollapsedMob = !this.navCollapsedMob; + }, 100); + } else { + this.navCollapsedMob = !this.navCollapsedMob; + } + if (document.querySelector('app-navigation.pc-sidebar')?.classList.contains('navbar-collapsed')) { + document.querySelector('app-navigation.pc-sidebar')?.classList.remove('navbar-collapsed'); + } + } + + handleKeyDown(event: KeyboardEvent): void { + if (event.key === 'Escape') { + this.closeMenu(); + } + } + + closeMenu() { + if (document.querySelector('app-navigation.pc-sidebar')?.classList.contains('mob-open')) { + document.querySelector('app-navigation.pc-sidebar')?.classList.remove('mob-open'); + } + } + + ngOnInit() { + + if(this.document.defaultView !== null || this.document.defaultView !== undefined) { + // @ts-ignore + this.height = this.document.defaultView.innerHeight; + } + else + this.height = 0; + + this.items = [ + { + label: 'Admin', + icon: 'pi pi-palette', + command: () => { + this.router.navigate(['/main/admin/welcome']); + }, + items: [ + { + label: 'Settings', + icon: 'pi pi-eraser', + // route: '/main/admin/settings' + command: () => { + this.router.navigate(['/main/admin/settings']); + } + }, + { + label: 'System', + icon: 'pi pi-heart', + route: '/main/admin/system' + } + ] + } + ]; + } + +} diff --git a/jambotron-ui/src/app/admin-module/admin.module.ts b/jambotron-ui/src/app/admin-module/admin.module.ts new file mode 100644 index 0000000..105676b --- /dev/null +++ b/jambotron-ui/src/app/admin-module/admin.module.ts @@ -0,0 +1,16 @@ +import {CUSTOM_ELEMENTS_SCHEMA, NgModule} from '@angular/core'; +import {mainRouting} from '../main-module/main.routing'; +import {MainComponent} from '../main-module/main.component/main.component'; +import {RouterModule} from '@angular/router'; +import {AdminComponent} from './admin.component/admin.component'; +import {adminRouting} from './admin.routing'; +import { ScrollPanelModule } from 'primeng/scrollpanel'; +@NgModule({ + declarations: [ + + ], + imports: [adminRouting, AdminComponent,ScrollPanelModule], + exports: [RouterModule], + schemas:[CUSTOM_ELEMENTS_SCHEMA] +}) +export class AdminModule {} diff --git a/jambotron-ui/src/app/admin-module/admin.routing.ts b/jambotron-ui/src/app/admin-module/admin.routing.ts new file mode 100644 index 0000000..246ca73 --- /dev/null +++ b/jambotron-ui/src/app/admin-module/admin.routing.ts @@ -0,0 +1,27 @@ +import {RouterModule, Routes} from '@angular/router'; +import {AdminComponent} from './admin.component/admin.component'; + +const ADMIN_ROUTES: Routes = [ + { + path: '', + component: AdminComponent, + + children: [ + { + path: 'welcome', + loadComponent: () => import('../admin-module/admin-welcome.component/admin-welcome.component').then((c) => c.AdminWelcomeComponent), + }, + { + path: 'settings', + loadComponent: () => import('../admin-module/settings.component/settings.component').then((c) => c.SettingsComponent) + }, + { + path: 'system', + + loadComponent: () => import('../admin-module/system.component/system.component').then((c) => c.SystemComponent) + } + ] + } +]; + +export const adminRouting = RouterModule.forChild(ADMIN_ROUTES); diff --git a/jambotron-ui/src/app/admin-module/settings.component/settings.component.html b/jambotron-ui/src/app/admin-module/settings.component/settings.component.html new file mode 100644 index 0000000..59229f5 --- /dev/null +++ b/jambotron-ui/src/app/admin-module/settings.component/settings.component.html @@ -0,0 +1 @@ +

settings.component works!

diff --git a/jambotron-ui/src/app/admin-module/settings.component/settings.component.scss b/jambotron-ui/src/app/admin-module/settings.component/settings.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/admin-module/settings.component/settings.component.spec.ts b/jambotron-ui/src/app/admin-module/settings.component/settings.component.spec.ts new file mode 100644 index 0000000..82c748a --- /dev/null +++ b/jambotron-ui/src/app/admin-module/settings.component/settings.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SettingsComponent } from './settings.component'; + +describe('SettingsComponent', () => { + let component: SettingsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SettingsComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SettingsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/admin-module/settings.component/settings.component.ts b/jambotron-ui/src/app/admin-module/settings.component/settings.component.ts new file mode 100644 index 0000000..b7ce784 --- /dev/null +++ b/jambotron-ui/src/app/admin-module/settings.component/settings.component.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-settings.component', + imports: [], + templateUrl: './settings.component.html', + styleUrl: './settings.component.scss' +}) +export class SettingsComponent { + +} diff --git a/jambotron-ui/src/app/admin-module/system.component/system.component.html b/jambotron-ui/src/app/admin-module/system.component/system.component.html new file mode 100644 index 0000000..ca07ac5 --- /dev/null +++ b/jambotron-ui/src/app/admin-module/system.component/system.component.html @@ -0,0 +1,107 @@ + + + + + + + Content 1 + + @for (column of displayedColumns; track column) { + + + + + } + + + + + + + + + + + + + + +
{{column}}{{element[column]}}  + + +
+
+ + + Name: {{element.name}} + Type: {{element.type}} + +
+
+
+ +
+ + Content 2 + + @for (column of displayedColumns; track column) { + + + + + } + + + + + + + + + + + + + + +
{{column}}{{element[column]}}  + + +
+
+ + + Name: {{element.name}} + Type: {{element.type}} + +
+
+
+
+
+
+
diff --git a/jambotron-ui/src/app/admin-module/system.component/system.component.scss b/jambotron-ui/src/app/admin-module/system.component/system.component.scss new file mode 100644 index 0000000..9fd7d7d --- /dev/null +++ b/jambotron-ui/src/app/admin-module/system.component/system.component.scss @@ -0,0 +1,113 @@ +mat-card{ + //margin: 20px; + background-color: rgba(240, 248, 255, 0.7); + backdrop-filter: blur(8px); +} + +mat-card-title{ + color: cyan; +} + +mat-card-subtitle{ + color: #009dff; +} + +mat-tab{ + color:black; +} + + +table { + width: 100%; + margin-top: 20px; + color:lightgrey; +} + + +mat-list{ + //background-color: #1389d3; + color:black; + width: 100%; +} + +mat-list-item{ + margin: 10px 10px 10px 10px; + background-color: #447694; + + color: #009dff; +} + +tr.example-detail-row { + height: 0; + background: #fffdfd; +} + +tr.example-element-row { + cursor: pointer; + color: #1389d3; + background: #fffdfd; +} + +tr.example-element-row:not(.example-expanded-row):hover { + background: whitesmoke; +} + +tr.example-element-row:not(.example-expanded-row):active { + background: #efefef; +} + +.example-element-row td { + border-bottom-width: 0; +} + +.example-element-detail-wrapper { + overflow: hidden; + display: grid; + grid-template-rows: 0fr; + grid-template-columns: 100%; + transition: grid-template-rows 225ms cubic-bezier(0.4, 0, 0.2, 1); +} + +.example-element-detail-wrapper-expanded { + grid-template-rows: 1fr; + +} + +.example-element-detail { + display: flex; + min-height: 0; +} + +.example-element-diagram { + min-width: 80px; + border: 2px solid black; + padding: 8px; + font-weight: lighter; + margin: 8px 0; + height: 104px; +} + +.example-element-symbol { + font-weight: bold; + font-size: 40px; + line-height: normal; +} + +.example-element-description { + padding: 16px; +} + +.example-element-description-attribution { + opacity: 0.5; +} + +.example-toggle-button { + transition: transform 225ms cubic-bezier(0.4, 0, 0.2, 1); +} + +.example-toggle-button-expanded { + transform: rotate(180deg); +} + + + diff --git a/jambotron-ui/src/app/admin-module/system.component/system.component.spec.ts b/jambotron-ui/src/app/admin-module/system.component/system.component.spec.ts new file mode 100644 index 0000000..bae84c7 --- /dev/null +++ b/jambotron-ui/src/app/admin-module/system.component/system.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SystemComponent } from './system.component'; + +describe('SystemComponent', () => { + let component: SystemComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SystemComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SystemComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/admin-module/system.component/system.component.ts b/jambotron-ui/src/app/admin-module/system.component/system.component.ts new file mode 100644 index 0000000..115c92d --- /dev/null +++ b/jambotron-ui/src/app/admin-module/system.component/system.component.ts @@ -0,0 +1,138 @@ +import {Component, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {MatCard, MatCardContent, MatCardHeader} from '@angular/material/card'; +import {MatDivider} from '@angular/material/divider'; +import {MatTab, MatTabGroup} from '@angular/material/tabs'; +import { + MatCell, + MatCellDef, + MatColumnDef, + MatHeaderCell, MatHeaderCellDef, + MatHeaderRow, MatHeaderRowDef, + MatRow, + MatRowDef, + MatTable +} from '@angular/material/table'; +import {MatList, MatListItem} from '@angular/material/list'; +import {MatIconButton} from '@angular/material/button'; +import {SystemService} from '../../services/system.service'; +import {Bean} from '../../models/Bean'; +import {MatIcon} from '@angular/material/icon'; + +@Component({ + selector: 'app-system.component', + imports: [ + MatCard, + MatCardHeader, + MatCardContent, + MatDivider, + MatTabGroup, + MatTab, + MatTable, + MatColumnDef, + MatIcon, + MatCell, + MatCellDef, + MatList, + MatListItem, + MatRow, + MatHeaderRow, + MatRowDef, + MatHeaderCell, + MatHeaderCellDef, + MatIconButton, + MatIcon, + MatHeaderRowDef + ], + templateUrl: './system.component.html', + styleUrl: './system.component.scss', + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class SystemComponent { + customBeans:Bean[] = [] ; + allBeans:Bean[] = [] ; + displayedColumns: string[] = ['shortName', 'typeShortName', 'scope']; + + columnsToDisplayWithExpand = [...this.displayedColumns, 'expand']; + + expandedElement: Bean | null = null; + + resultsLength = 0; + isLoadingResults = true; + isRateLimitReached = false; + +constructor(private systemService: SystemService) { } + +ngOnInit(): void { + this.retrieveBeans(); +} + +retrieveBeans(): void { + this.systemService.getCustomBeans() + .subscribe( + (data: Bean[]) => { + this.customBeans = data; + console.log(data); + }, + (error: any) => { + console.log(error); + }); + this.systemService.getAllBeans() + .subscribe( + (data: Bean[]) => { + this.allBeans = data; + console.log(data); + }, + (error: any) => { + console.log(error); + }); +} + +/** Checks whether an element is expanded. */ +isExpanded(element: Bean) { + return this.expandedElement === element; +} + +/** Toggles the expanded state of an element. */ +toggle(element: Bean) { + this.expandedElement = this.isExpanded(element) ? null : element; +} + + + +//ngAfterViewInit() { + //this.exampleDatabase = new ExampleHttpDatabase(this._httpClient); + + // If the user changes the sort order, reset back to the first page. + /* this.sort.sortChange.subscribe(() => (this.paginator.pageIndex = 0)); + + merge(this.sort.sortChange, this.paginator.page) + .pipe( + startWith({}), + switchMap(() => { + this.isLoadingResults = true; + return this.exampleDatabase!.getRepoIssues( + this.sort.active, + this.sort.direction, + this.paginator.pageIndex, + ).pipe(catchError(() => observableOf(null))); + }), + map(data => { + // Flip flag to show that loading has finished. + this.isLoadingResults = false; + this.isRateLimitReached = data === null; + + if (data === null) { + return []; + } + + // Only refresh the result length if there is new data. In case of rate + // limit errors, we do not want to reset the paginator to zero, as that + // would prevent users from re-triggering requests. + this.resultsLength = data.total_count; + return data.items; + }), + ) + .subscribe(data => (this.data = data));*/ +} + + diff --git a/jambotron-ui/src/app/app.component.html b/jambotron-ui/src/app/app.component.html new file mode 100644 index 0000000..85204c4 --- /dev/null +++ b/jambotron-ui/src/app/app.component.html @@ -0,0 +1,55 @@ + + + + + + + + @if (showAdminBoard) { + + } + + @if (showAdminBoard) { + + } + + + + + + + + + + + + + +
+ +
+ diff --git a/jambotron-ui/src/app/app.component.scss b/jambotron-ui/src/app/app.component.scss new file mode 100644 index 0000000..fee240c --- /dev/null +++ b/jambotron-ui/src/app/app.component.scss @@ -0,0 +1,23 @@ +//#header_panel{ +// background-color: #181d1f; +//} +.example-spacer { + flex: 1 1 auto; +} + +mat-toolbar{ + background-color: rgba(153,153,153,0.16); + backdrop-filter: blur(8px); +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1000; // Ensure toolbar stays above other content +} +.router_outlet_padding{ + padding-top: 60px; + scroll-padding-inline: 40%; +} diff --git a/jambotron-ui/src/app/app.component.spec.ts b/jambotron-ui/src/app/app.component.spec.ts new file mode 100644 index 0000000..98d898f --- /dev/null +++ b/jambotron-ui/src/app/app.component.spec.ts @@ -0,0 +1,35 @@ +import { TestBed } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + RouterTestingModule + ], + declarations: [ + AppComponent + ], + }).compileComponents(); + }); + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); + + // it(`should have as title 'spring-angular-ui'`, () => { + // const fixture = TestBed.createComponent(AppComponent); + // const app = fixture.componentInstance; + // expect(app.title).toEqual('spring-angular-ui'); + // }); + + it('should render title', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.nativeElement; + expect(compiled.querySelector('.content span').textContent).toContain('spring-angular-ui app is running!'); + }); +}); diff --git a/jambotron-ui/src/app/app.component.ts b/jambotron-ui/src/app/app.component.ts new file mode 100644 index 0000000..b51a698 --- /dev/null +++ b/jambotron-ui/src/app/app.component.ts @@ -0,0 +1,124 @@ +import {Component, CUSTOM_ELEMENTS_SCHEMA, inject, OnInit} from '@angular/core'; +import { TokenStorageService } from './services/token-storage.service'; +import {MatDialog} from "@angular/material/dialog"; +import {DialogComponent} from "./components/dialog/dialog.component"; +import {AuthService} from "./services/auth.service"; +import {Subscription} from "rxjs"; +import {EventBusService} from "./_shared/event-bus.service"; +import {RouterLink, RouterOutlet} from '@angular/router'; +import {MatButton} from '@angular/material/button'; +import {MatToolbar} from '@angular/material/toolbar'; +import {MatIcon} from '@angular/material/icon'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [ + RouterOutlet, + MatIcon, + MatButton, + RouterLink, + MatToolbar + ], + styleUrls: ['./app.component.scss'] +}) +export class AppComponent implements OnInit { + readonly dialog = inject(MatDialog); + //private authService = new AuthService(provideHttpClient()) + public dialogData : DialogData = {password: "", username: ""}; + + private roles: string[] = []; + isLoggedIn = false; + showAdminBoard = false; + showModeratorBoard = false; + username?: string; + + eventBusSub?: Subscription; + private errorMessage: any; + private isLoginFailed: boolean = false; + + constructor( + private storageService: TokenStorageService, + private authService: AuthService, + private eventBusService: EventBusService + ) {} + + ngOnInit(): void { + this.isLoggedIn = this.storageService.isLoggedIn(); + + if (this.isLoggedIn) { + const user = this.storageService.getUser(); + this.roles = user.roles; + + this.showAdminBoard = true;//this.roles.includes('ROLE_ADMIN'); + this.showModeratorBoard = this.roles.includes('ROLE_MODERATOR'); + + this.username = user.username; + } + + this.eventBusSub = this.eventBusService.on('logout', () => { + this.logout(); + }); + } + + logout(): void { + this.authService.logout().subscribe({ + next: res => { + console.log(res); + this.storageService.clean(); + + window.location.reload(); + }, + error: err => { + console.log(err); + } + }); + } + + openDialog(enterAnimationDuration: string, exitAnimationDuration: string) { + + let dialogRef = this.dialog.open(DialogComponent, { + width: '350px', + enterAnimationDuration, + exitAnimationDuration, + data: {username: this.dialogData.username, password: this.dialogData.password} + }); + + dialogRef.afterClosed().subscribe(result => { + console.log('The dialog was closed'); + if(result== null){ + return; + } + this.dialogData = result; + + this.authService.login(this.dialogData.username, this.dialogData.password).subscribe( + data => { + this.storageService.saveToken(data.accessToken); + this.storageService.saveUser(data); + + this.isLoginFailed = false; + this.isLoggedIn = true; + let user = this.storageService.getUser(); + this.roles = user.roles; + //this.username = user.username; + this.reloadPage(); + }, + err => { + this.errorMessage = err.error.message; + this.isLoginFailed = true; + } + ); + }); + + } + reloadPage(): void { + window.location.reload(); + } + +} +export interface DialogData { + username: string; + password: string; +} + diff --git a/jambotron-ui/src/app/app.config.server.ts b/jambotron-ui/src/app/app.config.server.ts new file mode 100644 index 0000000..41031f1 --- /dev/null +++ b/jambotron-ui/src/app/app.config.server.ts @@ -0,0 +1,12 @@ +import { mergeApplicationConfig, ApplicationConfig } from '@angular/core'; +import { provideServerRendering, withRoutes } from '@angular/ssr'; +import { appConfig } from './app.config'; +import { serverRoutes } from './app.routes.server'; + +const serverConfig: ApplicationConfig = { + providers: [ + provideServerRendering(withRoutes(serverRoutes)) + ] +}; + +export const config = mergeApplicationConfig(appConfig, serverConfig); diff --git a/jambotron-ui/src/app/app.config.ts b/jambotron-ui/src/app/app.config.ts new file mode 100644 index 0000000..c1108fe --- /dev/null +++ b/jambotron-ui/src/app/app.config.ts @@ -0,0 +1,28 @@ +import { + ApplicationConfig, + importProvidersFrom, + provideBrowserGlobalErrorListeners, + provideZoneChangeDetection +} from '@angular/core'; +import { provideRouter } from '@angular/router'; + +import { routes } from './app.routes'; +import { provideClientHydration, withEventReplay } from '@angular/platform-browser'; +import {AppModule} from './app.module'; +import {providePrimeNG} from 'primeng/config'; +import Aura from '@primeng/themes/aura'; + +export const appConfig: ApplicationConfig = { + providers: [ + provideBrowserGlobalErrorListeners(), + provideZoneChangeDetection({ eventCoalescing: true }), + provideRouter(routes), provideClientHydration(withEventReplay()), + + importProvidersFrom(AppModule), + providePrimeNG({ + theme: { + preset: Aura + } + }) + ] +}; diff --git a/jambotron-ui/src/app/app.html b/jambotron-ui/src/app/app.html new file mode 100644 index 0000000..0680b43 --- /dev/null +++ b/jambotron-ui/src/app/app.html @@ -0,0 +1 @@ + diff --git a/jambotron-ui/src/app/app.module.ts b/jambotron-ui/src/app/app.module.ts new file mode 100644 index 0000000..421f0dd --- /dev/null +++ b/jambotron-ui/src/app/app.module.ts @@ -0,0 +1,40 @@ +import {CUSTOM_ELEMENTS_SCHEMA, NgModule} from '@angular/core'; +import { BrowserModule } + from '@angular/platform-browser'; + +import { BrowserAnimationsModule } + from '@angular/platform-browser/animations'; +import { MatIconModule } from '@angular/material/icon'; +import {provideHttpClient, withInterceptorsFromDi} from '@angular/common/http'; + +import {MainComponent} from './main-module/main.component/main.component'; +import {authInterceptorProviders} from './helpers/auth.interceptor'; +import {AdminComponent} from './admin-module/admin.component/admin.component'; +import {AdminWelcomeComponent} from './admin-module/admin-welcome.component/admin-welcome.component'; +import {SettingsComponent} from './admin-module/settings.component/settings.component'; +import {SystemComponent} from './admin-module/system.component/system.component'; +import {appRouting} from './app.routes'; +import {App} from './app'; + +@NgModule({ + declarations: [ + + ], + imports: [ + appRouting, + MainComponent, + BrowserModule, + MatIconModule, + BrowserAnimationsModule, + AdminComponent, + AdminWelcomeComponent, + SettingsComponent, + SystemComponent + ], + providers: [ + authInterceptorProviders,provideHttpClient(withInterceptorsFromDi())], + + bootstrap: [], + schemas: [ CUSTOM_ELEMENTS_SCHEMA ] +}) +export class AppModule { } diff --git a/jambotron-ui/src/app/app.routes.server.ts b/jambotron-ui/src/app/app.routes.server.ts new file mode 100644 index 0000000..ffd37b1 --- /dev/null +++ b/jambotron-ui/src/app/app.routes.server.ts @@ -0,0 +1,8 @@ +import { RenderMode, ServerRoute } from '@angular/ssr'; + +export const serverRoutes: ServerRoute[] = [ + { + path: '**', + renderMode: RenderMode.Prerender + } +]; diff --git a/jambotron-ui/src/app/app.routes.ts b/jambotron-ui/src/app/app.routes.ts new file mode 100644 index 0000000..e97767a --- /dev/null +++ b/jambotron-ui/src/app/app.routes.ts @@ -0,0 +1,20 @@ +import {RouterModule, Routes} from '@angular/router'; +import {AdminComponent} from './layouts/admin-layout/admin-layout.component'; +import {MainComponent} from './main-module/main.component/main.component'; +import {NgModule} from '@angular/core'; + +export const routes: Routes = [ + { + path: '', + redirectTo: 'main/home', + pathMatch: 'full' + }, + { + path: 'main', + loadChildren: () => + import('./main-module/main.module').then((m) => m.MainModule), + } + +]; +export const appRouting = RouterModule.forRoot(routes); + diff --git a/jambotron-ui/src/app/app.scss b/jambotron-ui/src/app/app.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/app.spec.ts b/jambotron-ui/src/app/app.spec.ts new file mode 100644 index 0000000..4438df1 --- /dev/null +++ b/jambotron-ui/src/app/app.spec.ts @@ -0,0 +1,23 @@ +import { TestBed } from '@angular/core/testing'; +import { App } from './app'; + +describe('App', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [App], + }).compileComponents(); + }); + + it('should create the app', () => { + const fixture = TestBed.createComponent(App); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(App); + fixture.detectChanges(); + const compiled = fixture.nativeElement as HTMLElement; + expect(compiled.querySelector('h1')?.textContent).toContain('Hello, jambotron-ui'); + }); +}); diff --git a/jambotron-ui/src/app/app.ts b/jambotron-ui/src/app/app.ts new file mode 100644 index 0000000..649c4a1 --- /dev/null +++ b/jambotron-ui/src/app/app.ts @@ -0,0 +1,16 @@ +import { Component } from '@angular/core'; +import { RouterOutlet } from '@angular/router'; + +@Component({ + selector: 'app-root', + templateUrl: './app.html', + imports: [ + RouterOutlet + ], + styleUrl: './app.scss' +}) +export class App { + protected title = 'jambotron-ui'; + + constructor() { } +} diff --git a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.html b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.html new file mode 100644 index 0000000..1080dfd --- /dev/null +++ b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.html @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Add tutorial + + + + Title + + + + + + + +
+

Tutorial was submitted successfully!

+ +
+
+
diff --git a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.scss b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.scss new file mode 100644 index 0000000..d3a379b --- /dev/null +++ b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.scss @@ -0,0 +1,21 @@ +.submit-form { + max-width: 400px; + margin: auto; +} + +mat-card{ + margin: 20px; +} +mat-card-title{ + color: cyan; +} + +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; +} + +.example-full-width { + width: 100%; +} diff --git a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.spec.ts b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.spec.ts new file mode 100644 index 0000000..b6a07c8 --- /dev/null +++ b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AddTutorialComponent } from './add-tutorial.component'; + +describe('AddTutorialComponent', () => { + let component: AddTutorialComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ AddTutorialComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(AddTutorialComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.ts b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.ts new file mode 100644 index 0000000..31f2132 --- /dev/null +++ b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.ts @@ -0,0 +1,70 @@ +import {Component, CUSTOM_ELEMENTS_SCHEMA, OnInit} from '@angular/core'; +import {Tutorial} from '../../models/tutorial.model'; +import {TutorialService} from '../../services/tutorial.service'; +import {MatCard, MatCardActions, MatCardContent, MatCardHeader} from '@angular/material/card'; +import {FormsModule} from '@angular/forms'; +import {MatButton} from '@angular/material/button'; +import {MatFormField, MatInput, MatLabel} from '@angular/material/input'; +import {NgIf} from '@angular/common'; + +@Component({ + selector: 'app-add-tutorial', + templateUrl: './add-tutorial.component.html', + styleUrls: ['./add-tutorial.component.scss'], + imports: [ + MatCardActions, + FormsModule, + MatCard, + MatCardHeader, + MatCardContent, + MatFormField, + MatLabel, + + MatButton, + MatInput, + NgIf, + MatLabel, + + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class AddTutorialComponent implements OnInit { + + tutorial: Tutorial = { + title: '', + description: '', + published: false + }; + submitted = false; + + constructor(private tutorialService: TutorialService) { } + + ngOnInit(): void { + } + + saveTutorial(): void { + const data = { + title: this.tutorial.title, + description: this.tutorial.description + }; + + this.tutorialService.create(data) + .subscribe( + response => { + console.log(response); + this.submitted = true; + }, + error => { + console.log(error); + }); + } + + newTutorial(): void { + this.submitted = false; + this.tutorial = { + title: '', + description: '', + published: false + }; + } +} diff --git a/jambotron-ui/src/app/components/article-comments/article-comments.html b/jambotron-ui/src/app/components/article-comments/article-comments.html new file mode 100644 index 0000000..dfba77e --- /dev/null +++ b/jambotron-ui/src/app/components/article-comments/article-comments.html @@ -0,0 +1,10 @@ +

Comments

+

+ Building for the web is fantastic! +

+

+ The new template syntax is great +

+

+ I agree with the other comments! +

diff --git a/jambotron-ui/src/app/components/article-comments/article-comments.scss b/jambotron-ui/src/app/components/article-comments/article-comments.scss new file mode 100644 index 0000000..efc2191 --- /dev/null +++ b/jambotron-ui/src/app/components/article-comments/article-comments.scss @@ -0,0 +1,6 @@ +.comment { + padding: 15px; + margin-left: 30px; + background-color: paleturquoise; + border-radius: 20px; +} diff --git a/jambotron-ui/src/app/components/article-comments/article-comments.spec.ts b/jambotron-ui/src/app/components/article-comments/article-comments.spec.ts new file mode 100644 index 0000000..35dbfc8 --- /dev/null +++ b/jambotron-ui/src/app/components/article-comments/article-comments.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ArticleComments } from './article-comments'; + +describe('ArticleComments', () => { + let component: ArticleComments; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ArticleComments] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ArticleComments); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/components/article-comments/article-comments.ts b/jambotron-ui/src/app/components/article-comments/article-comments.ts new file mode 100644 index 0000000..958bf9e --- /dev/null +++ b/jambotron-ui/src/app/components/article-comments/article-comments.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-article-comments', + imports: [], + templateUrl: './article-comments.html', + styleUrl: './article-comments.scss' +}) +export class ArticleComments { + +} diff --git a/jambotron-ui/src/app/components/board-admin/board-admin.component.html b/jambotron-ui/src/app/components/board-admin/board-admin.component.html new file mode 100644 index 0000000..c986337 --- /dev/null +++ b/jambotron-ui/src/app/components/board-admin/board-admin.component.html @@ -0,0 +1,51 @@ +
+

Users List

+
    +
  • + {{ row.username }} + + {{ row.email}} + {{ row.password}} + +
    + + + @for (role of row.roles; track $index) { + + {{role.name}} + + + } + + + + @for (role of filteredRoles(row.roles); track role) { + {{role.name}} + } + + + +
    +
  • + +
+ +
+ diff --git a/jambotron-ui/src/app/components/board-admin/board-admin.component.scss b/jambotron-ui/src/app/components/board-admin/board-admin.component.scss new file mode 100644 index 0000000..fecda9c --- /dev/null +++ b/jambotron-ui/src/app/components/board-admin/board-admin.component.scss @@ -0,0 +1,3 @@ +.example-chip-list { + width: 100%; +} diff --git a/jambotron-ui/src/app/components/board-admin/board-admin.component.spec.ts b/jambotron-ui/src/app/components/board-admin/board-admin.component.spec.ts new file mode 100644 index 0000000..ebd5d54 --- /dev/null +++ b/jambotron-ui/src/app/components/board-admin/board-admin.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BoardAdminComponent } from './board-admin.component'; + +describe('BoardAdminComponent', () => { + let component: BoardAdminComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ BoardAdminComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(BoardAdminComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/components/board-admin/board-admin.component.ts b/jambotron-ui/src/app/components/board-admin/board-admin.component.ts new file mode 100644 index 0000000..1fc3f98 --- /dev/null +++ b/jambotron-ui/src/app/components/board-admin/board-admin.component.ts @@ -0,0 +1,144 @@ +import {Component, computed, CUSTOM_ELEMENTS_SCHEMA, model, OnInit} from '@angular/core'; + +import {User} from "../../models/user.model"; +import {MatChipGrid, MatChipInput, MatChipInputEvent, MatChipRow} from "@angular/material/chips"; +import { + MatAutocomplete, + MatAutocompleteSelectedEvent, + MatAutocompleteTrigger, + MatOption +} from "@angular/material/autocomplete"; +import {COMMA, ENTER} from "@angular/cdk/keycodes"; +import {AsyncPipe, NgForOf} from "@angular/common"; +import {FormControl, ReactiveFormsModule} from "@angular/forms"; +import {Observable, startWith} from "rxjs"; +import {map} from "rxjs/operators"; +import {UserService} from '../../services/user.service'; +import {RolesService} from '../../services/roles.service'; +import {Role} from '../../models/role'; +import {MatIcon} from '@angular/material/icon'; +import {MatFormField} from '@angular/material/form-field'; + + + +@Component({ + selector: 'app-board-admin', + templateUrl: './board-admin.component.html', + styleUrls: ['./board-admin.component.scss'], + + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [ + MatAutocomplete, + ReactiveFormsModule, + MatOption, + NgForOf, + MatFormField, + MatChipGrid, + + MatChipRow, + MatIcon, + MatChipInput, + MatAutocompleteTrigger + ] +}) +export class BoardAdminComponent implements OnInit { + private gridApi: any; + + readonly separatorKeysCodes: number[] = [ENTER, COMMA]; + rowData?: User[]; + allRoles: any; + + readonly currentRole = model(''); + + protected myControl = new FormControl(''); + protected ac = new FormControl(''); + + + constructor(private userService: UserService, private roleService: RolesService ) { + this.getAllRoles(); + } + + ngOnInit(): void { + + //this.myControl.valueChanges.pipe( + // startWith(''), + // map(value => this._filter(value || '')), + //); + + this.userService.getAdminBoard().subscribe( + (data : any) => { + this.rowData = data; + }, + (err : any)=> { + this.rowData = JSON.parse(err.error).message; + } + + ); + } + + filteredRoles(roles : Role[]):any { + return this.allRoles.filter( + (r:Role) => !roles.some((item) => item.id === r.id), + ); + + } + + // private _filter(value: string): string[] { + // const filterValue = value.toLowerCase(); + // this.ac. + // return this.options.filter(option => option.toLowerCase().includes(filterValue)); + //} + + getAllRoles():any{ + this.roleService.getAllRoles().subscribe( + (data : any) => { + this.allRoles = data; + }, + (err : any)=> { + this.allRoles = JSON.parse(err.error).message; + } + ); + } + + remove(role: string): void { + // this.fruits.update(fruits => { + // const index = fruits.indexOf(fruit); + // if (index < 0) { + // return fruits; + // } + + // fruits.splice(index, 1); + // this.announcer.announce(`Removed ${fruit}`); + // return [...fruits]; + + } + + + + add(event: MatChipInputEvent): void { + const value = (event.value || '').trim(); + + // Add our fruit + if (value) { + // this.fruits.update(fruits => [...fruits, value]); + } + + // Clear the input value + this.currentRole.set(''); + } + + selected(roles : Role[], event: MatAutocompleteSelectedEvent): void { + + roles.push(event.option.value); + this.currentRole.set(''); + event.option.deselect(); + } + + + change($event: Event, roles: Role[]) { + + roles.filter( + (r:Role) => !roles.some((item) => item.name?.toLowerCase() === r.id), + ) + } +} diff --git a/jambotron-ui/src/app/components/board-moderator/board-moderator.component.html b/jambotron-ui/src/app/components/board-moderator/board-moderator.component.html new file mode 100644 index 0000000..16287a2 --- /dev/null +++ b/jambotron-ui/src/app/components/board-moderator/board-moderator.component.html @@ -0,0 +1 @@ +

board-moderator works!

diff --git a/jambotron-ui/src/app/components/board-moderator/board-moderator.component.scss b/jambotron-ui/src/app/components/board-moderator/board-moderator.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/components/board-moderator/board-moderator.component.spec.ts b/jambotron-ui/src/app/components/board-moderator/board-moderator.component.spec.ts new file mode 100644 index 0000000..dff7faa --- /dev/null +++ b/jambotron-ui/src/app/components/board-moderator/board-moderator.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BoardModeratorComponent } from './board-moderator.component'; + +describe('BoardModeratorComponent', () => { + let component: BoardModeratorComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ BoardModeratorComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(BoardModeratorComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/components/board-moderator/board-moderator.component.ts b/jambotron-ui/src/app/components/board-moderator/board-moderator.component.ts new file mode 100644 index 0000000..daad28f --- /dev/null +++ b/jambotron-ui/src/app/components/board-moderator/board-moderator.component.ts @@ -0,0 +1,16 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-board-moderator', + templateUrl: './board-moderator.component.html', + styleUrls: ['./board-moderator.component.scss'], + standalone: false +}) +export class BoardModeratorComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/jambotron-ui/src/app/components/board-user/board-user.component.html b/jambotron-ui/src/app/components/board-user/board-user.component.html new file mode 100644 index 0000000..76c5fa7 --- /dev/null +++ b/jambotron-ui/src/app/components/board-user/board-user.component.html @@ -0,0 +1 @@ +

board-user works!

diff --git a/jambotron-ui/src/app/components/board-user/board-user.component.scss b/jambotron-ui/src/app/components/board-user/board-user.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/components/board-user/board-user.component.spec.ts b/jambotron-ui/src/app/components/board-user/board-user.component.spec.ts new file mode 100644 index 0000000..23555bb --- /dev/null +++ b/jambotron-ui/src/app/components/board-user/board-user.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BoardUserComponent } from './board-user.component'; + +describe('BoardUserComponent', () => { + let component: BoardUserComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ BoardUserComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(BoardUserComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/components/board-user/board-user.component.ts b/jambotron-ui/src/app/components/board-user/board-user.component.ts new file mode 100644 index 0000000..487eddf --- /dev/null +++ b/jambotron-ui/src/app/components/board-user/board-user.component.ts @@ -0,0 +1,16 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-board-user', + templateUrl: './board-user.component.html', + styleUrls: ['./board-user.component.scss'], + standalone: false +}) +export class BoardUserComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/jambotron-ui/src/app/components/breadcrumb/breadcrumb.component.html b/jambotron-ui/src/app/components/breadcrumb/breadcrumb.component.html new file mode 100644 index 0000000..77f0cb0 --- /dev/null +++ b/jambotron-ui/src/app/components/breadcrumb/breadcrumb.component.html @@ -0,0 +1,43 @@ +@for (breadcrumb of navigationList; track breadcrumb; let last = $last) { + @if (last && breadcrumb.breadcrumbs !== false) { + + } +} diff --git a/jambotron-ui/src/app/components/breadcrumb/breadcrumb.component.scss b/jambotron-ui/src/app/components/breadcrumb/breadcrumb.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/components/breadcrumb/breadcrumb.component.ts b/jambotron-ui/src/app/components/breadcrumb/breadcrumb.component.ts new file mode 100644 index 0000000..d824924 --- /dev/null +++ b/jambotron-ui/src/app/components/breadcrumb/breadcrumb.component.ts @@ -0,0 +1,103 @@ +// Angular Import +import { Component, Input, inject, input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { NavigationEnd, Router, RouterModule, Event } from '@angular/router'; +import { Title } from '@angular/platform-browser'; + +// project import +//import { NavigationItem, NavigationItems } from 'src/app/theme/layouts/admin-layout/navigation/navigation'; + +// icons +import { IconService } from '@ant-design/icons-angular'; +import { GlobalOutline, NodeExpandOutline } from '@ant-design/icons-angular/icons'; +import {NavigationItem, NavigationItems} from '../../layouts/admin-layout/navigation/navigation'; + +interface titleType { + // eslint-disable-next-line + url: any; + title: string; + breadcrumbs: unknown; + type: string; + link?: string | undefined; + description?: string | undefined; + path?: string | undefined; +} + +@Component({ + selector: 'app-breadcrumb', + imports: [CommonModule, RouterModule], + templateUrl: './breadcrumb.component.html', + styleUrls: ['./breadcrumb.component.scss'] +}) +export class BreadcrumbComponent { + private route = inject(Router); + private titleService = inject(Title); + private iconService = inject(IconService); + + // public props + @Input() type: string; + dashboard = input(true); + Component = input(false); + + navigations: NavigationItem[]; + ComponentNavigations: NavigationItem[] = []; + breadcrumbList: Array = []; + navigationList!: titleType[]; + componentList!: titleType[]; + + // constructor + constructor() { + this.navigations = NavigationItems; + this.type = 'theme1'; + this.setBreadcrumb(); + this.iconService.addIcon(...[GlobalOutline, NodeExpandOutline]); + } + + // public method + setBreadcrumb() { + this.route.events.subscribe((router: Event) => { + if (router instanceof NavigationEnd) { + const activeLink = router.url; + const breadcrumbList = this.filterNavigation(this.navigations, activeLink); + + this.navigationList = breadcrumbList;//breadcrumbList.slice(breadcrumbList.length - 1, breadcrumbList.length); + const title = breadcrumbList[breadcrumbList.length - 1]?.title || 'Welcome'; + this.titleService.setTitle(title + ' | Mantis Angular Admin Template'); + } + }); + } + + filterNavigation(navItems: NavigationItem[], activeLink: string): titleType[] { + for (const navItem of navItems) { + if (navItem.type === 'item' && 'url' in navItem && navItem.url === activeLink) { + return [ + { + url: 'url' in navItem ? navItem.url : false, + title: navItem.title, + link: navItem.link, + description: navItem.description, + path: navItem.path, + breadcrumbs: 'breadcrumbs' in navItem ? navItem.breadcrumbs : true, + type: navItem.type + } + ]; + } + if ((navItem.type === 'group' || navItem.type === 'collapse') && 'children' in navItem) { + const breadcrumbList = this.filterNavigation(navItem.children!, activeLink); + if (breadcrumbList.length > 0) { + breadcrumbList.unshift({ + url: 'url' in navItem ? navItem.url : false, + title: navItem.title, + link: navItem.link, + path: navItem.path, + description: navItem.description, + breadcrumbs: 'breadcrumbs' in navItem ? navItem.breadcrumbs : true, + type: navItem.type + }); + return breadcrumbList; + } + } + } + return []; + } +} diff --git a/jambotron-ui/src/app/components/card/card.component.html b/jambotron-ui/src/app/components/card/card.component.html new file mode 100644 index 0000000..2716fa8 --- /dev/null +++ b/jambotron-ui/src/app/components/card/card.component.html @@ -0,0 +1,16 @@ +
+ @if (showHeader()) { +
+
+
{{ cardTitle() }}
+ +
+ +
+ } + @if (showContent()) { +
+ +
+ } +
diff --git a/jambotron-ui/src/app/components/card/card.component.scss b/jambotron-ui/src/app/components/card/card.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/components/card/card.component.ts b/jambotron-ui/src/app/components/card/card.component.ts new file mode 100644 index 0000000..85f8cd3 --- /dev/null +++ b/jambotron-ui/src/app/components/card/card.component.ts @@ -0,0 +1,58 @@ +// Angular import +import { Component, ContentChild, ElementRef, TemplateRef, input } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'app-card', + standalone: true, + imports: [CommonModule], + templateUrl: './card.component.html', + styleUrls: ['./card.component.scss'] +}) +export class CardComponent { + // public props + /** + * Title of card. It will be visible at left side of card header + */ + cardTitle = input(); + + /** + * Class to be applied at card level + */ + cardClass = input(); + + /** + * To hide content from card + */ + showContent = input(true); + + /** + * Class to be applied at card content. + */ + blockClass = input(); + + /** + * Class to be applied on card header + */ + headerClass = input(); + + /** + * To hide header from card + */ + showHeader = input(true); + + /** + * padding around card content. default in px + */ + padding = input(20); // set default to 24 px + + /** + * Template reference of header actions on custom header + */ + @ContentChild('headerOptionsTemplate') headerOptionsTemplate!: TemplateRef; + + /** + * Template reference of header actions besides title at left + */ + @ContentChild('headerTitleTemplate') headerTitleTemplate!: TemplateRef; +} diff --git a/jambotron-ui/src/app/components/dialog/dialog.component.html b/jambotron-ui/src/app/components/dialog/dialog.component.html new file mode 100644 index 0000000..9464edd --- /dev/null +++ b/jambotron-ui/src/app/components/dialog/dialog.component.html @@ -0,0 +1,29 @@ +

Hi

+
+

User name

+ + + +

Password

+ + Enter your password + + + +
+ +
+ + +
diff --git a/jambotron-ui/src/app/components/dialog/dialog.component.scss b/jambotron-ui/src/app/components/dialog/dialog.component.scss new file mode 100644 index 0000000..292c1b2 --- /dev/null +++ b/jambotron-ui/src/app/components/dialog/dialog.component.scss @@ -0,0 +1,4 @@ + +.fillField{ + width: 100%; +}; diff --git a/jambotron-ui/src/app/components/dialog/dialog.component.spec.ts b/jambotron-ui/src/app/components/dialog/dialog.component.spec.ts new file mode 100644 index 0000000..8fd87c4 --- /dev/null +++ b/jambotron-ui/src/app/components/dialog/dialog.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DialogComponent } from './dialog.component'; + +describe('DialogComponent', () => { + let component: DialogComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [DialogComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(DialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/components/dialog/dialog.component.ts b/jambotron-ui/src/app/components/dialog/dialog.component.ts new file mode 100644 index 0000000..c2c14e5 --- /dev/null +++ b/jambotron-ui/src/app/components/dialog/dialog.component.ts @@ -0,0 +1,48 @@ +import {ChangeDetectionStrategy, Component, Inject, inject, signal} from '@angular/core'; +import {MatButtonModule} from "@angular/material/button"; +import { + MAT_DIALOG_DATA, + MatDialogActions, + MatDialogClose, + MatDialogContent, + MatDialogRef, + MatDialogTitle +} from "@angular/material/dialog"; + + +import {MatFormField, MatLabel, MatSuffix} from "@angular/material/form-field"; +import {MatInput} from "@angular/material/input"; +import {FormsModule} from "@angular/forms"; +import {MatIcon} from "@angular/material/icon"; +import {DialogData} from '../../main-module/main.component/main.component'; + + + + +@Component({ + selector: 'app-dialog', + imports: [MatButtonModule, MatLabel, MatDialogActions, MatDialogClose, MatDialogTitle, MatDialogContent, MatFormField, MatInput, FormsModule, MatIcon, MatSuffix], + changeDetection: ChangeDetectionStrategy.OnPush, + templateUrl: './dialog.component.html', + styleUrl: './dialog.component.scss' +}) +export class DialogComponent { + readonly dialogRef = inject(MatDialogRef); + hide = signal(true); + + constructor( + @Inject(MAT_DIALOG_DATA) public data:DialogData) {} + + onNoClick() { + this.dialogRef.close(); + } + + + clickEvent(event: MouseEvent) { + this.hide.set(!this.hide()); + event.stopPropagation(); + } +} + + + diff --git a/jambotron-ui/src/app/components/home.component/home.component.html b/jambotron-ui/src/app/components/home.component/home.component.html new file mode 100644 index 0000000..c657553 --- /dev/null +++ b/jambotron-ui/src/app/components/home.component/home.component.html @@ -0,0 +1,51 @@ +

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

+

home.component works!

diff --git a/jambotron-ui/src/app/components/home.component/home.component.scss b/jambotron-ui/src/app/components/home.component/home.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/components/home.component/home.component.spec.ts b/jambotron-ui/src/app/components/home.component/home.component.spec.ts new file mode 100644 index 0000000..1191557 --- /dev/null +++ b/jambotron-ui/src/app/components/home.component/home.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HomeComponent } from './home.component'; + +describe('HomeComponent', () => { + let component: HomeComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [HomeComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(HomeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/components/home.component/home.component.ts b/jambotron-ui/src/app/components/home.component/home.component.ts new file mode 100644 index 0000000..3565fc4 --- /dev/null +++ b/jambotron-ui/src/app/components/home.component/home.component.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-home.component', + imports: [], + templateUrl: './home.component.html', + styleUrl: './home.component.scss' +}) +export class HomeComponent { + +} diff --git a/jambotron-ui/src/app/components/login/login.component.html b/jambotron-ui/src/app/components/login/login.component.html new file mode 100644 index 0000000..a4d4501 --- /dev/null +++ b/jambotron-ui/src/app/components/login/login.component.html @@ -0,0 +1,75 @@ +
+
+ +
+
+ + + +
+
+ + + +
+
+ +
+
+ +
+
+ +
+ Logged in as {{ roles }}. +
+
+
diff --git a/jambotron-ui/src/app/components/login/login.component.scss b/jambotron-ui/src/app/components/login/login.component.scss new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/jambotron-ui/src/app/components/login/login.component.scss @@ -0,0 +1 @@ + diff --git a/jambotron-ui/src/app/components/login/login.component.spec.ts b/jambotron-ui/src/app/components/login/login.component.spec.ts new file mode 100644 index 0000000..d2c0e6c --- /dev/null +++ b/jambotron-ui/src/app/components/login/login.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { LoginComponent } from './login.component'; + +describe('LoginComponent', () => { + let component: LoginComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ LoginComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(LoginComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/components/login/login.component.ts b/jambotron-ui/src/app/components/login/login.component.ts new file mode 100644 index 0000000..b9518e7 --- /dev/null +++ b/jambotron-ui/src/app/components/login/login.component.ts @@ -0,0 +1,60 @@ +import { Component, OnInit } from '@angular/core'; + +import {FormsModule} from "@angular/forms"; +import {NgIf} from "@angular/common"; +import {AuthService} from '../../services/auth.service'; +import {TokenStorageService} from '../../services/token-storage.service'; + +@Component({ + selector: 'app-login', + templateUrl: './login.component.html', + imports: [ + FormsModule, + NgIf + ], + styleUrls: ['./login.component.scss'] +}) +export class LoginComponent implements OnInit { + + form: any = { + username: null, + password: null + }; + isLoggedIn = false; + isLoginFailed = false; + errorMessage = ''; + roles: string[] = []; + + constructor(private authService: AuthService, private tokenStorage: TokenStorageService) { } + + ngOnInit(): void { + if (this.tokenStorage.getToken()) { + this.isLoggedIn = true; + this.roles = this.tokenStorage.getUser().roles; + } + } + + onSubmit(): void { + const { username, password } = this.form; + + this.authService.login(username, password).subscribe( + data => { + this.tokenStorage.saveToken(data.accessToken); + this.tokenStorage.saveUser(data); + + this.isLoginFailed = false; + this.isLoggedIn = true; + this.roles = this.tokenStorage.getUser().roles; + this.reloadPage(); + }, + err => { + this.errorMessage = err.error.message; + this.isLoginFailed = true; + } + ); + } + + reloadPage(): void { + window.location.reload(); + } +} diff --git a/jambotron-ui/src/app/components/profile/profile.component.html b/jambotron-ui/src/app/components/profile/profile.component.html new file mode 100644 index 0000000..d6c4144 --- /dev/null +++ b/jambotron-ui/src/app/components/profile/profile.component.html @@ -0,0 +1,26 @@ +
+
+

+ {{ currentUser.username }} Profile +

+
+

+ Token: + {{ currentUser.accessToken.substring(0, 20) }} ... + {{ currentUser.accessToken.substr(currentUser.accessToken.length - 20) }} +

+

+ Email: + {{ currentUser.email }} +

+ Roles: +
    +
  • + {{ role }} +
  • +
+
+ + + Please login. + \ No newline at end of file diff --git a/jambotron-ui/src/app/components/profile/profile.component.scss b/jambotron-ui/src/app/components/profile/profile.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/components/profile/profile.component.spec.ts b/jambotron-ui/src/app/components/profile/profile.component.spec.ts new file mode 100644 index 0000000..e88012e --- /dev/null +++ b/jambotron-ui/src/app/components/profile/profile.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ProfileComponent } from './profile.component'; + +describe('ProfileComponent', () => { + let component: ProfileComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ProfileComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ProfileComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/components/profile/profile.component.ts b/jambotron-ui/src/app/components/profile/profile.component.ts new file mode 100644 index 0000000..8cad428 --- /dev/null +++ b/jambotron-ui/src/app/components/profile/profile.component.ts @@ -0,0 +1,23 @@ +import { Component, OnInit } from '@angular/core'; +import {TokenStorageService} from '../../services/token-storage.service'; +import {NgForOf, NgIf} from '@angular/common'; + + +@Component({ + selector: 'app-profile', + templateUrl: './profile.component.html', + imports: [ + NgForOf, + NgIf + ], + styleUrls: ['./profile.component.scss'] +}) +export class ProfileComponent implements OnInit { + currentUser: any; + + constructor(private token: TokenStorageService) { } + + ngOnInit(): void { + this.currentUser = this.token.getUser(); + } +} diff --git a/jambotron-ui/src/app/components/register/register.component.html b/jambotron-ui/src/app/components/register/register.component.html new file mode 100644 index 0000000..59c36ee --- /dev/null +++ b/jambotron-ui/src/app/components/register/register.component.html @@ -0,0 +1,89 @@ +
+
+ +
+
+ + +
+
Username is required
+
+ Username must be at least 3 characters +
+
+ Username must be at most 20 characters +
+
+
+
+ + +
+
Email is required
+
+ Email must be a valid email address +
+
+
+
+ + +
+
Password is required
+
+ Password must be at least 6 characters +
+
+
+
+ +
+ +
+ Signup failed!
{{ errorMessage }} +
+
+ +
+ Your registration is successful! +
+
+
diff --git a/jambotron-ui/src/app/components/register/register.component.scss b/jambotron-ui/src/app/components/register/register.component.scss new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/jambotron-ui/src/app/components/register/register.component.scss @@ -0,0 +1 @@ + diff --git a/jambotron-ui/src/app/components/register/register.component.spec.ts b/jambotron-ui/src/app/components/register/register.component.spec.ts new file mode 100644 index 0000000..f6db869 --- /dev/null +++ b/jambotron-ui/src/app/components/register/register.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RegisterComponent } from './register.component'; + +describe('RegisterComponent', () => { + let component: RegisterComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ RegisterComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(RegisterComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/components/register/register.component.ts b/jambotron-ui/src/app/components/register/register.component.ts new file mode 100644 index 0000000..65d3c7e --- /dev/null +++ b/jambotron-ui/src/app/components/register/register.component.ts @@ -0,0 +1,46 @@ +import { Component, OnInit } from '@angular/core'; +import {AuthService} from '../../services/auth.service'; +import {FormsModule} from '@angular/forms'; +import {NgIf} from '@angular/common'; + + +@Component({ + selector: 'app-register', + templateUrl: './register.component.html', + imports: [ + FormsModule, + NgIf + ], + styleUrls: ['./register.component.scss'] +}) +export class RegisterComponent implements OnInit { + form: any = { + username: null, + email: null, + password: null + }; + isSuccessful = false; + isSignUpFailed = false; + errorMessage = ''; + + constructor(private authService: AuthService) { } + + ngOnInit(): void { + } + + onSubmit(): void { + const { username, email, password } = this.form; + + this.authService.register(username, email, password).subscribe( + data => { + console.log(data); + this.isSuccessful = true; + this.isSignUpFailed = false; + }, + err => { + this.errorMessage = err.error.message; + this.isSignUpFailed = true; + } + ); + } +} diff --git a/jambotron-ui/src/app/components/spinner/spinkit-css/sk-line-material.scss b/jambotron-ui/src/app/components/spinner/spinkit-css/sk-line-material.scss new file mode 100644 index 0000000..cab74fb --- /dev/null +++ b/jambotron-ui/src/app/components/spinner/spinkit-css/sk-line-material.scss @@ -0,0 +1,64 @@ +.sk-line-material { + top: 0; + position: relative; + margin: auto; + width: 100%; +} + +.sk-line-material .sk-child { + width: 100%; + height: 4px; + position: absolute; + top: 0; + display: inline-block; + transform-origin: 0% 0%; + -webkit-animation: sk-line-material 2s ease-in-out 0s infinite both; + animation: sk-line-material 2s ease-in-out 0s infinite both; +} + +@-webkit-keyframes sk-line-material { + 0%, + 80%, + 100% { + -webkit-transform: scaleX(0); + transform: scaleX(0); + } + 40% { + -webkit-transform: scaleX(1); + transform: scaleX(1); + } +} + +@keyframes sk-line-material { + 0% { + -webkit-transform: scaleX(0); + transform: scaleX(0); + } + 100% { + -webkit-transform: scaleX(1); + transform: scaleX(1); + } +} + +#http-loader { + top: 0; + left: 0; + height: 100%; + width: 100%; + position: fixed; + z-index: 9999; +} + +.loader-bg { + height: 100%; + width: 100%; + position: absolute; + filter: alpha(opacity=70); + opacity: 1; + background-color: rgba(0, 0, 0, 0); +} + +.colored-parent, +.colored > div { + background-color: rgba(26, 188, 156, 0.8); +} diff --git a/jambotron-ui/src/app/components/spinner/spinkits.ts b/jambotron-ui/src/app/components/spinner/spinkits.ts new file mode 100644 index 0000000..87d5d5c --- /dev/null +++ b/jambotron-ui/src/app/components/spinner/spinkits.ts @@ -0,0 +1,11 @@ +export const Spinkit = { + skChasingDots: 'sk-chasing-dots', + skCubeGrid: 'sk-cube-grid', + skDoubleBounce: 'sk-double-bounce', + skRotatingPlane: 'sk-rotationg-plane', + skSpinnerPulse: 'sk-spinner-pulse', + skThreeBounce: 'sk-three-bounce', + skWanderingCubes: 'sk-wandering-cubes', + skWave: 'sk-wave', + skLine: 'sk-line-material' +}; diff --git a/jambotron-ui/src/app/components/spinner/spinner.component.html b/jambotron-ui/src/app/components/spinner/spinner.component.html new file mode 100644 index 0000000..7a4c0db --- /dev/null +++ b/jambotron-ui/src/app/components/spinner/spinner.component.html @@ -0,0 +1,11 @@ +@if (isSpinnerVisible) { +
+
+ @if (spinner() === Spinkit.skLine) { +
+
+
+ } +
+
+} diff --git a/jambotron-ui/src/app/components/spinner/spinner.component.scss b/jambotron-ui/src/app/components/spinner/spinner.component.scss new file mode 100644 index 0000000..8bb2921 --- /dev/null +++ b/jambotron-ui/src/app/components/spinner/spinner.component.scss @@ -0,0 +1,22 @@ +#http-loader { + top: 0; + left: 0; + height: 100%; + width: 100%; + position: fixed; + z-index: 9999; +} + +.loader-bg { + height: 100%; + width: 100%; + position: absolute; + filter: alpha(opacity=70); + opacity: 0.7; + background-color: #f1f1f1; +} + +.colored-parent, +.colored > div { + background-color: #333; +} diff --git a/jambotron-ui/src/app/components/spinner/spinner.component.ts b/jambotron-ui/src/app/components/spinner/spinner.component.ts new file mode 100644 index 0000000..a003f94 --- /dev/null +++ b/jambotron-ui/src/app/components/spinner/spinner.component.ts @@ -0,0 +1,46 @@ +// Angular import +import { Component, OnDestroy, ViewEncapsulation, inject, input } from '@angular/core'; +import { Router, NavigationStart, NavigationEnd, NavigationCancel, NavigationError } from '@angular/router'; +import { DOCUMENT } from '@angular/common'; + +// project import +import { Spinkit } from './spinkits'; + +@Component({ + selector: 'app-spinner', + templateUrl: './spinner.component.html', + styleUrls: ['./spinner.component.scss', './spinkit-css/sk-line-material.scss'], + encapsulation: ViewEncapsulation.None +}) +export class SpinnerComponent implements OnDestroy { + private router = inject(Router); + private document = inject(DOCUMENT); + + // public props + isSpinnerVisible = true; + Spinkit = Spinkit; + backgroundColor = input('#1890ff'); + spinner = input(Spinkit.skLine); + + // Constructor + constructor() { + this.router.events.subscribe( + (event) => { + if (event instanceof NavigationStart) { + this.isSpinnerVisible = true; + } else if (event instanceof NavigationEnd || event instanceof NavigationCancel || event instanceof NavigationError) { + + this.isSpinnerVisible = false; + } + }, + () => { + this.isSpinnerVisible = false; + } + ); + } + + // life cycle event + ngOnDestroy(): void { + this.isSpinnerVisible = false; + } +} diff --git a/jambotron-ui/src/app/components/system.component/system.component.html b/jambotron-ui/src/app/components/system.component/system.component.html new file mode 100644 index 0000000..e42981e --- /dev/null +++ b/jambotron-ui/src/app/components/system.component/system.component.html @@ -0,0 +1,110 @@ + + + + System + + + + + + Content 1 + + @for (column of displayedColumns; track column) { + + + + + } + + + + + + + + + + + + + + +
{{column}}{{element[column]}}  + + +
+
+ + + Name: {{element.name}} + Type: {{element.type}} + +
+
+
+ +
+ + Content 2 + + @for (column of displayedColumns; track column) { + + + + + } + + + + + + + + + + + + + + +
{{column}}{{element[column]}}  + + +
+
+ + + Name: {{element.name}} + Type: {{element.type}} + +
+
+
+
+
+
+
diff --git a/jambotron-ui/src/app/components/system.component/system.component.scss b/jambotron-ui/src/app/components/system.component/system.component.scss new file mode 100644 index 0000000..b4c141e --- /dev/null +++ b/jambotron-ui/src/app/components/system.component/system.component.scss @@ -0,0 +1,113 @@ +mat-card{ + margin: 20px; + background-color: rgba(240, 248, 255, 0.7); + backdrop-filter: blur(8px); +} + +mat-card-title{ + color: cyan; +} + +mat-card-subtitle{ + color: #009dff; +} + +mat-tab{ + color:black; +} + + +table { + width: 100%; + margin-top: 20px; + color:lightgrey; +} + + +mat-list{ + //background-color: #1389d3; + color:black; + width: 100%; +} + +mat-list-item{ + margin: 10px 10px 10px 10px; + background-color: #447694; + + color: #009dff; +} + +tr.example-detail-row { + height: 0; + background: #fffdfd; +} + +tr.example-element-row { + cursor: pointer; + color: #1389d3; + background: #fffdfd; +} + +tr.example-element-row:not(.example-expanded-row):hover { + background: whitesmoke; +} + +tr.example-element-row:not(.example-expanded-row):active { + background: #efefef; +} + +.example-element-row td { + border-bottom-width: 0; +} + +.example-element-detail-wrapper { + overflow: hidden; + display: grid; + grid-template-rows: 0fr; + grid-template-columns: 100%; + transition: grid-template-rows 225ms cubic-bezier(0.4, 0, 0.2, 1); +} + +.example-element-detail-wrapper-expanded { + grid-template-rows: 1fr; + +} + +.example-element-detail { + display: flex; + min-height: 0; +} + +.example-element-diagram { + min-width: 80px; + border: 2px solid black; + padding: 8px; + font-weight: lighter; + margin: 8px 0; + height: 104px; +} + +.example-element-symbol { + font-weight: bold; + font-size: 40px; + line-height: normal; +} + +.example-element-description { + padding: 16px; +} + +.example-element-description-attribution { + opacity: 0.5; +} + +.example-toggle-button { + transition: transform 225ms cubic-bezier(0.4, 0, 0.2, 1); +} + +.example-toggle-button-expanded { + transform: rotate(180deg); +} + + + diff --git a/jambotron-ui/src/app/components/system.component/system.component.spec.ts b/jambotron-ui/src/app/components/system.component/system.component.spec.ts new file mode 100644 index 0000000..bae84c7 --- /dev/null +++ b/jambotron-ui/src/app/components/system.component/system.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SystemComponent } from './system.component'; + +describe('SystemComponent', () => { + let component: SystemComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SystemComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SystemComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/components/system.component/system.component.ts b/jambotron-ui/src/app/components/system.component/system.component.ts new file mode 100644 index 0000000..f5f4699 --- /dev/null +++ b/jambotron-ui/src/app/components/system.component/system.component.ts @@ -0,0 +1,148 @@ +import { Component } from '@angular/core'; +import {Bean} from '../../models/Bean'; +import {SystemService} from '../../services/system.service'; +import { + MatCard, + MatCardContent, + MatCardHeader, + MatCardSubtitle, + MatCardTitle, + MatCardTitleGroup +} from '@angular/material/card'; +import {MatDivider} from '@angular/material/divider'; +import { + MatCell, + MatCellDef, + MatColumnDef, + MatHeaderCell, + MatHeaderCellDef, MatHeaderRow, + MatHeaderRowDef, MatRow, MatRowDef, + MatTable +} from '@angular/material/table'; +import {MatIconButton} from '@angular/material/button'; +import {MatIcon} from '@angular/material/icon'; +import {MatList, MatListItem} from '@angular/material/list'; +import {MatTab, MatTabGroup} from '@angular/material/tabs'; + +@Component({ + selector: 'app-system.component', + imports: [ + MatCard, + MatCardSubtitle, + MatCardContent, + MatCardHeader, + MatCardTitle, + MatDivider, + MatTable, + MatColumnDef, + MatHeaderCell, + MatCell, + MatIconButton, + MatIcon, + MatHeaderCellDef, + MatCellDef, + MatHeaderRowDef, + MatRowDef, + MatRow, + MatHeaderRow, + MatList, + MatListItem, + MatTabGroup, + MatTab + ], + templateUrl: './system.component.html', + styleUrl: './system.component.scss' +}) +export class SystemComponent { + + // @ViewChild(MatPaginator) paginator: MatPaginator; + // @ViewChild(MatSort) sort: MatSort; + + customBeans:Bean[] = [] ; + allBeans:Bean[] = [] ; + displayedColumns: string[] = ['shortName', 'typeShortName', 'scope']; + + columnsToDisplayWithExpand = [...this.displayedColumns, 'expand']; + + expandedElement: Bean | null = null; + + resultsLength = 0; + isLoadingResults = true; + isRateLimitReached = false; + + constructor(private systemService: SystemService) { } + + ngOnInit(): void { + this.retrieveBeans(); + } + + retrieveBeans(): void { + this.systemService.getCustomBeans() + .subscribe( + (data: Bean[]) => { + this.customBeans = data; + console.log(data); + }, + (error: any) => { + console.log(error); + }); + this.systemService.getAllBeans() + .subscribe( + (data: Bean[]) => { + this.allBeans = data; + console.log(data); + }, + (error: any) => { + console.log(error); + }); + } + + /** Checks whether an element is expanded. */ + isExpanded(element: Bean) { + return this.expandedElement === element; + } + + /** Toggles the expanded state of an element. */ + toggle(element: Bean) { + this.expandedElement = this.isExpanded(element) ? null : element; + } + + + + ngAfterViewInit() { + //this.exampleDatabase = new ExampleHttpDatabase(this._httpClient); + + // If the user changes the sort order, reset back to the first page. + /* this.sort.sortChange.subscribe(() => (this.paginator.pageIndex = 0)); + + merge(this.sort.sortChange, this.paginator.page) + .pipe( + startWith({}), + switchMap(() => { + this.isLoadingResults = true; + return this.exampleDatabase!.getRepoIssues( + this.sort.active, + this.sort.direction, + this.paginator.pageIndex, + ).pipe(catchError(() => observableOf(null))); + }), + map(data => { + // Flip flag to show that loading has finished. + this.isLoadingResults = false; + this.isRateLimitReached = data === null; + + if (data === null) { + return []; + } + + // Only refresh the result length if there is new data. In case of rate + // limit errors, we do not want to reset the paginator to zero, as that + // would prevent users from re-triggering requests. + this.resultsLength = data.total_count; + return data.items; + }), + ) + .subscribe(data => (this.data = data));*/ + } + +} diff --git a/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.html b/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.html new file mode 100644 index 0000000..ef9cf6b --- /dev/null +++ b/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.html @@ -0,0 +1,65 @@ +
+
+

Tutorial

+
+
+ + +
+
+ + +
+ +
+ + {{ currentTutorial.published ? "Published" : "Pending" }} +
+
+ + + + + + + +

{{ message }}

+
+ +
+
+

Cannot access this Tutorial...

+
+
\ No newline at end of file diff --git a/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.scss b/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.scss new file mode 100644 index 0000000..0f56416 --- /dev/null +++ b/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.scss @@ -0,0 +1,4 @@ +.edit-form { + max-width: 400px; + margin: auto; +} \ No newline at end of file diff --git a/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.spec.ts b/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.spec.ts new file mode 100644 index 0000000..7bc4afd --- /dev/null +++ b/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TutorialDetailsComponent } from './tutorial-details.component'; + +describe('TutorialDetailsComponent', () => { + let component: TutorialDetailsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ TutorialDetailsComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(TutorialDetailsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.ts b/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.ts new file mode 100644 index 0000000..96a88d3 --- /dev/null +++ b/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.ts @@ -0,0 +1,96 @@ +import { Component, OnInit } from '@angular/core'; + +import { ActivatedRoute, Router } from '@angular/router'; +import {Tutorial} from '../../models/tutorial.model'; +import {TutorialService} from '../../services/tutorial.service'; +import {FormsModule} from '@angular/forms'; +import {NgIf} from '@angular/common'; + + +@Component({ + selector: 'app-tutorial-details', + templateUrl: './tutorial-details.component.html', + imports: [ + FormsModule, + NgIf + ], + styleUrls: ['./tutorial-details.component.scss'] +}) +export class TutorialDetailsComponent implements OnInit { + + currentTutorial: Tutorial = { + title: '', + description: '', + published: false + }; + message = ''; + + constructor( + private tutorialService: TutorialService, + private route: ActivatedRoute, + private router: Router) { } + + ngOnInit(): void { + this.message = ''; + this.getTutorial(this.route.snapshot.params['id']); + } + + getTutorial(id: string): void { + this.tutorialService.get(id) + .subscribe( + data => { + this.currentTutorial = data; + console.log(data); + }, + error => { + console.log(error); + }); + } + + updatePublished(status: boolean): void { + const data = { + title: this.currentTutorial.title, + description: this.currentTutorial.description, + published: status + }; + + this.message = ''; + + this.tutorialService.update(this.currentTutorial.id, data) + .subscribe( + response => { + this.currentTutorial.published = status; + console.log(response); + this.message = response.message ? response.message : 'The status was updated successfully!'; + }, + error => { + console.log(error); + }); + } + + updateTutorial(): void { + this.message = ''; + + this.tutorialService.update(this.currentTutorial.id, this.currentTutorial) + .subscribe( + response => { + console.log(response); + this.message = response.message ? response.message : 'This tutorial was updated successfully!'; + }, + error => { + console.log(error); + }); + } + + deleteTutorial(): void { + this.tutorialService.delete(this.currentTutorial.id) + .subscribe( + response => { + console.log(response); + this.router.navigate(['/tutorials']); + }, + error => { + console.log(error); + }); + } +} diff --git a/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.html b/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.html new file mode 100644 index 0000000..a83a76a --- /dev/null +++ b/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.html @@ -0,0 +1,63 @@ +
+
+
+ +
+ +
+
+
+
+

Tutorials List

+
    +
  • + {{ tutorial.title }} +
  • +
+ + +
+
+
+

Tutorial

+
+ {{ currentTutorial.title }} +
+
+ + {{ currentTutorial.description }} +
+
+ + {{ currentTutorial.published ? "Published" : "Pending" }} +
+ + + Edit + +
+ +
+
+

Please click on a Tutorial...

+
+
+
\ No newline at end of file diff --git a/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.scss b/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.scss new file mode 100644 index 0000000..9dc0d33 --- /dev/null +++ b/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.scss @@ -0,0 +1,6 @@ +.list { + text-align: left; + max-width: 750px; + margin: auto; +} + diff --git a/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.spec.ts b/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.spec.ts new file mode 100644 index 0000000..a757a41 --- /dev/null +++ b/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TutorialsListComponent } from './tutorials-list.component'; + +describe('TutorialsListComponent', () => { + let component: TutorialsListComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ TutorialsListComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(TutorialsListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.ts b/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.ts new file mode 100644 index 0000000..f1cdb3f --- /dev/null +++ b/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.ts @@ -0,0 +1,82 @@ +import { Component, OnInit } from '@angular/core'; + + +import {Tutorial} from '../../models/tutorial.model'; +import {TutorialService} from '../../services/tutorial.service'; +import {FormsModule} from '@angular/forms'; +import {RouterLink} from '@angular/router'; +import {NgIf} from '@angular/common'; + +@Component({ + selector: 'app-tutorials-list', + templateUrl: './tutorials-list.component.html', + imports: [ + FormsModule, + RouterLink, + NgIf + ], + styleUrls: ['./tutorials-list.component.scss'] +}) +export class TutorialsListComponent implements OnInit { + + tutorials?: Tutorial[]; + currentTutorial: Tutorial = {}; + currentIndex = -1; + title = ''; + + constructor(private tutorialService: TutorialService) { } + + ngOnInit(): void { + this.retrieveTutorials(); + } + + retrieveTutorials(): void { + this.tutorialService.getAll() + .subscribe( + data => { + this.tutorials = data; + console.log(data); + }, + error => { + console.log(error); + }); + } + + refreshList(): void { + this.retrieveTutorials(); + this.currentTutorial = {}; + this.currentIndex = -1; + } + + setActiveTutorial(tutorial: Tutorial, index: number): void { + this.currentTutorial = tutorial; + this.currentIndex = index; + } + + removeAllTutorials(): void { + this.tutorialService.deleteAll() + .subscribe( + response => { + console.log(response); + this.refreshList(); + }, + error => { + console.log(error); + }); + } + + searchTitle(): void { + this.currentTutorial = {}; + this.currentIndex = -1; + + this.tutorialService.findByTitle(this.title) + .subscribe( + data => { + this.tutorials = data; + console.log(data); + }, + error => { + console.log(error); + }); + } +} diff --git a/jambotron-ui/src/app/components/tutorials.component/tutorials.component.html b/jambotron-ui/src/app/components/tutorials.component/tutorials.component.html new file mode 100644 index 0000000..1c6abe5 --- /dev/null +++ b/jambotron-ui/src/app/components/tutorials.component/tutorials.component.html @@ -0,0 +1,9 @@ +@for (tutorial of tutorials; track $index){ + + + {{tutorial.title}} + + + + +} diff --git a/jambotron-ui/src/app/components/tutorials.component/tutorials.component.scss b/jambotron-ui/src/app/components/tutorials.component/tutorials.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/components/tutorials.component/tutorials.component.spec.ts b/jambotron-ui/src/app/components/tutorials.component/tutorials.component.spec.ts new file mode 100644 index 0000000..280f05a --- /dev/null +++ b/jambotron-ui/src/app/components/tutorials.component/tutorials.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TutorialsComponent } from './tutorials.component'; + +describe('TutorialsComponent', () => { + let component: TutorialsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [TutorialsComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(TutorialsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/components/tutorials.component/tutorials.component.ts b/jambotron-ui/src/app/components/tutorials.component/tutorials.component.ts new file mode 100644 index 0000000..c97aa15 --- /dev/null +++ b/jambotron-ui/src/app/components/tutorials.component/tutorials.component.ts @@ -0,0 +1,39 @@ +import {Component, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {Tutorial} from '../../models/tutorial.model'; +import {TutorialService} from '../../services/tutorial.service'; +import {MatCard, MatCardContent, MatCardHeader} from '@angular/material/card'; + +@Component({ + selector: 'app-tutorials.component', + imports: [ + MatCard, + MatCardContent, + MatCardHeader + ], + templateUrl: './tutorials.component.html', + styleUrl: './tutorials.component.scss', + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class TutorialsComponent { + tutorials?: Tutorial[]; + + constructor(private tutorialService: TutorialService) { + this.retrieveTutorials(); + } + + // ngOnInit(): void { + // this.retrieveTutorials(); + // } + + retrieveTutorials(): void { + this.tutorialService.getAll() + .subscribe( + data => { + this.tutorials = data; + console.log(data); + }, + error => { + console.log(error); + }); + } +} diff --git a/jambotron-ui/src/app/directives/column-resize.directive.spec.ts b/jambotron-ui/src/app/directives/column-resize.directive.spec.ts new file mode 100644 index 0000000..181e843 --- /dev/null +++ b/jambotron-ui/src/app/directives/column-resize.directive.spec.ts @@ -0,0 +1,8 @@ +import { ColumnResizeDirective } from './column-resize.directive'; + +describe('ColumnResizeDirective', () => { + it('should create an instance', () => { + const directive = new ColumnResizeDirective(); + expect(directive).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/directives/column-resize.directive.ts b/jambotron-ui/src/app/directives/column-resize.directive.ts new file mode 100644 index 0000000..c842abf --- /dev/null +++ b/jambotron-ui/src/app/directives/column-resize.directive.ts @@ -0,0 +1,114 @@ +import { + Directive, + ElementRef, + OnDestroy, + OnInit, + Renderer2, + NgZone, + Input, +} from '@angular/core'; +import { Subject, fromEvent, takeUntil } from 'rxjs'; + +@Directive({ + selector: '[appColumnResize]', +}) +export class ColumnResizeDirective implements OnInit, OnDestroy { + @Input() resizableTable: HTMLElement | null = null; + + private isResizing = false; + private startX!: number; + private startWidth!: number; + private column: HTMLElement; + private table: HTMLElement | null = null; + private resizer!: HTMLElement; + private destroy$ = new Subject(); + + constructor( + private el: ElementRef, + private renderer: Renderer2, + private zone: NgZone + ) { + this.column = this.el.nativeElement; + } + + ngOnInit() { + this.table = this.resizableTable || this.findParentTable(this.column); + + if (!this.table) { + console.error( + 'Parent table not found. Make sure the directive is applied to a th element within a table.' + ); + return; + } + + this.createResizer(); + this.initializeResizeListener(); + } + + private createResizer() { + this.resizer = this.renderer.createElement('div'); + this.renderer.addClass(this.resizer, 'column-resizer'); + this.renderer.setStyle(this.resizer, 'position', 'absolute'); + this.renderer.setStyle(this.resizer, 'right', '0'); + this.renderer.setStyle(this.resizer, 'top', '0'); + this.renderer.setStyle(this.resizer, 'height', '100%'); + this.renderer.setStyle(this.resizer, 'width', '5px'); + this.renderer.setStyle(this.resizer, 'cursor', 'col-resize'); + this.renderer.appendChild(this.column, this.resizer); + } + + private initializeResizeListener() { + this.zone.runOutsideAngular(() => { + fromEvent(this.resizer, 'mousedown') + .pipe(takeUntil(this.destroy$)) + .subscribe((e: Event) => this.onMouseDown(e as MouseEvent)); + + fromEvent(document, 'mousemove') + .pipe(takeUntil(this.destroy$)) + .subscribe((e: Event) => this.onMouseMove(e as MouseEvent)); + + fromEvent(document, 'mouseup') + .pipe(takeUntil(this.destroy$)) + .subscribe(() => this.onMouseUp()); + }); + } + + private onMouseDown(e: MouseEvent) { + e.preventDefault(); + this.isResizing = true; + this.startX = e.pageX; + this.startWidth = this.column.offsetWidth; + this.renderer.addClass(this.column, 'resizing'); + if (this.table) { + this.renderer.addClass(this.table, 'resizing'); + } + } + + private onMouseMove(e: MouseEvent) { + if (!this.isResizing) return; + const width = this.startWidth + (e.pageX - this.startX); + this.renderer.setStyle(this.column, 'width', `${width}px`); + } + + private onMouseUp() { + if (!this.isResizing) return; + this.isResizing = false; + this.renderer.removeClass(this.column, 'resizing'); + if (this.table) { + this.renderer.removeClass(this.table, 'resizing'); + } + } + + private findParentTable(element: HTMLElement): HTMLElement | null { + while (element && element.tagName !== 'TABLE') { + element = element.parentElement as HTMLElement; + if (!element) return null; + } + return element; + } + + ngOnDestroy() { + this.destroy$.next(); + this.destroy$.complete(); + } +} diff --git a/jambotron-ui/src/app/helpers/auth.interceptor.ts b/jambotron-ui/src/app/helpers/auth.interceptor.ts new file mode 100644 index 0000000..47204e7 --- /dev/null +++ b/jambotron-ui/src/app/helpers/auth.interceptor.ts @@ -0,0 +1,26 @@ +import { HTTP_INTERCEPTORS, HttpEvent } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http'; + +import { TokenStorageService } from '../services/token-storage.service'; +import { Observable } from 'rxjs'; + +const TOKEN_HEADER_KEY = 'Authorization'; // for Spring Boot back-end + +@Injectable() +export class AuthInterceptor implements HttpInterceptor { + constructor(private token: TokenStorageService) { } + + intercept(req: HttpRequest, next: HttpHandler): Observable> { + let authReq = req; + const token = this.token.getToken(); + if (token != null) { + authReq = req.clone({ headers: req.headers.set(TOKEN_HEADER_KEY, 'Bearer ' + token) }); + } + return next.handle(authReq); + } +} + +export const authInterceptorProviders = [ + { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true } +]; \ No newline at end of file diff --git a/jambotron-ui/src/app/layouts/admin-layout/admin-layout.component.html b/jambotron-ui/src/app/layouts/admin-layout/admin-layout.component.html new file mode 100644 index 0000000..e36c8f4 --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/admin-layout.component.html @@ -0,0 +1,50 @@ + + + + +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+ + diff --git a/jambotron-ui/src/app/layouts/admin-layout/admin-layout.component.scss b/jambotron-ui/src/app/layouts/admin-layout/admin-layout.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/layouts/admin-layout/admin-layout.component.ts b/jambotron-ui/src/app/layouts/admin-layout/admin-layout.component.ts new file mode 100644 index 0000000..597a5b6 --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/admin-layout.component.ts @@ -0,0 +1,51 @@ +// Angular import +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; + +// Project import + +import { NavBarComponent } from './nav-bar/nav-bar.component'; +import { NavigationComponent } from './navigation/navigation.component'; +import { ConfigurationComponent } from './configuration/configuration.component'; +import {BreadcrumbComponent} from '../../components/breadcrumb/breadcrumb.component'; +//import { BreadcrumbComponent } from 'src/app/theme/shared/components/breadcrumb/breadcrumb.component'; + +@Component({ + selector: 'app-admin', + imports: [CommonModule, BreadcrumbComponent, NavigationComponent, NavBarComponent, RouterModule, ConfigurationComponent, NavigationComponent], + templateUrl: './admin-layout.component.html', + styleUrls: ['./admin-layout.component.scss'] +}) +export class AdminComponent { + // public props + navCollapsed: boolean = true; + navCollapsedMob: boolean = true; + + // public method + navMobClick() { + if (this.navCollapsedMob && !document.querySelector('app-navigation.pc-sidebar')?.classList.contains('mob-open')) { + this.navCollapsedMob = !this.navCollapsedMob; + setTimeout(() => { + this.navCollapsedMob = !this.navCollapsedMob; + }, 100); + } else { + this.navCollapsedMob = !this.navCollapsedMob; + } + if (document.querySelector('app-navigation.pc-sidebar')?.classList.contains('navbar-collapsed')) { + document.querySelector('app-navigation.pc-sidebar')?.classList.remove('navbar-collapsed'); + } + } + + handleKeyDown(event: KeyboardEvent): void { + if (event.key === 'Escape') { + this.closeMenu(); + } + } + + closeMenu() { + if (document.querySelector('app-navigation.pc-sidebar')?.classList.contains('mob-open')) { + document.querySelector('app-navigation.pc-sidebar')?.classList.remove('mob-open'); + } + } +} diff --git a/jambotron-ui/src/app/layouts/admin-layout/configuration/configuration.component.html b/jambotron-ui/src/app/layouts/admin-layout/configuration/configuration.component.html new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/layouts/admin-layout/configuration/configuration.component.scss b/jambotron-ui/src/app/layouts/admin-layout/configuration/configuration.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/layouts/admin-layout/configuration/configuration.component.ts b/jambotron-ui/src/app/layouts/admin-layout/configuration/configuration.component.ts new file mode 100644 index 0000000..abfc887 --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/configuration/configuration.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-configuration', + imports: [], + templateUrl: './configuration.component.html', + styleUrl: './configuration.component.scss' +}) +export class ConfigurationComponent {} diff --git a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.html b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.html new file mode 100644 index 0000000..99f375e --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.html @@ -0,0 +1,10 @@ +
+
+
+ +
+
+ +
+
+
diff --git a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.scss b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.scss new file mode 100644 index 0000000..e4f45fd --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.scss @@ -0,0 +1,3 @@ +.pc-header{ + left: 0; +} diff --git a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.ts b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.ts new file mode 100644 index 0000000..7c7ebaf --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.ts @@ -0,0 +1,49 @@ +// angular import +import {Component, inject, OnInit, output} from '@angular/core'; + +// project import + +import { NavLeftComponent } from './nav-left/nav-left.component'; +import { NavRightComponent } from './nav-right/nav-right.component'; +import {DOCUMENT} from '@angular/common'; + +@Component({ + selector: 'app-nav-bar', + imports: [NavLeftComponent, NavRightComponent], + templateUrl: './nav-bar.component.html', + styleUrls: ['./nav-bar.component.scss'] +}) +export class NavBarComponent implements OnInit{ + private document = inject(DOCUMENT); + // public props + NavCollapse = output(); + NavCollapsedMob = output(); + + navCollapsed: boolean = false; + windowWidth: number | undefined = 1000; + navCollapsedMob: boolean; + + // Constructor + constructor() { + + this.navCollapsedMob = false; + } + + ngOnInit(): void { + this.windowWidth = this.document.defaultView?.innerWidth; + } + + // public method + navCollapse() { + if (!!this.windowWidth && this.windowWidth >= 1025) { + this.navCollapsed = !this.navCollapsed; + this.NavCollapse.emit(); + } + } + + navCollapseMob() { + if (!!this.windowWidth && this.windowWidth < 1025) { + this.NavCollapsedMob.emit(); + } + } +} diff --git a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-left/nav-left.component.html b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-left/nav-left.component.html new file mode 100644 index 0000000..d7991d8 --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-left/nav-left.component.html @@ -0,0 +1,43 @@ + diff --git a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-left/nav-left.component.scss b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-left/nav-left.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-left/nav-left.component.ts b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-left/nav-left.component.ts new file mode 100644 index 0000000..4dfb288 --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-left/nav-left.component.ts @@ -0,0 +1,37 @@ +// Angular import +import {CommonModule, DOCUMENT} from '@angular/common'; +import { Component, inject, input, output } from '@angular/core'; + +// project import + +// icons +import { IconService, IconDirective } from '@ant-design/icons-angular'; +import { MenuUnfoldOutline, MenuFoldOutline, SearchOutline } from '@ant-design/icons-angular/icons'; + +@Component({ + selector: 'app-nav-left', + imports: [IconDirective, CommonModule], + templateUrl: './nav-left.component.html', + styleUrls: ['./nav-left.component.scss'] +}) +export class NavLeftComponent { + private iconService = inject(IconService); + private document = inject(DOCUMENT); + + // public props + navCollapsed = input.required(); + NavCollapse = output(); + NavCollapsedMob = output(); + windowWidth: number | undefined = 1000; + + // Constructor + constructor() { + this.windowWidth = this.document.defaultView?.innerWidth; + this.iconService.addIcon(...[MenuUnfoldOutline, MenuFoldOutline, SearchOutline]); + } + + // public method + navCollapse() { + this.NavCollapse.emit(); + } +} diff --git a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-right/nav-right.component.html b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-right/nav-right.component.html new file mode 100644 index 0000000..97bcd93 --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-right/nav-right.component.html @@ -0,0 +1,147 @@ + diff --git a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-right/nav-right.component.scss b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-right/nav-right.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-right/nav-right.component.ts b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-right/nav-right.component.ts new file mode 100644 index 0000000..baf2a8c --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-right/nav-right.component.ts @@ -0,0 +1,121 @@ +// angular import +import {Component, inject, input, OnInit, output} from '@angular/core'; +import { RouterModule } from '@angular/router'; + +// project import + +// icon +import { IconService, IconDirective } from '@ant-design/icons-angular'; +import { + BellOutline, + SettingOutline, + GiftOutline, + MessageOutline, + PhoneOutline, + CheckCircleOutline, + LogoutOutline, + EditOutline, + UserOutline, + ProfileOutline, + WalletOutline, + QuestionCircleOutline, + LockOutline, + CommentOutline, + UnorderedListOutline, + ArrowRightOutline, + GithubOutline +} from '@ant-design/icons-angular/icons'; +import { NgbDropdownModule, NgbNavModule } from '@ng-bootstrap/ng-bootstrap'; +import { NgScrollbarModule } from 'ngx-scrollbar'; +import {DOCUMENT} from '@angular/common'; + +@Component({ + selector: 'app-nav-right', + imports: [IconDirective, RouterModule, NgScrollbarModule, NgbNavModule, NgbDropdownModule], + templateUrl: './nav-right.component.html', + styleUrls: ['./nav-right.component.scss'] +}) +export class NavRightComponent implements OnInit{ + private iconService = inject(IconService); + private document = inject(DOCUMENT); + //private window = inject(Window); + styleSelectorToggle = input(); + Customize = output(); + windowWidth: number | undefined = 1000; + screenFull: boolean = true; + + constructor() { + + this.iconService.addIcon( + ...[ + CheckCircleOutline, + GiftOutline, + MessageOutline, + SettingOutline, + PhoneOutline, + LogoutOutline, + UserOutline, + EditOutline, + ProfileOutline, + QuestionCircleOutline, + LockOutline, + CommentOutline, + UnorderedListOutline, + ArrowRightOutline, + BellOutline, + GithubOutline, + WalletOutline + ] + ); + } + + ngOnInit(): void { + this.windowWidth = this.document.defaultView?.innerWidth; + } + + profile = [ + { + icon: 'edit', + title: 'Edit Profile' + }, + { + icon: 'user', + title: 'View Profile' + }, + { + icon: 'profile', + title: 'Social Profile' + }, + { + icon: 'wallet', + title: 'Billing' + }, + { + icon: 'logout', + title: 'Logout' + } + ]; + + setting = [ + { + icon: 'question-circle', + title: 'Support' + }, + { + icon: 'user', + title: 'Account Settings' + }, + { + icon: 'lock', + title: 'Privacy Center' + }, + { + icon: 'comment', + title: 'Feedback' + }, + { + icon: 'unordered-list', + title: 'History' + } + ]; +} diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-collapse/nav-collapse.component.html b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-collapse/nav-collapse.component.html new file mode 100644 index 0000000..cf6308b --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-collapse/nav-collapse.component.html @@ -0,0 +1,21 @@ + diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-collapse/nav-collapse.component.scss b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-collapse/nav-collapse.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-collapse/nav-collapse.component.ts b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-collapse/nav-collapse.component.ts new file mode 100644 index 0000000..5623fc2 --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-collapse/nav-collapse.component.ts @@ -0,0 +1,88 @@ +// Angular import +import {Component, inject, Input, OnInit, output} from '@angular/core'; +import { animate, style, transition, trigger } from '@angular/animations'; +import {CommonModule, DOCUMENT} from '@angular/common'; +import { RouterModule } from '@angular/router'; + +// project import +import { NavigationItem } from '../../navigation'; + +import { NavItemComponent } from '../nav-item/nav-item.component'; +import { IconDirective } from '@ant-design/icons-angular'; + +@Component({ + selector: 'app-nav-collapse', + imports: [CommonModule, IconDirective, RouterModule, NavItemComponent], + templateUrl: './nav-collapse.component.html', + styleUrls: ['./nav-collapse.component.scss'], + animations: [ + trigger('slideInOut', [ + transition(':enter', [ + style({ transform: 'translateY(-100%)', display: 'block' }), + animate('250ms ease-in', style({ transform: 'translateY(0%)' })) + ]), + transition(':leave', [animate('250ms ease-in', style({ transform: 'translateY(-100%)' }))]) + ]) + ] +}) +export class NavCollapseComponent implements OnInit{ + + private document = inject(DOCUMENT); + + // public props + + // Compact Menu in use For Sub Child Open in sidebar menu + showCollapseItem = output(); + + // all Version Get Item(Component Name Take) + @Input() item!: NavigationItem; + + windowWidth: number | undefined = 1000; + + // Constructor + constructor() { + //this.windowWidth = window.innerWidth; + } + + ngOnInit(): void { + this.windowWidth = this.document.defaultView?.innerWidth;throw new Error('Method not implemented.'); + } + + // public method + navCollapse(e: MouseEvent) { + let parent = e.target as HTMLElement; + + if (parent?.tagName === 'SPAN') { + parent = parent.parentElement!; + } + + parent = (parent as HTMLElement).parentElement as HTMLElement; + + const sections = document.querySelectorAll('.coded-hasmenu'); + for (let i = 0; i < sections.length; i++) { + if (sections[i] !== parent) { + sections[i].classList.remove('coded-trigger'); + } + } + + let first_parent = parent.parentElement; + let pre_parent = ((parent as HTMLElement).parentElement as HTMLElement).parentElement as HTMLElement; + if (first_parent?.classList.contains('coded-hasmenu')) { + do { + first_parent?.classList.add('coded-trigger'); + first_parent = ((first_parent as HTMLElement).parentElement as HTMLElement).parentElement as HTMLElement; + } while (first_parent.classList.contains('coded-hasmenu')); + } else if (pre_parent.classList.contains('coded-submenu')) { + do { + pre_parent?.parentElement?.classList.add('coded-trigger'); + pre_parent = (((pre_parent as HTMLElement).parentElement as HTMLElement).parentElement as HTMLElement).parentElement as HTMLElement; + } while (pre_parent.classList.contains('coded-submenu')); + } + parent.classList.toggle('coded-trigger'); + } + + // for Compact Menu + subMenuCollapse(item: void) { + this.showCollapseItem.emit(item); + } +} diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-content.component.html b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-content.component.html new file mode 100644 index 0000000..6bb18f4 --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-content.component.html @@ -0,0 +1,34 @@ + + + + diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-content.component.scss b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-content.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-content.component.ts b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-content.component.ts new file mode 100644 index 0000000..38a475e --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-content.component.ts @@ -0,0 +1,106 @@ +// Angular import +import { Component, OnInit, inject, output } from '@angular/core'; +import {CommonModule, DOCUMENT, Location, LocationStrategy} from '@angular/common'; +import { RouterModule } from '@angular/router'; + +// project import +import { NavigationItem, NavigationItems } from '../navigation'; +//import { environment } from 'src/environments/environment'; + +import { NavGroupComponent } from './nav-group/nav-group.component'; + +// icon +import { IconService } from '@ant-design/icons-angular'; +import { + DashboardOutline, + CreditCardOutline, + LoginOutline, + QuestionOutline, + ChromeOutline, + FontSizeOutline, + ProfileOutline, + BgColorsOutline, + AntDesignOutline +} from '@ant-design/icons-angular/icons'; +import { NgScrollbarModule } from 'ngx-scrollbar'; + +@Component({ + selector: 'app-nav-content', + imports: [CommonModule, RouterModule, NavGroupComponent, NgScrollbarModule], + templateUrl: './nav-content.component.html', + styleUrls: ['./nav-content.component.scss'] +}) +export class NavContentComponent implements OnInit { + private location = inject(Location); + private locationStrategy = inject(LocationStrategy); + private iconService = inject(IconService) + private document = inject(DOCUMENT); + + // public props + NavCollapsedMob = output(); + + navigations: NavigationItem[]; + + // version + title = 'Demo application for version numbering'; + //currentApplicationVersion = environment.appVersion; + + navigation = NavigationItems; + windowWidth: number | undefined = 1000; + + // Constructor + constructor() { + this.iconService.addIcon( + ...[ + DashboardOutline, + CreditCardOutline, + FontSizeOutline, + LoginOutline, + ProfileOutline, + BgColorsOutline, + AntDesignOutline, + ChromeOutline, + QuestionOutline + ] + ); + this.navigations = NavigationItems; + } + + // Life cycle events + ngOnInit() { + if (!!this.windowWidth && this.windowWidth < 1025) { + (this.document.querySelector('.coded-navbar') as HTMLDivElement)?.classList.add('menupos-static'); + } + } + + fireOutClick() { + let current_url = this.location.path(); + const baseHref = this.locationStrategy.getBaseHref(); + if (baseHref) { + current_url = baseHref + this.location.path(); + } + const link = "a.nav-link[ href='" + current_url + "' ]"; + const ele = document?.querySelector(link); + if (ele !== null && ele !== undefined) { + const parent = ele.parentElement; + const up_parent = parent?.parentElement?.parentElement; + const last_parent = up_parent?.parentElement; + if (parent?.classList.contains('coded-hasmenu')) { + parent.classList.add('coded-trigger'); + parent.classList.add('active'); + } else if (up_parent?.classList.contains('coded-hasmenu')) { + up_parent.classList.add('coded-trigger'); + up_parent.classList.add('active'); + } else if (last_parent?.classList.contains('coded-hasmenu')) { + last_parent.classList.add('coded-trigger'); + last_parent.classList.add('active'); + } + } + } + + navMob() { + if (!!this.windowWidth && this.windowWidth < 1025 && document.querySelector('app-navigation.coded-navbar')?.classList.contains('mob-open')) { + this.NavCollapsedMob.emit(); + } + } +} diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-group/nav-group.component.html b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-group/nav-group.component.html new file mode 100644 index 0000000..98289c9 --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-group/nav-group.component.html @@ -0,0 +1,10 @@ + +@for (item of item().children; track item) { + @if (item.type === 'collapse') { + + } @else if (item.type === 'item') { + + } +} diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-group/nav-group.component.scss b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-group/nav-group.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-group/nav-group.component.ts b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-group/nav-group.component.ts new file mode 100644 index 0000000..7a7edcf --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-group/nav-group.component.ts @@ -0,0 +1,67 @@ +// Angular import +import { Component, OnInit, inject, input } from '@angular/core'; +import {CommonModule, DOCUMENT, Location} from '@angular/common'; + +// project import +import { NavigationItem } from '../../navigation'; + +import { NavCollapseComponent } from '../nav-collapse/nav-collapse.component'; +import { NavItemComponent } from '../nav-item/nav-item.component'; + +@Component({ + selector: 'app-nav-group', + imports: [CommonModule, NavCollapseComponent, NavItemComponent], + templateUrl: './nav-group.component.html', + styleUrls: ['./nav-group.component.scss'] +}) +export class NavGroupComponent implements OnInit { + private location = inject(Location); + private document = inject(DOCUMENT); + // public props + + // All Version in Group Name + item = input.required(); + + // Life cycle events + ngOnInit() { + // at reload time active and trigger link + let current_url: string | any = this.location.path(); + // eslint-disable-next-line + // @ts-ignore + if (this.location['_baseHref']) { + // eslint-disable-next-line + + + // @ts-ignore + current_url = this.location['_baseHref'] + this.location.path(); + } + + const link = "a.nav-link[ href='" + current_url + "' ]"; + //if(this.document === undefined) return; + const ele = this.document?.querySelector(link); + if (ele !== null && ele !== undefined) { + const parent = ele.parentElement; + const up_parent = parent?.parentElement?.parentElement; + const pre_parent = up_parent?.parentElement; + const last_parent = up_parent?.parentElement?.parentElement?.parentElement?.parentElement; + if (parent?.classList.contains('coded-hasmenu')) { + parent?.classList.add('coded-trigger'); + parent?.classList.add('active'); + } else if (up_parent?.classList.contains('coded-hasmenu')) { + up_parent?.classList.add('coded-trigger'); + up_parent?.classList.add('active'); + } else if (pre_parent?.classList.contains('coded-hasmenu')) { + pre_parent?.classList.add('coded-trigger'); + pre_parent?.classList.add('active'); + } + + if (last_parent?.classList.contains('coded-hasmenu')) { + last_parent?.classList.add('coded-trigger'); + if (pre_parent?.classList.contains('coded-hasmenu')) { + pre_parent?.classList.add('coded-trigger'); + } + } + last_parent?.classList.add('active'); + } + } +} diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-item/nav-item.component.html b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-item/nav-item.component.html new file mode 100644 index 0000000..f60f5f7 --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-item/nav-item.component.html @@ -0,0 +1,32 @@ +@if (item.url && !item.external) { +
  • + + @if (item.icon) { + + + + } + @if (item.icon) { + {{ item.title }} + } @else { + {{ item.title }} + } + +
  • +} +@if (item.url && item.external) { +
  • + + @if (item.icon) { + + + + } + @if (item.icon) { + {{ item.title }} + } @else { + {{ item.title }} + } + +
  • +} diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-item/nav-item.component.scss b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-item/nav-item.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-item/nav-item.component.ts b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-item/nav-item.component.ts new file mode 100644 index 0000000..6347047 --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-item/nav-item.component.ts @@ -0,0 +1,51 @@ +// Angular import +import {Component, inject, Input} from '@angular/core'; +import {CommonModule, DOCUMENT} from '@angular/common'; +import { RouterModule } from '@angular/router'; + +// Project import +import { NavigationItem } from '../../navigation'; + +import { IconDirective } from '@ant-design/icons-angular'; + +@Component({ + selector: 'app-nav-item', + imports: [CommonModule, IconDirective, RouterModule], + templateUrl: './nav-item.component.html', + styleUrls: ['./nav-item.component.scss'] +}) +export class NavItemComponent { + private document = inject(DOCUMENT); + + // public props + @Input() item!: NavigationItem; + + // public method + closeOtherMenu(event: MouseEvent) { + const ele = event.target as HTMLElement; + if (ele !== null && ele !== undefined) { + const parent = ele.parentElement as HTMLElement; + const up_parent = ((parent.parentElement as HTMLElement).parentElement as HTMLElement).parentElement as HTMLElement; + const last_parent = up_parent.parentElement; + const sections = this.document.querySelectorAll('.coded-hasmenu'); + for (let i = 0; i < sections.length; i++) { + sections[i].classList.remove('active'); + sections[i].classList.remove('coded-trigger'); + } + + if (parent.classList.contains('coded-hasmenu')) { + parent.classList.add('coded-trigger'); + parent.classList.add('active'); + } else if (up_parent.classList.contains('coded-hasmenu')) { + up_parent.classList.add('coded-trigger'); + up_parent.classList.add('active'); + } else if (last_parent?.classList.contains('coded-hasmenu')) { + last_parent.classList.add('coded-trigger'); + last_parent.classList.add('active'); + } + } + if ((document.querySelector('app-navigation.pc-sidebar') as HTMLDivElement).classList.contains('mob-open')) { + (document.querySelector('app-navigation.pc-sidebar') as HTMLDivElement).classList.remove('mob-open'); + } + } +} diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.component.html b/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.component.html new file mode 100644 index 0000000..8d9ddf6 --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.component.html @@ -0,0 +1,10 @@ + diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.component.scss b/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.component.ts b/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.component.ts new file mode 100644 index 0000000..3821a53 --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.component.ts @@ -0,0 +1,49 @@ +// Angular import +import {Component, EventEmitter, inject, OnInit, Output, output} from '@angular/core'; +import {CommonModule, DOCUMENT} from '@angular/common'; +import {NavContentComponent} from './nav-content/nav-content.component'; + +// project import + +//import { NavContentComponent } from './nav-content/nav-content.component'; + +@Component({ + selector: 'app-navigation', + // imports: [ CommonModule], + templateUrl: './navigation.component.html', + imports: [ + NavContentComponent + ], + styleUrls: ['./navigation.component.scss'] +}) +export class NavigationComponent implements OnInit{ + + private document = inject(DOCUMENT); + + // media 1025 After Use Menu Open + NavCollapsedMob = output(); + + navCollapsedMob:boolean; + windowWidth: number | undefined = 1000; + + // Constructor + constructor() { + //window. + // this.windowWidth = !document ? 0 : !document.defaultView ? 0 : document.defaultView?.innerWidth; + //this.windowWidth = document.defaultView !== null? document.defaultView.innerWidth : 1000;//window.innerWidth; + this.navCollapsedMob = false; + } + + ngOnInit(): void { + this.windowWidth = this.document.defaultView?.innerWidth; + } + + // public method + // @Output() NavCollapse = new EventEmitter(); + @Output() NavCollapse = new EventEmitter(); + navCollapseMob() { + if (!!this.windowWidth && this.windowWidth < 1025) { + this.NavCollapsedMob.emit(); + } + } +} diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.ts b/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.ts new file mode 100644 index 0000000..1673226 --- /dev/null +++ b/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.ts @@ -0,0 +1,140 @@ +export interface NavigationItem { + id: string; + title: string; + type: 'item' | 'collapse' | 'group'; + translate?: string; + icon?: string; + hidden?: boolean; + url?: string; + classes?: string; + groupClasses?: string; + exactMatch?: boolean; + external?: boolean; + target?: boolean; + breadcrumbs?: boolean; + children?: NavigationItem[]; + link?: string; + description?: string; + path?: string; +} + +export const NavigationItems: NavigationItem[] = [ + { + id: 'admin', + title: 'Admin', + type: 'group', + icon: 'icon-navigation', + url: '/main/admin/welcome', + target: true, + children: [ + { + id: 'settings', + title: 'Settings', + type: 'item', + classes: 'nav-item', + url: '/main/admin/settings', + icon: 'dashboard', + // breadcrumbs: false + }, + { + id: 'system', + title: 'System', + type: 'item', + classes: 'nav-item', + url: '/main/admin/system', + icon: 'dashboard', + // breadcrumbs: false + } + ] + }/*, + { + id: 'authentication', + title: 'Authentication', + type: 'group', + icon: 'icon-navigation', + children: [ + { + id: 'login', + title: 'Login', + type: 'item', + classes: 'nav-item', + url: '/login', + icon: 'login', + target: true, + breadcrumbs: false + }, + { + id: 'register', + title: 'Register', + type: 'item', + classes: 'nav-item', + url: '/register', + icon: 'profile', + target: true, + breadcrumbs: false + }*/ + // ] + // } + /*, + { + id: 'utilities', + title: 'UI Components', + type: 'group', + icon: 'icon-navigation', + children: [ + { + id: 'typography', + title: 'Typography', + type: 'item', + classes: 'nav-item', + url: '/typography', + icon: 'font-size' + }, + { + id: 'color', + title: 'Colors', + type: 'item', + classes: 'nav-item', + url: '/color', + icon: 'bg-colors' + }, + { + id: 'ant-icons', + title: 'Ant Icons', + type: 'item', + classes: 'nav-item', + url: 'https://ant.design/components/icon', + icon: 'ant-design', + target: true, + external: true + } + ] + }, + + { + id: 'other', + title: 'Other', + type: 'group', + icon: 'icon-navigation', + children: [ + { + id: 'sample-page', + title: 'Sample Page', + type: 'item', + url: '/sample-page', + classes: 'nav-item', + icon: 'chrome' + }, + { + id: 'document', + title: 'Document', + type: 'item', + classes: 'nav-item', + url: 'https://codedthemes.gitbook.io/mantis-angular/', + icon: 'question', + target: true, + external: true + } + ] + }*/ +]; diff --git a/jambotron-ui/src/app/layouts/guest-layout/guest-layout.component.html b/jambotron-ui/src/app/layouts/guest-layout/guest-layout.component.html new file mode 100644 index 0000000..0680b43 --- /dev/null +++ b/jambotron-ui/src/app/layouts/guest-layout/guest-layout.component.html @@ -0,0 +1 @@ + diff --git a/jambotron-ui/src/app/layouts/guest-layout/guest-layout.component.scss b/jambotron-ui/src/app/layouts/guest-layout/guest-layout.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/layouts/guest-layout/guest-layout.component.ts b/jambotron-ui/src/app/layouts/guest-layout/guest-layout.component.ts new file mode 100644 index 0000000..7582ad4 --- /dev/null +++ b/jambotron-ui/src/app/layouts/guest-layout/guest-layout.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +@Component({ + selector: 'app-guest-layout', + imports: [RouterModule], + templateUrl: './guest-layout.component.html', + styleUrl: './guest-layout.component.scss' +}) +export class GuestLayoutComponent {} diff --git a/jambotron-ui/src/app/main-module/main.component/main.component.html b/jambotron-ui/src/app/main-module/main.component/main.component.html new file mode 100644 index 0000000..f60d02d --- /dev/null +++ b/jambotron-ui/src/app/main-module/main.component/main.component.html @@ -0,0 +1,65 @@ + + + + + + + @if (isLoggedIn) { + + } + + @if (showAdminBoard) { + + } + + @if (showAdminBoard) { + + } + + + @if (isLoggedIn) { + + } + @if (!isLoggedIn) { + + } + @if (isLoggedIn) { + + + + } + + + + + + +
    + +
    + diff --git a/jambotron-ui/src/app/main-module/main.component/main.component.scss b/jambotron-ui/src/app/main-module/main.component/main.component.scss new file mode 100644 index 0000000..713ba97 --- /dev/null +++ b/jambotron-ui/src/app/main-module/main.component/main.component.scss @@ -0,0 +1,15 @@ + +mat-toolbar{ + background-color: rgba(153,153,153,0.16); + backdrop-filter: blur(8px); +} +.menu-spacer { + flex: 1 1 auto; +} +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1000; // Ensure toolbar stays above other content +} diff --git a/jambotron-ui/src/app/main-module/main.component/main.component.spec.ts b/jambotron-ui/src/app/main-module/main.component/main.component.spec.ts new file mode 100644 index 0000000..7628b2d --- /dev/null +++ b/jambotron-ui/src/app/main-module/main.component/main.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MainComponent } from './main.component'; + +describe('MainComponent', () => { + let component: MainComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MainComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(MainComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/main-module/main.component/main.component.ts b/jambotron-ui/src/app/main-module/main.component/main.component.ts new file mode 100644 index 0000000..d17f946 --- /dev/null +++ b/jambotron-ui/src/app/main-module/main.component/main.component.ts @@ -0,0 +1,163 @@ +import {Component, CUSTOM_ELEMENTS_SCHEMA, inject} from '@angular/core'; +//import {NavigationComponent} from '../navigation/navigation.component'; +import {NgClass} from '@angular/common'; +import {NavigationComponent} from '../../layouts/admin-layout/navigation/navigation.component'; +import {RouterLink, RouterOutlet} from '@angular/router'; +import {BreadcrumbComponent} from '../../components/breadcrumb/breadcrumb.component'; +import {NavBarComponent} from '../../layouts/admin-layout/nav-bar/nav-bar.component'; +import {MatToolbar} from '@angular/material/toolbar'; +import {MatButton} from '@angular/material/button'; +import {IconDirective} from '@ant-design/icons-angular'; +import {MatDialog} from '@angular/material/dialog'; +import {Subscription} from 'rxjs'; +import {TokenStorageService} from '../../services/token-storage.service'; +import {AuthService} from '../../services/auth.service'; +import {EventBusService} from '../../_shared/event-bus.service'; +import {DialogComponent} from '../../components/dialog/dialog.component'; + +@Component({ + selector: 'app-main.component', + imports: [ + NavBarComponent, + MatToolbar, + MatButton, + RouterLink, + IconDirective, + RouterOutlet + ], + schemas: [ CUSTOM_ELEMENTS_SCHEMA ], + templateUrl: './main.component.html', + styleUrl: './main.component.scss' +}) +export class MainComponent { + // public props + navCollapsed: boolean = false; + navCollapsedMob: boolean = false; + + readonly dialog = inject(MatDialog); + //private authService = new AuthService(provideHttpClient()) + public dialogData : DialogData = {password: "", username: ""}; + + private roles: string[] = []; + isLoggedIn = false; + showAdminBoard = false; + showModeratorBoard = false; + username?: string; + + eventBusSub?: Subscription; + private errorMessage: any; + private isLoginFailed: boolean = false; + + private storageService: TokenStorageService = inject(TokenStorageService); + private authService: AuthService = inject(AuthService); + private eventBusService: EventBusService = inject(EventBusService); + + constructor( + + ) {} + + ngOnInit(): void { + this.isLoggedIn = this.storageService.isLoggedIn(); + + if (this.isLoggedIn) { + const user = this.storageService.getUser(); + this.roles = user.roles; + + this.showAdminBoard = true;//this.roles.includes('ROLE_ADMIN'); + this.showModeratorBoard = this.roles.includes('ROLE_MODERATOR'); + + this.username = user.username; + } + + this.eventBusSub = this.eventBusService.on('logout', () => { + this.logout(); + }); + } + + // public method + navMobClick() { + if (this.navCollapsedMob && !document.querySelector('app-navigation.pc-sidebar')?.classList.contains('mob-open')) { + this.navCollapsedMob = !this.navCollapsedMob; + setTimeout(() => { + this.navCollapsedMob = !this.navCollapsedMob; + }, 100); + } else { + this.navCollapsedMob = !this.navCollapsedMob; + } + if (document.querySelector('app-navigation.pc-sidebar')?.classList.contains('navbar-collapsed')) { + document.querySelector('app-navigation.pc-sidebar')?.classList.remove('navbar-collapsed'); + } + } + + handleKeyDown(event: KeyboardEvent): void { + if (event.key === 'Escape') { + this.closeMenu(); + } + } + + closeMenu() { + if (document.querySelector('app-navigation.pc-sidebar')?.classList.contains('mob-open')) { + document.querySelector('app-navigation.pc-sidebar')?.classList.remove('mob-open'); + } + } + + + logout(): void { + this.authService.logout().subscribe({ + next: res => { + console.log(res); + this.storageService.clean(); + + window.location.reload(); + }, + error: err => { + console.log(err); + } + }); + } + + openDialog(enterAnimationDuration: string, exitAnimationDuration: string) { + + let dialogRef = this.dialog.open(DialogComponent, { + width: '350px', + enterAnimationDuration, + exitAnimationDuration, + data: {username: this.dialogData.username, password: this.dialogData.password} + }); + + dialogRef.afterClosed().subscribe(result => { + console.log('The dialog was closed'); + if(result== null){ + return; + } + this.dialogData = result; + + this.authService.login(this.dialogData.username, this.dialogData.password).subscribe( + data => { + this.storageService.saveToken(data.accessToken); + this.storageService.saveUser(data); + + this.isLoginFailed = false; + this.isLoggedIn = true; + let user = this.storageService.getUser(); + this.roles = user.roles; + //this.username = user.username; + this.reloadPage(); + }, + err => { + this.errorMessage = err.error.message; + this.isLoginFailed = true; + } + ); + }); + + } + reloadPage(): void { + window.location.reload(); + } + +} +export interface DialogData { + username: string; + password: string; +} diff --git a/jambotron-ui/src/app/main-module/main.module.ts b/jambotron-ui/src/app/main-module/main.module.ts new file mode 100644 index 0000000..2685f6a --- /dev/null +++ b/jambotron-ui/src/app/main-module/main.module.ts @@ -0,0 +1,13 @@ +import {RouterModule} from '@angular/router'; +import {MainComponent} from './main.component/main.component'; +import {mainRouting} from './main.routing'; +import {NgModule} from '@angular/core'; + +@NgModule({ + declarations: [ + + ], + imports: [mainRouting, MainComponent], + exports: [RouterModule], +}) +export class MainModule {} diff --git a/jambotron-ui/src/app/main-module/main.routing.ts b/jambotron-ui/src/app/main-module/main.routing.ts new file mode 100644 index 0000000..3b921a0 --- /dev/null +++ b/jambotron-ui/src/app/main-module/main.routing.ts @@ -0,0 +1,44 @@ +import {RouterModule, Routes} from '@angular/router'; +import {HomeComponent} from '../components/home.component/home.component'; +import {MainComponent} from './main.component/main.component'; +import {TutorialsListComponent} from '../components/tutorials-list/tutorials-list.component'; +import {TutorialsComponent} from '../components/tutorials.component/tutorials.component'; +import {AddTutorialComponent} from '../components/add-tutorial/add-tutorial.component'; +import {RegisterComponent} from '../components/register/register.component'; +import {ProfileComponent} from '../components/profile/profile.component'; + +const MAIN_ROUTES: Routes =[ + { + path: '', + component: MainComponent, + children: [ + { + path: 'admin', + loadChildren: () => + import('../admin-module/admin.module').then((m) => m.AdminModule), + }, + { + path: 'home', + component: HomeComponent + }, + { + path: 'tutorials', + component: TutorialsComponent + }, + { + path: 'add-tutorial', + component: AddTutorialComponent + }, + { + path: 'register', + component : RegisterComponent + }, + { + path: 'profile', + component : ProfileComponent + } + ], + } +]; + +export const mainRouting = RouterModule.forChild(MAIN_ROUTES); diff --git a/jambotron-ui/src/app/models/Bean.ts b/jambotron-ui/src/app/models/Bean.ts new file mode 100644 index 0000000..a920cfd --- /dev/null +++ b/jambotron-ui/src/app/models/Bean.ts @@ -0,0 +1,7 @@ +export class Bean { + name?:string; + shortName?:string; + type?:string; + typeShortName?:string; + scope?:string; +} diff --git a/jambotron-ui/src/app/models/role.spec.ts b/jambotron-ui/src/app/models/role.spec.ts new file mode 100644 index 0000000..fc63902 --- /dev/null +++ b/jambotron-ui/src/app/models/role.spec.ts @@ -0,0 +1,7 @@ +import { Role } from './role'; + +describe('Role', () => { + it('should create an instance', () => { + expect(new Role()).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/models/role.ts b/jambotron-ui/src/app/models/role.ts new file mode 100644 index 0000000..be13639 --- /dev/null +++ b/jambotron-ui/src/app/models/role.ts @@ -0,0 +1,4 @@ +export class Role { + id?:any; + name?:string; +} diff --git a/jambotron-ui/src/app/models/setting.ts b/jambotron-ui/src/app/models/setting.ts new file mode 100644 index 0000000..d26db99 --- /dev/null +++ b/jambotron-ui/src/app/models/setting.ts @@ -0,0 +1,5 @@ +export class Setting { + id?:any; + name?:string; + value?:boolean; +} diff --git a/jambotron-ui/src/app/models/tutorial.model.spec.ts b/jambotron-ui/src/app/models/tutorial.model.spec.ts new file mode 100644 index 0000000..2250024 --- /dev/null +++ b/jambotron-ui/src/app/models/tutorial.model.spec.ts @@ -0,0 +1,7 @@ +import { Tutorial } from './tutorial.model'; + +describe('Tutorial', () => { + it('should create an instance', () => { + expect(new Tutorial()).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/models/tutorial.model.ts b/jambotron-ui/src/app/models/tutorial.model.ts new file mode 100644 index 0000000..66c6ce3 --- /dev/null +++ b/jambotron-ui/src/app/models/tutorial.model.ts @@ -0,0 +1,6 @@ +export class Tutorial { + id?: any; + title?: string; + description?: string; + published?: boolean; +} diff --git a/jambotron-ui/src/app/models/user.model.spec.ts b/jambotron-ui/src/app/models/user.model.spec.ts new file mode 100644 index 0000000..b98cb7e --- /dev/null +++ b/jambotron-ui/src/app/models/user.model.spec.ts @@ -0,0 +1,7 @@ +import { User } from './user.model'; + +describe('User', () => { + it('should create an instance', () => { + expect(new User()).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/models/user.model.ts b/jambotron-ui/src/app/models/user.model.ts new file mode 100644 index 0000000..86a49db --- /dev/null +++ b/jambotron-ui/src/app/models/user.model.ts @@ -0,0 +1,7 @@ +export class User { + id?:any; + username?:string; + email?:string; + password?:string; + roles?:any; +} diff --git a/jambotron-ui/src/app/services/auth.service.spec.ts b/jambotron-ui/src/app/services/auth.service.spec.ts new file mode 100644 index 0000000..f1251ca --- /dev/null +++ b/jambotron-ui/src/app/services/auth.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { AuthService } from './auth.service'; + +describe('AuthService', () => { + let service: AuthService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(AuthService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/services/auth.service.ts b/jambotron-ui/src/app/services/auth.service.ts new file mode 100644 index 0000000..e02cd4a --- /dev/null +++ b/jambotron-ui/src/app/services/auth.service.ts @@ -0,0 +1,35 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +const AUTH_API = 'http://localhost:8080/api/auth/'; + +const httpOptions = { + headers: new HttpHeaders({ 'Content-Type': 'application/json' }) +}; + +@Injectable({ + providedIn: 'root' +}) +export class AuthService { + constructor(private http: HttpClient) { } + + login(username: string, password: string): Observable { + return this.http.post(AUTH_API + 'signin', { + username, + password + }, httpOptions); + } + + register(username: string, email: string, password: string): Observable { + return this.http.post(AUTH_API + 'signup', { + username, + email, + password + }, httpOptions); + } + + logout(): Observable { + return this.http.post(AUTH_API + 'signout', { }, httpOptions); + } +} diff --git a/jambotron-ui/src/app/services/roles.service.spec.ts b/jambotron-ui/src/app/services/roles.service.spec.ts new file mode 100644 index 0000000..dc23ee7 --- /dev/null +++ b/jambotron-ui/src/app/services/roles.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { RolesService } from './roles.service'; + +describe('RolesService', () => { + let service: RolesService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(RolesService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/services/roles.service.ts b/jambotron-ui/src/app/services/roles.service.ts new file mode 100644 index 0000000..dbee6f9 --- /dev/null +++ b/jambotron-ui/src/app/services/roles.service.ts @@ -0,0 +1,20 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { Role } from '../models/role'; + +const API_URL = 'http://localhost:8080/api/roles'; + + +@Injectable({ + providedIn: 'root' +}) +export class RolesService { + + constructor(private http: HttpClient) {} + + getAllRoles(): Observable { + return this.http.get(API_URL); + } + +} diff --git a/jambotron-ui/src/app/services/system.service.spec.ts b/jambotron-ui/src/app/services/system.service.spec.ts new file mode 100644 index 0000000..8dbc519 --- /dev/null +++ b/jambotron-ui/src/app/services/system.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { SystemService } from './system.service'; + +describe('SystemService', () => { + let service: SystemService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(SystemService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/services/system.service.ts b/jambotron-ui/src/app/services/system.service.ts new file mode 100644 index 0000000..ffb606a --- /dev/null +++ b/jambotron-ui/src/app/services/system.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; +import {HttpClient} from '@angular/common/http'; +import {Observable} from 'rxjs'; +import {Tutorial} from '../models/tutorial.model'; +import {Bean} from '../models/Bean'; + +@Injectable({ + providedIn: 'root' +}) +export class SystemService { + + baseUrl : string = 'http://localhost:8080/api/system'; + constructor(private http: HttpClient) { } + + getAllBeans(): Observable { + return this.http.get(this.baseUrl+"/beans"); + } + + getCustomBeans(): Observable { + return this.http.get(this.baseUrl+"/beans/custom"); + } +} diff --git a/jambotron-ui/src/app/services/token-storage.service.spec.ts b/jambotron-ui/src/app/services/token-storage.service.spec.ts new file mode 100644 index 0000000..f2b1cd7 --- /dev/null +++ b/jambotron-ui/src/app/services/token-storage.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { TokenStorageService } from './token-storage.service'; + +describe('TokenStorageService', () => { + let service: TokenStorageService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(TokenStorageService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/services/token-storage.service.ts b/jambotron-ui/src/app/services/token-storage.service.ts new file mode 100644 index 0000000..9e3e747 --- /dev/null +++ b/jambotron-ui/src/app/services/token-storage.service.ts @@ -0,0 +1,57 @@ +import {inject, Injectable} from '@angular/core'; +import {DOCUMENT} from '@angular/common'; + +const TOKEN_KEY = 'auth-token'; +const USER_KEY = 'auth-user'; + +@Injectable({ + providedIn: 'root' +}) +export class TokenStorageService { + + private document = inject(DOCUMENT); + + constructor() { + + } + + signOut(): void { + this.document.defaultView?.sessionStorage.clear(); + } + + public saveToken(token: string): void { + document.defaultView?.sessionStorage.removeItem(TOKEN_KEY); + document.defaultView?.sessionStorage.setItem(TOKEN_KEY, token); + } + + public getToken(): string | null| undefined { + return document.defaultView?.sessionStorage.getItem(TOKEN_KEY); + } + + public saveUser(user: any): void { + document.defaultView?.sessionStorage.removeItem(USER_KEY); + document.defaultView?.sessionStorage.setItem(USER_KEY, JSON.stringify(user)); + } + + public getUser(): any { + const user = document.defaultView?.sessionStorage.getItem(USER_KEY); + if (user) { + return JSON.parse(user); + } + + return {}; + } + + clean(): void { + document.defaultView?.sessionStorage.clear(); + } + + public isLoggedIn(): boolean { + const user = this.document.defaultView?.sessionStorage?.getItem(USER_KEY); + if (user) { + return true; + } + + return false; + } +} diff --git a/jambotron-ui/src/app/services/tutorial.service.spec.ts b/jambotron-ui/src/app/services/tutorial.service.spec.ts new file mode 100644 index 0000000..2a5e71f --- /dev/null +++ b/jambotron-ui/src/app/services/tutorial.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { TutorialService } from './tutorial.service'; + +describe('TutorialService', () => { + let service: TutorialService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(TutorialService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/services/tutorial.service.ts b/jambotron-ui/src/app/services/tutorial.service.ts new file mode 100644 index 0000000..adbf3e4 --- /dev/null +++ b/jambotron-ui/src/app/services/tutorial.service.ts @@ -0,0 +1,42 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { Tutorial } from '../models/tutorial.model'; + +const baseUrl = 'http://localhost:8080/api/tutorials'; + +@Injectable({ + providedIn: 'root' +}) +export class TutorialService { + + constructor(private http: HttpClient) { } + + getAll(): Observable { + return this.http.get(baseUrl); + } + + get(id: any): Observable { + return this.http.get(`${baseUrl}/${id}`); + } + + create(data: any): Observable { + return this.http.post(baseUrl, data); + } + + update(id: any, data: any): Observable { + return this.http.put(`${baseUrl}/${id}`, data); + } + + delete(id: any): Observable { + return this.http.delete(`${baseUrl}/${id}`); + } + + deleteAll(): Observable { + return this.http.delete(baseUrl); + } + + findByTitle(title: any): Observable { + return this.http.get(`${baseUrl}?title=${title}`); + } +} \ No newline at end of file diff --git a/jambotron-ui/src/app/services/user.service.spec.ts b/jambotron-ui/src/app/services/user.service.spec.ts new file mode 100644 index 0000000..3f804c9 --- /dev/null +++ b/jambotron-ui/src/app/services/user.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { UserService } from './user.service'; + +describe('UserService', () => { + let service: UserService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(UserService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/services/user.service.ts b/jambotron-ui/src/app/services/user.service.ts new file mode 100644 index 0000000..21d6fa1 --- /dev/null +++ b/jambotron-ui/src/app/services/user.service.ts @@ -0,0 +1,31 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import {User} from "../models/user.model"; +import {Tutorial} from "../models/tutorial.model"; + +const API_URL = 'http://localhost:8080/api/users'; + +@Injectable({ + providedIn: 'root' +}) +export class UserService { + constructor(private http: HttpClient) { } + + getPublicContent(): Observable { + return this.http.get(API_URL + '/all', { responseType: 'text' }); + } + + getUserBoard(): Observable { + return this.http.get(API_URL + '/user', { responseType: 'text' }); + } + + getModeratorBoard(): Observable { + return this.http.get(API_URL + '/mod', { responseType: 'text' }); + } + + getAdminBoard(): Observable { + return this.http.get(API_URL); + } +} + diff --git a/jambotron-ui/src/assets/.gitkeep b/jambotron-ui/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/assets/images/authentication/facebook.svg b/jambotron-ui/src/assets/images/authentication/facebook.svg new file mode 100644 index 0000000..6d4fd87 --- /dev/null +++ b/jambotron-ui/src/assets/images/authentication/facebook.svg @@ -0,0 +1,3 @@ + + + diff --git a/jambotron-ui/src/assets/images/authentication/google.svg b/jambotron-ui/src/assets/images/authentication/google.svg new file mode 100644 index 0000000..bd30fd9 --- /dev/null +++ b/jambotron-ui/src/assets/images/authentication/google.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/jambotron-ui/src/assets/images/authentication/img-auth-bg.svg b/jambotron-ui/src/assets/images/authentication/img-auth-bg.svg new file mode 100644 index 0000000..8307093 --- /dev/null +++ b/jambotron-ui/src/assets/images/authentication/img-auth-bg.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/jambotron-ui/src/assets/images/authentication/twitter.svg b/jambotron-ui/src/assets/images/authentication/twitter.svg new file mode 100644 index 0000000..f868d36 --- /dev/null +++ b/jambotron-ui/src/assets/images/authentication/twitter.svg @@ -0,0 +1,3 @@ + + + diff --git a/jambotron-ui/src/assets/images/avatar-group.png b/jambotron-ui/src/assets/images/avatar-group.png new file mode 100644 index 0000000..9b08b0c Binary files /dev/null and b/jambotron-ui/src/assets/images/avatar-group.png differ diff --git a/jambotron-ui/src/assets/images/favicon.svg b/jambotron-ui/src/assets/images/favicon.svg new file mode 100644 index 0000000..3caf057 --- /dev/null +++ b/jambotron-ui/src/assets/images/favicon.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/jambotron-ui/src/assets/images/logo-dark.svg b/jambotron-ui/src/assets/images/logo-dark.svg new file mode 100644 index 0000000..f766a59 --- /dev/null +++ b/jambotron-ui/src/assets/images/logo-dark.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/jambotron-ui/src/assets/images/logo-icon.svg b/jambotron-ui/src/assets/images/logo-icon.svg new file mode 100644 index 0000000..133293d --- /dev/null +++ b/jambotron-ui/src/assets/images/logo-icon.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/jambotron-ui/src/assets/images/logo-white.svg b/jambotron-ui/src/assets/images/logo-white.svg new file mode 100644 index 0000000..5938737 --- /dev/null +++ b/jambotron-ui/src/assets/images/logo-white.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/jambotron-ui/src/assets/images/profile/card.png b/jambotron-ui/src/assets/images/profile/card.png new file mode 100644 index 0000000..065dd12 Binary files /dev/null and b/jambotron-ui/src/assets/images/profile/card.png differ diff --git a/jambotron-ui/src/assets/images/profile/img-profile-bottom.svg b/jambotron-ui/src/assets/images/profile/img-profile-bottom.svg new file mode 100644 index 0000000..98371c8 --- /dev/null +++ b/jambotron-ui/src/assets/images/profile/img-profile-bottom.svg @@ -0,0 +1,3 @@ + + + diff --git a/jambotron-ui/src/assets/images/profile/img-profile-top.svg b/jambotron-ui/src/assets/images/profile/img-profile-top.svg new file mode 100644 index 0000000..3d8e6b7 --- /dev/null +++ b/jambotron-ui/src/assets/images/profile/img-profile-top.svg @@ -0,0 +1,3 @@ + + + diff --git a/jambotron-ui/src/assets/images/user/avatar-1.jpg b/jambotron-ui/src/assets/images/user/avatar-1.jpg new file mode 100644 index 0000000..8009caa Binary files /dev/null and b/jambotron-ui/src/assets/images/user/avatar-1.jpg differ diff --git a/jambotron-ui/src/assets/images/user/avatar-2.jpg b/jambotron-ui/src/assets/images/user/avatar-2.jpg new file mode 100644 index 0000000..4c7f15d Binary files /dev/null and b/jambotron-ui/src/assets/images/user/avatar-2.jpg differ diff --git a/jambotron-ui/src/assets/images/user/avatar-3.jpg b/jambotron-ui/src/assets/images/user/avatar-3.jpg new file mode 100644 index 0000000..6af59c8 Binary files /dev/null and b/jambotron-ui/src/assets/images/user/avatar-3.jpg differ diff --git a/jambotron-ui/src/assets/images/user/avatar-4.jpg b/jambotron-ui/src/assets/images/user/avatar-4.jpg new file mode 100644 index 0000000..7df1e09 Binary files /dev/null and b/jambotron-ui/src/assets/images/user/avatar-4.jpg differ diff --git a/jambotron-ui/src/assets/images/user/avatar-5.jpg b/jambotron-ui/src/assets/images/user/avatar-5.jpg new file mode 100644 index 0000000..8bc2ca2 Binary files /dev/null and b/jambotron-ui/src/assets/images/user/avatar-5.jpg differ diff --git a/jambotron-ui/src/index.html b/jambotron-ui/src/index.html new file mode 100644 index 0000000..42711ff --- /dev/null +++ b/jambotron-ui/src/index.html @@ -0,0 +1,15 @@ + + + + + JambotronUi + + + + + + + + + + diff --git a/jambotron-ui/src/main.server.ts b/jambotron-ui/src/main.server.ts new file mode 100644 index 0000000..154ce1c --- /dev/null +++ b/jambotron-ui/src/main.server.ts @@ -0,0 +1,7 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { App } from './app/app'; +import { config } from './app/app.config.server'; + +const bootstrap = () => bootstrapApplication(App, config); + +export default bootstrap; diff --git a/jambotron-ui/src/main.ts b/jambotron-ui/src/main.ts new file mode 100644 index 0000000..5df75f9 --- /dev/null +++ b/jambotron-ui/src/main.ts @@ -0,0 +1,6 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { App } from './app/app'; + +bootstrapApplication(App, appConfig) + .catch((err) => console.error(err)); diff --git a/jambotron-ui/src/scss/bootstrap/bootstrap.scss b/jambotron-ui/src/scss/bootstrap/bootstrap.scss new file mode 100644 index 0000000..4f81fac --- /dev/null +++ b/jambotron-ui/src/scss/bootstrap/bootstrap.scss @@ -0,0 +1,34 @@ +@import '../../../node_modules/bootstrap/scss/maps'; +@import '../../../node_modules/bootstrap/scss/mixins'; +@import '../../../node_modules/bootstrap/scss/root'; +@import '../../../node_modules/bootstrap/scss/reboot'; +@import '../../../node_modules/bootstrap/scss/type'; +@import '../../../node_modules/bootstrap/scss/images'; +@import '../../../node_modules/bootstrap/scss/containers'; +@import '../../../node_modules/bootstrap/scss/grid'; +@import '../../../node_modules/bootstrap/scss/tables'; +@import '../../../node_modules/bootstrap/scss/forms'; +@import '../../../node_modules/bootstrap/scss/buttons'; +@import '../../../node_modules/bootstrap/scss/transitions'; +@import '../../../node_modules/bootstrap/scss/dropdown'; +@import '../../../node_modules/bootstrap/scss/button-group'; +@import '../../../node_modules/bootstrap/scss/nav'; +@import '../../../node_modules/bootstrap/scss/navbar'; +@import '../../../node_modules/bootstrap/scss/card'; +@import '../../../node_modules/bootstrap/scss/accordion'; +@import '../../../node_modules/bootstrap/scss/breadcrumb'; +@import '../../../node_modules/bootstrap/scss/pagination'; +@import '../../../node_modules/bootstrap/scss/badge'; +@import '../../../node_modules/bootstrap/scss/alert'; +@import '../../../node_modules/bootstrap/scss/progress'; +@import '../../../node_modules/bootstrap/scss/list-group'; +@import '../../../node_modules/bootstrap/scss/close'; +@import '../../../node_modules/bootstrap/scss/toasts'; +@import '../../../node_modules/bootstrap/scss/modal'; +@import '../../../node_modules/bootstrap/scss/tooltip'; +@import '../../../node_modules/bootstrap/scss/popover'; +@import '../../../node_modules/bootstrap/scss/carousel'; +@import '../../../node_modules/bootstrap/scss/spinners'; +@import '../../../node_modules/bootstrap/scss/offcanvas'; +@import '../../../node_modules/bootstrap/scss/placeholders'; +@import '../../../node_modules/bootstrap/scss/helpers'; diff --git a/jambotron-ui/src/scss/fonts/inter/Inter-Bold.woff b/jambotron-ui/src/scss/fonts/inter/Inter-Bold.woff new file mode 100644 index 0000000..61e1c25 Binary files /dev/null and b/jambotron-ui/src/scss/fonts/inter/Inter-Bold.woff differ diff --git a/jambotron-ui/src/scss/fonts/inter/Inter-Bold.woff2 b/jambotron-ui/src/scss/fonts/inter/Inter-Bold.woff2 new file mode 100644 index 0000000..6c401bb Binary files /dev/null and b/jambotron-ui/src/scss/fonts/inter/Inter-Bold.woff2 differ diff --git a/jambotron-ui/src/scss/fonts/inter/Inter-Medium.woff b/jambotron-ui/src/scss/fonts/inter/Inter-Medium.woff new file mode 100644 index 0000000..8c36a63 Binary files /dev/null and b/jambotron-ui/src/scss/fonts/inter/Inter-Medium.woff differ diff --git a/jambotron-ui/src/scss/fonts/inter/Inter-Medium.woff2 b/jambotron-ui/src/scss/fonts/inter/Inter-Medium.woff2 new file mode 100644 index 0000000..3b31d33 Binary files /dev/null and b/jambotron-ui/src/scss/fonts/inter/Inter-Medium.woff2 differ diff --git a/jambotron-ui/src/scss/fonts/inter/Inter-Regular.woff b/jambotron-ui/src/scss/fonts/inter/Inter-Regular.woff new file mode 100644 index 0000000..7d587c4 Binary files /dev/null and b/jambotron-ui/src/scss/fonts/inter/Inter-Regular.woff differ diff --git a/jambotron-ui/src/scss/fonts/inter/Inter-Regular.woff2 b/jambotron-ui/src/scss/fonts/inter/Inter-Regular.woff2 new file mode 100644 index 0000000..d5ffd2a Binary files /dev/null and b/jambotron-ui/src/scss/fonts/inter/Inter-Regular.woff2 differ diff --git a/jambotron-ui/src/scss/fonts/inter/Inter-SemiBold.woff b/jambotron-ui/src/scss/fonts/inter/Inter-SemiBold.woff new file mode 100644 index 0000000..99df06c Binary files /dev/null and b/jambotron-ui/src/scss/fonts/inter/Inter-SemiBold.woff differ diff --git a/jambotron-ui/src/scss/fonts/inter/Inter-SemiBold.woff2 b/jambotron-ui/src/scss/fonts/inter/Inter-SemiBold.woff2 new file mode 100644 index 0000000..df746af Binary files /dev/null and b/jambotron-ui/src/scss/fonts/inter/Inter-SemiBold.woff2 differ diff --git a/jambotron-ui/src/scss/fonts/inter/inter.css b/jambotron-ui/src/scss/fonts/inter/inter.css new file mode 100644 index 0000000..c0baa77 --- /dev/null +++ b/jambotron-ui/src/scss/fonts/inter/inter.css @@ -0,0 +1,39 @@ +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: + url('Inter-Regular.woff2?v=3.13') format('woff2'), + url('Inter-Regular.woff?v=3.13') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: + url('Inter-Medium.woff2?v=3.13') format('woff2'), + url('Inter-Medium.woff?v=3.13') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: + url('Inter-SemiBold.woff2?v=3.13') format('woff2'), + url('Inter-SemiBold.woff?v=3.13') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: + url('Inter-Bold.woff2?v=3.13') format('woff2'), + url('Inter-Bold.woff?v=3.13') format('woff'); +} diff --git a/jambotron-ui/src/scss/fonts/tabler-icons.min.css b/jambotron-ui/src/scss/fonts/tabler-icons.min.css new file mode 100644 index 0000000..e672ead --- /dev/null +++ b/jambotron-ui/src/scss/fonts/tabler-icons.min.css @@ -0,0 +1,3927 @@ +/*! + * Tabler Icons 1.41.1 by tabler - https://tabler.io + * License - https://github.com/tabler/tabler-icons/blob/master/LICENSE + */ +@font-face { + font-family: tabler-icons; + font-style: normal; + font-weight: 400; + src: url(tabler/tabler-icons.eot); + src: + url(tabler/tabler-icons.eot?#iefix) format('embedded-opentype'), + url(tabler/tabler-icons.woff2) format('woff2'), + url(tabler/tabler-icons.woff) format('woff'), + url(tabler/tabler-icons.ttf) format('truetype'), + url(tabler/tabler-icons.svg#tabler-icons) format('svg'); +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + @font-face { + font-family: tabler-icons; + src: url(tabler/tabler-icons.svg#tabler-icons) format('svg'); + } +} +.ti { + font-family: tabler-icons !important; + speak: none; + font-style: normal; + font-weight: 400; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.ti-2fa:before { + content: '\eca0'; +} +.ti-3d-cube-sphere:before { + content: '\ecd7'; +} +.ti-a-b:before { + content: '\ec36'; +} +.ti-access-point:before { + content: '\ed1b'; +} +.ti-access-point-off:before { + content: '\ed1a'; +} +.ti-accessible:before { + content: '\eba9'; +} +.ti-activity:before { + content: '\ed23'; +} +.ti-ad:before { + content: '\ea02'; +} +.ti-ad-2:before { + content: '\ef1f'; +} +.ti-adjustments:before { + content: '\ea03'; +} +.ti-adjustments-alt:before { + content: '\ec37'; +} +.ti-adjustments-horizontal:before { + content: '\ec38'; +} +.ti-aerial-lift:before { + content: '\edfe'; +} +.ti-affiliate:before { + content: '\edff'; +} +.ti-alarm:before { + content: '\ea04'; +} +.ti-alert-circle:before { + content: '\ea05'; +} +.ti-alert-octagon:before { + content: '\ecc6'; +} +.ti-alert-triangle:before { + content: '\ea06'; +} +.ti-alien:before { + content: '\ebde'; +} +.ti-align-center:before { + content: '\ea07'; +} +.ti-align-justified:before { + content: '\ea08'; +} +.ti-align-left:before { + content: '\ea09'; +} +.ti-align-right:before { + content: '\ea0a'; +} +.ti-ambulance:before { + content: '\ebf5'; +} +.ti-anchor:before { + content: '\eb76'; +} +.ti-angle:before { + content: '\ef20'; +} +.ti-antenna-bars-1:before { + content: '\ecc7'; +} +.ti-antenna-bars-2:before { + content: '\ecc8'; +} +.ti-antenna-bars-3:before { + content: '\ecc9'; +} +.ti-antenna-bars-4:before { + content: '\ecca'; +} +.ti-antenna-bars-5:before { + content: '\eccb'; +} +.ti-aperture:before { + content: '\eb58'; +} +.ti-apple:before { + content: '\ef21'; +} +.ti-apps:before { + content: '\ebb6'; +} +.ti-archive:before { + content: '\ea0b'; +} +.ti-arrow-back:before { + content: '\ea0c'; +} +.ti-arrow-back-up:before { + content: '\eb77'; +} +.ti-arrow-bar-down:before { + content: '\ea0d'; +} +.ti-arrow-bar-left:before { + content: '\ea0e'; +} +.ti-arrow-bar-right:before { + content: '\ea0f'; +} +.ti-arrow-bar-to-down:before { + content: '\ec88'; +} +.ti-arrow-bar-to-left:before { + content: '\ec89'; +} +.ti-arrow-bar-to-right:before { + content: '\ec8a'; +} +.ti-arrow-bar-to-up:before { + content: '\ec8b'; +} +.ti-arrow-bar-up:before { + content: '\ea10'; +} +.ti-arrow-big-down:before { + content: '\edda'; +} +.ti-arrow-big-left:before { + content: '\eddb'; +} +.ti-arrow-big-right:before { + content: '\eddc'; +} +.ti-arrow-big-top:before { + content: '\eddd'; +} +.ti-arrow-bottom-bar:before { + content: '\ed98'; +} +.ti-arrow-bottom-circle:before { + content: '\ed99'; +} +.ti-arrow-bottom-square:before { + content: '\ed9a'; +} +.ti-arrow-bottom-tail:before { + content: '\ed9b'; +} +.ti-arrow-down:before { + content: '\ea16'; +} +.ti-arrow-down-circle:before { + content: '\ea11'; +} +.ti-arrow-down-left:before { + content: '\ea13'; +} +.ti-arrow-down-left-circle:before { + content: '\ea12'; +} +.ti-arrow-down-right:before { + content: '\ea15'; +} +.ti-arrow-down-right-circle:before { + content: '\ea14'; +} +.ti-arrow-forward:before { + content: '\ea17'; +} +.ti-arrow-forward-up:before { + content: '\eb78'; +} +.ti-arrow-left:before { + content: '\ea19'; +} +.ti-arrow-left-bar:before { + content: '\ed9c'; +} +.ti-arrow-left-circle:before { + content: '\ea18'; +} +.ti-arrow-left-square:before { + content: '\ed9d'; +} +.ti-arrow-left-tail:before { + content: '\ed9e'; +} +.ti-arrow-loop-left:before { + content: '\ed9f'; +} +.ti-arrow-loop-right:before { + content: '\eda0'; +} +.ti-arrow-narrow-down:before { + content: '\ea1a'; +} +.ti-arrow-narrow-left:before { + content: '\ea1b'; +} +.ti-arrow-narrow-right:before { + content: '\ea1c'; +} +.ti-arrow-narrow-up:before { + content: '\ea1d'; +} +.ti-arrow-ramp-left:before { + content: '\ed3c'; +} +.ti-arrow-ramp-right:before { + content: '\ed3d'; +} +.ti-arrow-right:before { + content: '\ea1f'; +} +.ti-arrow-right-bar:before { + content: '\eda1'; +} +.ti-arrow-right-circle:before { + content: '\ea1e'; +} +.ti-arrow-right-square:before { + content: '\eda2'; +} +.ti-arrow-right-tail:before { + content: '\eda3'; +} +.ti-arrow-top-bar:before { + content: '\eda4'; +} +.ti-arrow-top-circle:before { + content: '\eda5'; +} +.ti-arrow-top-square:before { + content: '\eda6'; +} +.ti-arrow-top-tail:before { + content: '\eda7'; +} +.ti-arrow-up:before { + content: '\ea25'; +} +.ti-arrow-up-circle:before { + content: '\ea20'; +} +.ti-arrow-up-left:before { + content: '\ea22'; +} +.ti-arrow-up-left-circle:before { + content: '\ea21'; +} +.ti-arrow-up-right:before { + content: '\ea24'; +} +.ti-arrow-up-right-circle:before { + content: '\ea23'; +} +.ti-arrow-wave-left-down:before { + content: '\eda8'; +} +.ti-arrow-wave-left-up:before { + content: '\eda9'; +} +.ti-arrow-wave-right-down:before { + content: '\edaa'; +} +.ti-arrow-wave-right-up:before { + content: '\edab'; +} +.ti-arrows-diagonal:before { + content: '\ea27'; +} +.ti-arrows-diagonal-2:before { + content: '\ea26'; +} +.ti-arrows-double-ne-sw:before { + content: '\edde'; +} +.ti-arrows-double-nw-se:before { + content: '\eddf'; +} +.ti-arrows-double-se-nw:before { + content: '\ede0'; +} +.ti-arrows-double-sw-ne:before { + content: '\ede1'; +} +.ti-arrows-down:before { + content: '\edad'; +} +.ti-arrows-down-up:before { + content: '\edac'; +} +.ti-arrows-horizontal:before { + content: '\eb59'; +} +.ti-arrows-join:before { + content: '\edaf'; +} +.ti-arrows-join-2:before { + content: '\edae'; +} +.ti-arrows-left:before { + content: '\edb1'; +} +.ti-arrows-left-down:before { + content: '\ee00'; +} +.ti-arrows-left-right:before { + content: '\edb0'; +} +.ti-arrows-maximize:before { + content: '\ea28'; +} +.ti-arrows-minimize:before { + content: '\ea29'; +} +.ti-arrows-right:before { + content: '\edb3'; +} +.ti-arrows-right-down:before { + content: '\ee01'; +} +.ti-arrows-right-left:before { + content: '\edb2'; +} +.ti-arrows-sort:before { + content: '\eb5a'; +} +.ti-arrows-split:before { + content: '\edb5'; +} +.ti-arrows-split-2:before { + content: '\edb4'; +} +.ti-arrows-up:before { + content: '\edb7'; +} +.ti-arrows-up-down:before { + content: '\edb6'; +} +.ti-arrows-up-left:before { + content: '\ee02'; +} +.ti-arrows-up-right:before { + content: '\ee03'; +} +.ti-arrows-vertical:before { + content: '\eb5b'; +} +.ti-artboard:before { + content: '\ea2a'; +} +.ti-aspect-ratio:before { + content: '\ed30'; +} +.ti-at:before { + content: '\ea2b'; +} +.ti-atom:before { + content: '\eb79'; +} +.ti-atom-2:before { + content: '\ebdf'; +} +.ti-award:before { + content: '\ea2c'; +} +.ti-backhoe:before { + content: '\ed86'; +} +.ti-backspace:before { + content: '\ea2d'; +} +.ti-ball-american-football:before { + content: '\ee04'; +} +.ti-ball-basketball:before { + content: '\ec28'; +} +.ti-ball-bowling:before { + content: '\ec29'; +} +.ti-ball-football:before { + content: '\ee06'; +} +.ti-ball-football-off:before { + content: '\ee05'; +} +.ti-ball-tennis:before { + content: '\ec2a'; +} +.ti-ball-volleyball:before { + content: '\ec2b'; +} +.ti-ban:before { + content: '\ea2e'; +} +.ti-bandage:before { + content: '\eb7a'; +} +.ti-barcode:before { + content: '\ebc6'; +} +.ti-basket:before { + content: '\ebe1'; +} +.ti-battery:before { + content: '\ea34'; +} +.ti-battery-1:before { + content: '\ea2f'; +} +.ti-battery-2:before { + content: '\ea30'; +} +.ti-battery-3:before { + content: '\ea31'; +} +.ti-battery-4:before { + content: '\ea32'; +} +.ti-battery-automotive:before { + content: '\ee07'; +} +.ti-battery-charging:before { + content: '\ea33'; +} +.ti-battery-off:before { + content: '\ed1c'; +} +.ti-bed:before { + content: '\eb5c'; +} +.ti-bell:before { + content: '\ea35'; +} +.ti-bell-minus:before { + content: '\ede2'; +} +.ti-bell-off:before { + content: '\ece9'; +} +.ti-bell-plus:before { + content: '\ede3'; +} +.ti-bell-ringing:before { + content: '\ed07'; +} +.ti-bell-ringing-2:before { + content: '\ede4'; +} +.ti-bell-x:before { + content: '\ede5'; +} +.ti-bike:before { + content: '\ea36'; +} +.ti-binary:before { + content: '\ee08'; +} +.ti-biohazard:before { + content: '\ecb8'; +} +.ti-blockquote:before { + content: '\ee09'; +} +.ti-bluetooth:before { + content: '\ea37'; +} +.ti-bluetooth-connected:before { + content: '\ecea'; +} +.ti-bluetooth-off:before { + content: '\eceb'; +} +.ti-bold:before { + content: '\eb7b'; +} +.ti-bolt:before { + content: '\ea38'; +} +.ti-bolt-off:before { + content: '\ecec'; +} +.ti-bone:before { + content: '\edb8'; +} +.ti-book:before { + content: '\ea39'; +} +.ti-bookmark:before { + content: '\ea3a'; +} +.ti-bookmark-off:before { + content: '\eced'; +} +.ti-bookmarks:before { + content: '\ed08'; +} +.ti-border-all:before { + content: '\ea3b'; +} +.ti-border-bottom:before { + content: '\ea3c'; +} +.ti-border-horizontal:before { + content: '\ea3d'; +} +.ti-border-inner:before { + content: '\ea3e'; +} +.ti-border-left:before { + content: '\ea3f'; +} +.ti-border-none:before { + content: '\ea40'; +} +.ti-border-outer:before { + content: '\ea41'; +} +.ti-border-radius:before { + content: '\eb7c'; +} +.ti-border-right:before { + content: '\ea42'; +} +.ti-border-style:before { + content: '\ee0a'; +} +.ti-border-style-2:before { + content: '\ef22'; +} +.ti-border-top:before { + content: '\ea43'; +} +.ti-border-vertical:before { + content: '\ea44'; +} +.ti-bottle:before { + content: '\ef0b'; +} +.ti-box:before { + content: '\ea45'; +} +.ti-box-margin:before { + content: '\ee0b'; +} +.ti-box-model:before { + content: '\ee0c'; +} +.ti-box-model-2:before { + content: '\ef23'; +} +.ti-box-multiple:before { + content: '\ee17'; +} +.ti-box-multiple-0:before { + content: '\ee0d'; +} +.ti-box-multiple-1:before { + content: '\ee0e'; +} +.ti-box-multiple-2:before { + content: '\ee0f'; +} +.ti-box-multiple-3:before { + content: '\ee10'; +} +.ti-box-multiple-4:before { + content: '\ee11'; +} +.ti-box-multiple-5:before { + content: '\ee12'; +} +.ti-box-multiple-6:before { + content: '\ee13'; +} +.ti-box-multiple-7:before { + content: '\ee14'; +} +.ti-box-multiple-8:before { + content: '\ee15'; +} +.ti-box-multiple-9:before { + content: '\ee16'; +} +.ti-box-padding:before { + content: '\ee18'; +} +.ti-braces:before { + content: '\ebcc'; +} +.ti-brackets:before { + content: '\ebcd'; +} +.ti-brand-airbnb:before { + content: '\ed68'; +} +.ti-brand-android:before { + content: '\ec16'; +} +.ti-brand-apple:before { + content: '\ec17'; +} +.ti-brand-apple-arcade:before { + content: '\ed69'; +} +.ti-brand-appstore:before { + content: '\ed24'; +} +.ti-brand-asana:before { + content: '\edc5'; +} +.ti-brand-behance:before { + content: '\ec6e'; +} +.ti-brand-bing:before { + content: '\edc6'; +} +.ti-brand-bitbucket:before { + content: '\edc7'; +} +.ti-brand-booking:before { + content: '\edc8'; +} +.ti-brand-chrome:before { + content: '\ec18'; +} +.ti-brand-codepen:before { + content: '\ec6f'; +} +.ti-brand-codesandbox:before { + content: '\ed6a'; +} +.ti-brand-css3:before { + content: '\ed6b'; +} +.ti-brand-deviantart:before { + content: '\ecfb'; +} +.ti-brand-discord:before { + content: '\ece3'; +} +.ti-brand-disqus:before { + content: '\edc9'; +} +.ti-brand-docker:before { + content: '\edca'; +} +.ti-brand-dribbble:before { + content: '\ec19'; +} +.ti-brand-edge:before { + content: '\ecfc'; +} +.ti-brand-facebook:before { + content: '\ec1a'; +} +.ti-brand-figma:before { + content: '\ec93'; +} +.ti-brand-firefox:before { + content: '\ecfd'; +} +.ti-brand-flickr:before { + content: '\ecfe'; +} +.ti-brand-foursquare:before { + content: '\ecff'; +} +.ti-brand-framer:before { + content: '\ec1b'; +} +.ti-brand-github:before { + content: '\ec1c'; +} +.ti-brand-gitlab:before { + content: '\ec1d'; +} +.ti-brand-google:before { + content: '\ec1f'; +} +.ti-brand-google-analytics:before { + content: '\edcb'; +} +.ti-brand-google-drive:before { + content: '\ec1e'; +} +.ti-brand-google-play:before { + content: '\ed25'; +} +.ti-brand-gravatar:before { + content: '\edcc'; +} +.ti-brand-hipchat:before { + content: '\edcd'; +} +.ti-brand-html5:before { + content: '\ed6c'; +} +.ti-brand-instagram:before { + content: '\ec20'; +} +.ti-brand-javascript:before { + content: '\ef0c'; +} +.ti-brand-kickstarter:before { + content: '\edce'; +} +.ti-brand-kotlin:before { + content: '\ed6d'; +} +.ti-brand-linkedin:before { + content: '\ec8c'; +} +.ti-brand-medium:before { + content: '\ec70'; +} +.ti-brand-messenger:before { + content: '\ec71'; +} +.ti-brand-netflix:before { + content: '\edcf'; +} +.ti-brand-open-source:before { + content: '\edd0'; +} +.ti-brand-opera:before { + content: '\ec21'; +} +.ti-brand-pagekit:before { + content: '\edd1'; +} +.ti-brand-patreon:before { + content: '\edd2'; +} +.ti-brand-paypal:before { + content: '\ec22'; +} +.ti-brand-pinterest:before { + content: '\ec8d'; +} +.ti-brand-pocket:before { + content: '\ed00'; +} +.ti-brand-producthunt:before { + content: '\edd3'; +} +.ti-brand-python:before { + content: '\ed01'; +} +.ti-brand-reddit:before { + content: '\ec8e'; +} +.ti-brand-safari:before { + content: '\ec23'; +} +.ti-brand-sass:before { + content: '\edd4'; +} +.ti-brand-sentry:before { + content: '\edd5'; +} +.ti-brand-shazam:before { + content: '\edd6'; +} +.ti-brand-sketch:before { + content: '\ec24'; +} +.ti-brand-skype:before { + content: '\ed02'; +} +.ti-brand-slack:before { + content: '\ec72'; +} +.ti-brand-snapchat:before { + content: '\ec25'; +} +.ti-brand-soundcloud:before { + content: '\ed6e'; +} +.ti-brand-spotify:before { + content: '\ed03'; +} +.ti-brand-steam:before { + content: '\ed6f'; +} +.ti-brand-stripe:before { + content: '\edd7'; +} +.ti-brand-tabler:before { + content: '\ec8f'; +} +.ti-brand-tailwind:before { + content: '\eca1'; +} +.ti-brand-telegram:before { + content: '\ec26'; +} +.ti-brand-tidal:before { + content: '\ed70'; +} +.ti-brand-tiktok:before { + content: '\ec73'; +} +.ti-brand-tinder:before { + content: '\ed71'; +} +.ti-brand-tumblr:before { + content: '\ed04'; +} +.ti-brand-twitch:before { + content: '\ed05'; +} +.ti-brand-twitter:before { + content: '\ec27'; +} +.ti-brand-unsplash:before { + content: '\edd8'; +} +.ti-brand-vercel:before { + content: '\ef24'; +} +.ti-brand-vimeo:before { + content: '\ed06'; +} +.ti-brand-vk:before { + content: '\ed72'; +} +.ti-brand-whatsapp:before { + content: '\ec74'; +} +.ti-brand-windows:before { + content: '\ecd8'; +} +.ti-brand-yahoo:before { + content: '\ed73'; +} +.ti-brand-ycombinator:before { + content: '\edd9'; +} +.ti-brand-youtube:before { + content: '\ec90'; +} +.ti-briefcase:before { + content: '\ea46'; +} +.ti-brightness:before { + content: '\eb7f'; +} +.ti-brightness-2:before { + content: '\ee19'; +} +.ti-brightness-down:before { + content: '\eb7d'; +} +.ti-brightness-half:before { + content: '\ee1a'; +} +.ti-brightness-up:before { + content: '\eb7e'; +} +.ti-browser:before { + content: '\ebb7'; +} +.ti-brush:before { + content: '\ebb8'; +} +.ti-bucket:before { + content: '\ea47'; +} +.ti-bug:before { + content: '\ea48'; +} +.ti-building:before { + content: '\ea4f'; +} +.ti-building-arch:before { + content: '\ea49'; +} +.ti-building-bank:before { + content: '\ebe2'; +} +.ti-building-bridge:before { + content: '\ea4b'; +} +.ti-building-bridge-2:before { + content: '\ea4a'; +} +.ti-building-carousel:before { + content: '\ed87'; +} +.ti-building-castle:before { + content: '\ed88'; +} +.ti-building-church:before { + content: '\ea4c'; +} +.ti-building-community:before { + content: '\ebf6'; +} +.ti-building-cottage:before { + content: '\ee1b'; +} +.ti-building-factory:before { + content: '\ee1c'; +} +.ti-building-fortress:before { + content: '\ed89'; +} +.ti-building-hospital:before { + content: '\ea4d'; +} +.ti-building-lighthouse:before { + content: '\ed8a'; +} +.ti-building-monument:before { + content: '\ed26'; +} +.ti-building-pavilon:before { + content: '\ebf7'; +} +.ti-building-skyscraper:before { + content: '\ec39'; +} +.ti-building-store:before { + content: '\ea4e'; +} +.ti-building-warehouse:before { + content: '\ebe3'; +} +.ti-bulb:before { + content: '\ea51'; +} +.ti-bulb-off:before { + content: '\ea50'; +} +.ti-bulldozer:before { + content: '\ee1d'; +} +.ti-bus:before { + content: '\ebe4'; +} +.ti-businessplan:before { + content: '\ee1e'; +} +.ti-calculator:before { + content: '\eb80'; +} +.ti-calendar:before { + content: '\ea53'; +} +.ti-calendar-event:before { + content: '\ea52'; +} +.ti-calendar-minus:before { + content: '\ebb9'; +} +.ti-calendar-off:before { + content: '\ee1f'; +} +.ti-calendar-plus:before { + content: '\ebba'; +} +.ti-calendar-stats:before { + content: '\ee20'; +} +.ti-calendar-time:before { + content: '\ee21'; +} +.ti-camera:before { + content: '\ea54'; +} +.ti-camera-minus:before { + content: '\ec3a'; +} +.ti-camera-off:before { + content: '\ecee'; +} +.ti-camera-plus:before { + content: '\ec3b'; +} +.ti-camera-rotate:before { + content: '\ee22'; +} +.ti-camera-selfie:before { + content: '\ee23'; +} +.ti-candy:before { + content: '\ef0d'; +} +.ti-capture:before { + content: '\ec3c'; +} +.ti-car:before { + content: '\ebbb'; +} +.ti-car-crane:before { + content: '\ef25'; +} +.ti-caravan:before { + content: '\ec7c'; +} +.ti-cardboards:before { + content: '\ed74'; +} +.ti-caret-down:before { + content: '\eb5d'; +} +.ti-caret-left:before { + content: '\eb5e'; +} +.ti-caret-right:before { + content: '\eb5f'; +} +.ti-caret-up:before { + content: '\eb60'; +} +.ti-cash:before { + content: '\ea55'; +} +.ti-cash-banknote:before { + content: '\ee25'; +} +.ti-cash-banknote-off:before { + content: '\ee24'; +} +.ti-cast:before { + content: '\ea56'; +} +.ti-ce:before { + content: '\ed75'; +} +.ti-certificate:before { + content: '\ed76'; +} +.ti-charging-pile:before { + content: '\ee26'; +} +.ti-chart-arcs:before { + content: '\ee28'; +} +.ti-chart-arcs-3:before { + content: '\ee27'; +} +.ti-chart-area:before { + content: '\ea58'; +} +.ti-chart-area-line:before { + content: '\ea57'; +} +.ti-chart-arrows:before { + content: '\ee2a'; +} +.ti-chart-arrows-vertical:before { + content: '\ee29'; +} +.ti-chart-bar:before { + content: '\ea59'; +} +.ti-chart-bubble:before { + content: '\ec75'; +} +.ti-chart-candle:before { + content: '\ea5a'; +} +.ti-chart-circles:before { + content: '\ee2b'; +} +.ti-chart-donut:before { + content: '\ea5b'; +} +.ti-chart-donut-2:before { + content: '\ee2c'; +} +.ti-chart-donut-3:before { + content: '\ee2d'; +} +.ti-chart-donut-4:before { + content: '\ee2e'; +} +.ti-chart-dots:before { + content: '\ee2f'; +} +.ti-chart-infographic:before { + content: '\ee30'; +} +.ti-chart-line:before { + content: '\ea5c'; +} +.ti-chart-pie:before { + content: '\ea5d'; +} +.ti-chart-pie-2:before { + content: '\ee31'; +} +.ti-chart-pie-3:before { + content: '\ee32'; +} +.ti-chart-pie-4:before { + content: '\ee33'; +} +.ti-chart-radar:before { + content: '\ed77'; +} +.ti-check:before { + content: '\ea5e'; +} +.ti-checkbox:before { + content: '\eba6'; +} +.ti-checks:before { + content: '\ebaa'; +} +.ti-cheese:before { + content: '\ef26'; +} +.ti-chevron-down:before { + content: '\ea5f'; +} +.ti-chevron-down-left:before { + content: '\ed09'; +} +.ti-chevron-down-right:before { + content: '\ed0a'; +} +.ti-chevron-left:before { + content: '\ea60'; +} +.ti-chevron-right:before { + content: '\ea61'; +} +.ti-chevron-up:before { + content: '\ea62'; +} +.ti-chevron-up-left:before { + content: '\ed0b'; +} +.ti-chevron-up-right:before { + content: '\ed0c'; +} +.ti-chevrons-down:before { + content: '\ea63'; +} +.ti-chevrons-down-left:before { + content: '\ed0d'; +} +.ti-chevrons-down-right:before { + content: '\ed0e'; +} +.ti-chevrons-left:before { + content: '\ea64'; +} +.ti-chevrons-right:before { + content: '\ea65'; +} +.ti-chevrons-up:before { + content: '\ea66'; +} +.ti-chevrons-up-left:before { + content: '\ed0f'; +} +.ti-chevrons-up-right:before { + content: '\ed10'; +} +.ti-christmas-tree:before { + content: '\ed78'; +} +.ti-circle:before { + content: '\ea6b'; +} +.ti-circle-0:before { + content: '\ee34'; +} +.ti-circle-1:before { + content: '\ee35'; +} +.ti-circle-2:before { + content: '\ee36'; +} +.ti-circle-3:before { + content: '\ee37'; +} +.ti-circle-4:before { + content: '\ee38'; +} +.ti-circle-5:before { + content: '\ee39'; +} +.ti-circle-6:before { + content: '\ee3a'; +} +.ti-circle-7:before { + content: '\ee3b'; +} +.ti-circle-8:before { + content: '\ee3c'; +} +.ti-circle-9:before { + content: '\ee3d'; +} +.ti-circle-check:before { + content: '\ea67'; +} +.ti-circle-dashed:before { + content: '\ed27'; +} +.ti-circle-dotted:before { + content: '\ed28'; +} +.ti-circle-half:before { + content: '\ee3f'; +} +.ti-circle-half-vertical:before { + content: '\ee3e'; +} +.ti-circle-minus:before { + content: '\ea68'; +} +.ti-circle-off:before { + content: '\ee40'; +} +.ti-circle-plus:before { + content: '\ea69'; +} +.ti-circle-square:before { + content: '\ece4'; +} +.ti-circle-x:before { + content: '\ea6a'; +} +.ti-circles:before { + content: '\ece5'; +} +.ti-clear-all:before { + content: '\ee41'; +} +.ti-clear-formatting:before { + content: '\ebe5'; +} +.ti-click:before { + content: '\ebbc'; +} +.ti-clipboard:before { + content: '\ea6f'; +} +.ti-clipboard-check:before { + content: '\ea6c'; +} +.ti-clipboard-list:before { + content: '\ea6d'; +} +.ti-clipboard-x:before { + content: '\ea6e'; +} +.ti-clock:before { + content: '\ea70'; +} +.ti-cloud:before { + content: '\ea76'; +} +.ti-cloud-download:before { + content: '\ea71'; +} +.ti-cloud-fog:before { + content: '\ecd9'; +} +.ti-cloud-off:before { + content: '\ed3e'; +} +.ti-cloud-rain:before { + content: '\ea72'; +} +.ti-cloud-snow:before { + content: '\ea73'; +} +.ti-cloud-storm:before { + content: '\ea74'; +} +.ti-cloud-upload:before { + content: '\ea75'; +} +.ti-code:before { + content: '\ea77'; +} +.ti-code-minus:before { + content: '\ee42'; +} +.ti-code-plus:before { + content: '\ee43'; +} +.ti-coffee:before { + content: '\ef0e'; +} +.ti-coin:before { + content: '\eb82'; +} +.ti-color-picker:before { + content: '\ebe6'; +} +.ti-color-swatch:before { + content: '\eb61'; +} +.ti-column-insert-left:before { + content: '\ee44'; +} +.ti-column-insert-right:before { + content: '\ee45'; +} +.ti-columns:before { + content: '\eb83'; +} +.ti-comet:before { + content: '\ec76'; +} +.ti-command:before { + content: '\ea78'; +} +.ti-compass:before { + content: '\ea79'; +} +.ti-confetti:before { + content: '\ee46'; +} +.ti-container:before { + content: '\ee47'; +} +.ti-contrast:before { + content: '\ec4e'; +} +.ti-cookie:before { + content: '\ef0f'; +} +.ti-copy:before { + content: '\ea7a'; +} +.ti-copyleft:before { + content: '\ec3d'; +} +.ti-copyright:before { + content: '\ea7b'; +} +.ti-corner-down-left:before { + content: '\ea7c'; +} +.ti-corner-down-left-double:before { + content: '\ee48'; +} +.ti-corner-down-right:before { + content: '\ea7d'; +} +.ti-corner-down-right-double:before { + content: '\ee49'; +} +.ti-corner-left-down:before { + content: '\ea7e'; +} +.ti-corner-left-down-double:before { + content: '\ee4a'; +} +.ti-corner-left-up:before { + content: '\ea7f'; +} +.ti-corner-left-up-double:before { + content: '\ee4b'; +} +.ti-corner-right-down:before { + content: '\ea80'; +} +.ti-corner-right-down-double:before { + content: '\ee4c'; +} +.ti-corner-right-up:before { + content: '\ea81'; +} +.ti-corner-right-up-double:before { + content: '\ee4d'; +} +.ti-corner-up-left:before { + content: '\ea82'; +} +.ti-corner-up-left-double:before { + content: '\ee4e'; +} +.ti-corner-up-right:before { + content: '\ea83'; +} +.ti-corner-up-right-double:before { + content: '\ee4f'; +} +.ti-crane:before { + content: '\ef27'; +} +.ti-credit-card:before { + content: '\ea84'; +} +.ti-credit-card-off:before { + content: '\ed11'; +} +.ti-crop:before { + content: '\ea85'; +} +.ti-crosshair:before { + content: '\ec3e'; +} +.ti-crown:before { + content: '\ed12'; +} +.ti-crown-off:before { + content: '\ee50'; +} +.ti-cup:before { + content: '\ef28'; +} +.ti-curly-loop:before { + content: '\ecda'; +} +.ti-currency-bahraini:before { + content: '\ee51'; +} +.ti-currency-bath:before { + content: '\ee52'; +} +.ti-currency-bitcoin:before { + content: '\ebab'; +} +.ti-currency-cent:before { + content: '\ee53'; +} +.ti-currency-dinar:before { + content: '\ee54'; +} +.ti-currency-dirham:before { + content: '\ee55'; +} +.ti-currency-dollar:before { + content: '\eb84'; +} +.ti-currency-dollar-australian:before { + content: '\ee56'; +} +.ti-currency-dollar-canadian:before { + content: '\ee57'; +} +.ti-currency-dollar-singapore:before { + content: '\ee58'; +} +.ti-currency-ethereum:before { + content: '\ee59'; +} +.ti-currency-euro:before { + content: '\eb85'; +} +.ti-currency-forint:before { + content: '\ee5a'; +} +.ti-currency-frank:before { + content: '\ee5b'; +} +.ti-currency-krone-czech:before { + content: '\ee5c'; +} +.ti-currency-krone-danish:before { + content: '\ee5d'; +} +.ti-currency-krone-swedish:before { + content: '\ee5e'; +} +.ti-currency-leu:before { + content: '\ee5f'; +} +.ti-currency-lira:before { + content: '\ee60'; +} +.ti-currency-litecoin:before { + content: '\ee61'; +} +.ti-currency-naira:before { + content: '\ee62'; +} +.ti-currency-pound:before { + content: '\ebac'; +} +.ti-currency-real:before { + content: '\ee63'; +} +.ti-currency-renminbi:before { + content: '\ee64'; +} +.ti-currency-ripple:before { + content: '\ee65'; +} +.ti-currency-riyal:before { + content: '\ee66'; +} +.ti-currency-rubel:before { + content: '\ee67'; +} +.ti-currency-rupee:before { + content: '\ebad'; +} +.ti-currency-shekel:before { + content: '\ee68'; +} +.ti-currency-taka:before { + content: '\ee69'; +} +.ti-currency-tugrik:before { + content: '\ee6a'; +} +.ti-currency-won:before { + content: '\ee6b'; +} +.ti-currency-yen:before { + content: '\ebae'; +} +.ti-currency-zloty:before { + content: '\ee6c'; +} +.ti-current-location:before { + content: '\ecef'; +} +.ti-cursor-text:before { + content: '\ee6d'; +} +.ti-cut:before { + content: '\ea86'; +} +.ti-dashboard:before { + content: '\ea87'; +} +.ti-database:before { + content: '\ea88'; +} +.ti-database-export:before { + content: '\ee6e'; +} +.ti-database-import:before { + content: '\ee6f'; +} +.ti-database-off:before { + content: '\ee70'; +} +.ti-details:before { + content: '\ee71'; +} +.ti-device-analytics:before { + content: '\ee72'; +} +.ti-device-audio-tape:before { + content: '\ee73'; +} +.ti-device-cctv:before { + content: '\ee74'; +} +.ti-device-computer-camera:before { + content: '\ee76'; +} +.ti-device-computer-camera-off:before { + content: '\ee75'; +} +.ti-device-desktop:before { + content: '\ea89'; +} +.ti-device-desktop-analytics:before { + content: '\ee77'; +} +.ti-device-desktop-off:before { + content: '\ee78'; +} +.ti-device-floppy:before { + content: '\eb62'; +} +.ti-device-gamepad:before { + content: '\eb63'; +} +.ti-device-laptop:before { + content: '\eb64'; +} +.ti-device-mobile:before { + content: '\ea8a'; +} +.ti-device-mobile-message:before { + content: '\ee79'; +} +.ti-device-mobile-rotated:before { + content: '\ecdb'; +} +.ti-device-mobile-vibration:before { + content: '\eb86'; +} +.ti-device-speaker:before { + content: '\ea8b'; +} +.ti-device-tablet:before { + content: '\ea8c'; +} +.ti-device-tv:before { + content: '\ea8d'; +} +.ti-device-watch:before { + content: '\ebf9'; +} +.ti-devices:before { + content: '\eb87'; +} +.ti-devices-2:before { + content: '\ed29'; +} +.ti-devices-pc:before { + content: '\ee7a'; +} +.ti-diamond:before { + content: '\eb65'; +} +.ti-dice:before { + content: '\eb66'; +} +.ti-dimensions:before { + content: '\ee7b'; +} +.ti-direction:before { + content: '\ebfb'; +} +.ti-direction-horizontal:before { + content: '\ebfa'; +} +.ti-directions:before { + content: '\ea8e'; +} +.ti-disabled:before { + content: '\ea8f'; +} +.ti-disabled-2:before { + content: '\ebaf'; +} +.ti-disc:before { + content: '\ea90'; +} +.ti-discount:before { + content: '\ebbd'; +} +.ti-discount-2:before { + content: '\ee7c'; +} +.ti-divide:before { + content: '\ed5c'; +} +.ti-dna:before { + content: '\ee7d'; +} +.ti-dog-bowl:before { + content: '\ef29'; +} +.ti-dots:before { + content: '\ea95'; +} +.ti-dots-circle-horizontal:before { + content: '\ea91'; +} +.ti-dots-diagonal:before { + content: '\ea93'; +} +.ti-dots-diagonal-2:before { + content: '\ea92'; +} +.ti-dots-vertical:before { + content: '\ea94'; +} +.ti-download:before { + content: '\ea96'; +} +.ti-drag-drop:before { + content: '\eb89'; +} +.ti-drag-drop-2:before { + content: '\eb88'; +} +.ti-drone:before { + content: '\ed79'; +} +.ti-drone-off:before { + content: '\ee7e'; +} +.ti-droplet:before { + content: '\ea97'; +} +.ti-droplet-filled:before { + content: '\ee80'; +} +.ti-droplet-filled-2:before { + content: '\ee7f'; +} +.ti-droplet-half:before { + content: '\ee82'; +} +.ti-droplet-half-2:before { + content: '\ee81'; +} +.ti-droplet-off:before { + content: '\ee83'; +} +.ti-ear:before { + content: '\ebce'; +} +.ti-ear-off:before { + content: '\ee84'; +} +.ti-edit:before { + content: '\ea98'; +} +.ti-edit-circle:before { + content: '\ee85'; +} +.ti-egg:before { + content: '\eb8a'; +} +.ti-emphasis:before { + content: '\ebcf'; +} +.ti-equal:before { + content: '\ee87'; +} +.ti-equal-not:before { + content: '\ee86'; +} +.ti-eraser:before { + content: '\eb8b'; +} +.ti-exchange:before { + content: '\ebe7'; +} +.ti-exposure:before { + content: '\eb8c'; +} +.ti-external-link:before { + content: '\ea99'; +} +.ti-eye:before { + content: '\ea9a'; +} +.ti-eye-check:before { + content: '\ee88'; +} +.ti-eye-off:before { + content: '\ecf0'; +} +.ti-eyeglass:before { + content: '\ee8a'; +} +.ti-eyeglass-2:before { + content: '\ee89'; +} +.ti-face-id:before { + content: '\ea9b'; +} +.ti-fall:before { + content: '\ecb9'; +} +.ti-feather:before { + content: '\ee8b'; +} +.ti-fence:before { + content: '\ef2a'; +} +.ti-file:before { + content: '\eaa4'; +} +.ti-file-alert:before { + content: '\ede6'; +} +.ti-file-analytics:before { + content: '\ede7'; +} +.ti-file-certificate:before { + content: '\ed4d'; +} +.ti-file-check:before { + content: '\ea9c'; +} +.ti-file-code:before { + content: '\ebd0'; +} +.ti-file-code-2:before { + content: '\ede8'; +} +.ti-file-diff:before { + content: '\ecf1'; +} +.ti-file-dislike:before { + content: '\ed2a'; +} +.ti-file-download:before { + content: '\ea9d'; +} +.ti-file-export:before { + content: '\ede9'; +} +.ti-file-horizontal:before { + content: '\ebb0'; +} +.ti-file-import:before { + content: '\edea'; +} +.ti-file-info:before { + content: '\edec'; +} +.ti-file-invoice:before { + content: '\eb67'; +} +.ti-file-like:before { + content: '\ed2b'; +} +.ti-file-minus:before { + content: '\ea9e'; +} +.ti-file-music:before { + content: '\ea9f'; +} +.ti-file-off:before { + content: '\ecf2'; +} +.ti-file-phone:before { + content: '\ecdc'; +} +.ti-file-plus:before { + content: '\eaa0'; +} +.ti-file-report:before { + content: '\eded'; +} +.ti-file-search:before { + content: '\ed5d'; +} +.ti-file-shredder:before { + content: '\eaa1'; +} +.ti-file-symlink:before { + content: '\ed53'; +} +.ti-file-text:before { + content: '\eaa2'; +} +.ti-file-upload:before { + content: '\ec91'; +} +.ti-file-x:before { + content: '\eaa3'; +} +.ti-file-zip:before { + content: '\ed4e'; +} +.ti-files:before { + content: '\edef'; +} +.ti-files-off:before { + content: '\edee'; +} +.ti-filter:before { + content: '\eaa5'; +} +.ti-filter-off:before { + content: '\ed2c'; +} +.ti-fingerprint:before { + content: '\ebd1'; +} +.ti-firetruck:before { + content: '\ebe8'; +} +.ti-fish:before { + content: '\ef2b'; +} +.ti-flag:before { + content: '\eaa6'; +} +.ti-flag-2:before { + content: '\ee8c'; +} +.ti-flag-3:before { + content: '\ee8d'; +} +.ti-flame:before { + content: '\ec2c'; +} +.ti-flare:before { + content: '\ee8e'; +} +.ti-flask:before { + content: '\ebd2'; +} +.ti-flip-horizontal:before { + content: '\eaa7'; +} +.ti-flip-vertical:before { + content: '\eaa8'; +} +.ti-float-center:before { + content: '\ebb1'; +} +.ti-float-left:before { + content: '\ebb2'; +} +.ti-float-none:before { + content: '\ed13'; +} +.ti-float-right:before { + content: '\ebb3'; +} +.ti-focus:before { + content: '\eb8d'; +} +.ti-focus-2:before { + content: '\ebd3'; +} +.ti-fold:before { + content: '\ed56'; +} +.ti-fold-down:before { + content: '\ed54'; +} +.ti-fold-up:before { + content: '\ed55'; +} +.ti-folder:before { + content: '\eaad'; +} +.ti-folder-minus:before { + content: '\eaaa'; +} +.ti-folder-off:before { + content: '\ed14'; +} +.ti-folder-plus:before { + content: '\eaab'; +} +.ti-folder-x:before { + content: '\eaac'; +} +.ti-folders:before { + content: '\eaae'; +} +.ti-forbid:before { + content: '\ebd5'; +} +.ti-forbid-2:before { + content: '\ebd4'; +} +.ti-forklift:before { + content: '\ebe9'; +} +.ti-forms:before { + content: '\ee8f'; +} +.ti-frame:before { + content: '\eaaf'; +} +.ti-friends:before { + content: '\eab0'; +} +.ti-gas-station:before { + content: '\ec7d'; +} +.ti-gauge:before { + content: '\eab1'; +} +.ti-geometry:before { + content: '\ee90'; +} +.ti-ghost:before { + content: '\eb8e'; +} +.ti-gift:before { + content: '\eb68'; +} +.ti-git-branch:before { + content: '\eab2'; +} +.ti-git-commit:before { + content: '\eab3'; +} +.ti-git-compare:before { + content: '\eab4'; +} +.ti-git-fork:before { + content: '\eb8f'; +} +.ti-git-merge:before { + content: '\eab5'; +} +.ti-git-pull-request:before { + content: '\eab6'; +} +.ti-glass:before { + content: '\eab8'; +} +.ti-glass-full:before { + content: '\eab7'; +} +.ti-glass-off:before { + content: '\ee91'; +} +.ti-globe:before { + content: '\eab9'; +} +.ti-golf:before { + content: '\ed8c'; +} +.ti-gps:before { + content: '\ed7a'; +} +.ti-grain:before { + content: '\ee92'; +} +.ti-grid-dots:before { + content: '\eaba'; +} +.ti-grip-horizontal:before { + content: '\ec00'; +} +.ti-grip-vertical:before { + content: '\ec01'; +} +.ti-growth:before { + content: '\ee93'; +} +.ti-h-1:before { + content: '\ec94'; +} +.ti-h-2:before { + content: '\ec95'; +} +.ti-h-3:before { + content: '\ec96'; +} +.ti-h-4:before { + content: '\ec97'; +} +.ti-h-5:before { + content: '\ec98'; +} +.ti-h-6:before { + content: '\ec99'; +} +.ti-hand-finger:before { + content: '\ee94'; +} +.ti-hand-little-finger:before { + content: '\ee95'; +} +.ti-hand-middle-finger:before { + content: '\ec2d'; +} +.ti-hand-off:before { + content: '\ed15'; +} +.ti-hand-ring-finger:before { + content: '\ee96'; +} +.ti-hand-rock:before { + content: '\ee97'; +} +.ti-hand-stop:before { + content: '\ec2e'; +} +.ti-hand-three-fingers:before { + content: '\ee98'; +} +.ti-hand-two-fingers:before { + content: '\ee99'; +} +.ti-hanger:before { + content: '\ee9a'; +} +.ti-hash:before { + content: '\eabc'; +} +.ti-heading:before { + content: '\ee9b'; +} +.ti-headphones:before { + content: '\eabd'; +} +.ti-headphones-off:before { + content: '\ed1d'; +} +.ti-headset:before { + content: '\eb90'; +} +.ti-heart:before { + content: '\eabe'; +} +.ti-heart-broken:before { + content: '\ecba'; +} +.ti-helicopter:before { + content: '\ed8e'; +} +.ti-helicopter-landing:before { + content: '\ed8d'; +} +.ti-help:before { + content: '\eabf'; +} +.ti-hexagon:before { + content: '\ec02'; +} +.ti-hexagon-off:before { + content: '\ee9c'; +} +.ti-hierarchy:before { + content: '\ee9e'; +} +.ti-hierarchy-2:before { + content: '\ee9d'; +} +.ti-history:before { + content: '\ebea'; +} +.ti-home:before { + content: '\eac1'; +} +.ti-home-2:before { + content: '\eac0'; +} +.ti-ice-cream:before { + content: '\eac2'; +} +.ti-ice-cream-2:before { + content: '\ee9f'; +} +.ti-id:before { + content: '\eac3'; +} +.ti-inbox:before { + content: '\eac4'; +} +.ti-indent-decrease:before { + content: '\eb91'; +} +.ti-indent-increase:before { + content: '\eb92'; +} +.ti-infinity:before { + content: '\eb69'; +} +.ti-info-circle:before { + content: '\eac5'; +} +.ti-info-square:before { + content: '\eac6'; +} +.ti-italic:before { + content: '\eb93'; +} +.ti-jump-rope:before { + content: '\ed8f'; +} +.ti-karate:before { + content: '\ed32'; +} +.ti-key:before { + content: '\eac7'; +} +.ti-keyboard:before { + content: '\ebd6'; +} +.ti-keyboard-hide:before { + content: '\ec7e'; +} +.ti-keyboard-off:before { + content: '\eea0'; +} +.ti-keyboard-show:before { + content: '\ec7f'; +} +.ti-language:before { + content: '\ebbe'; +} +.ti-layers-difference:before { + content: '\eac8'; +} +.ti-layers-intersect:before { + content: '\eac9'; +} +.ti-layers-linked:before { + content: '\eea1'; +} +.ti-layers-subtract:before { + content: '\eaca'; +} +.ti-layers-union:before { + content: '\eacb'; +} +.ti-layout:before { + content: '\eadb'; +} +.ti-layout-2:before { + content: '\eacc'; +} +.ti-layout-align-bottom:before { + content: '\eacd'; +} +.ti-layout-align-center:before { + content: '\eace'; +} +.ti-layout-align-left:before { + content: '\eacf'; +} +.ti-layout-align-middle:before { + content: '\ead0'; +} +.ti-layout-align-right:before { + content: '\ead1'; +} +.ti-layout-align-top:before { + content: '\ead2'; +} +.ti-layout-bottombar:before { + content: '\ead3'; +} +.ti-layout-cards:before { + content: '\ec13'; +} +.ti-layout-columns:before { + content: '\ead4'; +} +.ti-layout-distribute-horizontal:before { + content: '\ead5'; +} +.ti-layout-distribute-vertical:before { + content: '\ead6'; +} +.ti-layout-grid:before { + content: '\edba'; +} +.ti-layout-grid-add:before { + content: '\edb9'; +} +.ti-layout-kanban:before { + content: '\ec3f'; +} +.ti-layout-list:before { + content: '\ec14'; +} +.ti-layout-navbar:before { + content: '\ead7'; +} +.ti-layout-rows:before { + content: '\ead8'; +} +.ti-layout-sidebar:before { + content: '\eada'; +} +.ti-layout-sidebar-right:before { + content: '\ead9'; +} +.ti-leaf:before { + content: '\ed4f'; +} +.ti-lego:before { + content: '\eadc'; +} +.ti-lemon:before { + content: '\ef10'; +} +.ti-letter-a:before { + content: '\ec50'; +} +.ti-letter-b:before { + content: '\ec51'; +} +.ti-letter-c:before { + content: '\ec52'; +} +.ti-letter-case:before { + content: '\eea5'; +} +.ti-letter-case-lower:before { + content: '\eea2'; +} +.ti-letter-case-toggle:before { + content: '\eea3'; +} +.ti-letter-case-upper:before { + content: '\eea4'; +} +.ti-letter-d:before { + content: '\ec53'; +} +.ti-letter-e:before { + content: '\ec54'; +} +.ti-letter-f:before { + content: '\ec55'; +} +.ti-letter-g:before { + content: '\ec56'; +} +.ti-letter-h:before { + content: '\ec57'; +} +.ti-letter-i:before { + content: '\ec58'; +} +.ti-letter-j:before { + content: '\ec59'; +} +.ti-letter-k:before { + content: '\ec5a'; +} +.ti-letter-l:before { + content: '\ec5b'; +} +.ti-letter-m:before { + content: '\ec5c'; +} +.ti-letter-n:before { + content: '\ec5d'; +} +.ti-letter-o:before { + content: '\ec5e'; +} +.ti-letter-p:before { + content: '\ec5f'; +} +.ti-letter-q:before { + content: '\ec60'; +} +.ti-letter-r:before { + content: '\ec61'; +} +.ti-letter-s:before { + content: '\ec62'; +} +.ti-letter-spacing:before { + content: '\eea6'; +} +.ti-letter-t:before { + content: '\ec63'; +} +.ti-letter-u:before { + content: '\ec64'; +} +.ti-letter-v:before { + content: '\ec65'; +} +.ti-letter-w:before { + content: '\ec66'; +} +.ti-letter-x:before { + content: '\ec67'; +} +.ti-letter-y:before { + content: '\ec68'; +} +.ti-letter-z:before { + content: '\ec69'; +} +.ti-letters-case:before { + content: '\ec6a'; +} +.ti-license:before { + content: '\ebc0'; +} +.ti-lifebuoy:before { + content: '\eadd'; +} +.ti-line:before { + content: '\ec40'; +} +.ti-line-dashed:before { + content: '\eea7'; +} +.ti-line-dotted:before { + content: '\eea8'; +} +.ti-line-height:before { + content: '\eb94'; +} +.ti-link:before { + content: '\eade'; +} +.ti-list:before { + content: '\eb6b'; +} +.ti-list-check:before { + content: '\eb6a'; +} +.ti-list-numbers:before { + content: '\ef11'; +} +.ti-list-search:before { + content: '\eea9'; +} +.ti-live-photo:before { + content: '\eadf'; +} +.ti-live-view:before { + content: '\ec6b'; +} +.ti-loader:before { + content: '\eca3'; +} +.ti-loader-quarter:before { + content: '\eca2'; +} +.ti-location:before { + content: '\eae0'; +} +.ti-lock:before { + content: '\eae2'; +} +.ti-lock-access:before { + content: '\eeaa'; +} +.ti-lock-off:before { + content: '\ed1e'; +} +.ti-lock-open:before { + content: '\eae1'; +} +.ti-login:before { + content: '\eba7'; +} +.ti-logout:before { + content: '\eba8'; +} +.ti-macro:before { + content: '\eeab'; +} +.ti-magnet:before { + content: '\eae3'; +} +.ti-mail:before { + content: '\eae5'; +} +.ti-mail-forward:before { + content: '\eeac'; +} +.ti-mail-opened:before { + content: '\eae4'; +} +.ti-mailbox:before { + content: '\eead'; +} +.ti-man:before { + content: '\eae6'; +} +.ti-manual-gearbox:before { + content: '\ed7b'; +} +.ti-map:before { + content: '\eae9'; +} +.ti-map-2:before { + content: '\eae7'; +} +.ti-map-pin:before { + content: '\eae8'; +} +.ti-map-pin-off:before { + content: '\ecf3'; +} +.ti-map-pins:before { + content: '\ed5e'; +} +.ti-markdown:before { + content: '\ec41'; +} +.ti-marquee:before { + content: '\ec77'; +} +.ti-marquee-2:before { + content: '\eeae'; +} +.ti-mars:before { + content: '\ec80'; +} +.ti-mask:before { + content: '\eeb0'; +} +.ti-mask-off:before { + content: '\eeaf'; +} +.ti-massage:before { + content: '\eeb1'; +} +.ti-math:before { + content: '\ebeb'; +} +.ti-math-function:before { + content: '\eeb2'; +} +.ti-math-symbols:before { + content: '\eeb3'; +} +.ti-maximize:before { + content: '\eaea'; +} +.ti-meat:before { + content: '\ef12'; +} +.ti-medal:before { + content: '\ec78'; +} +.ti-medical-cross:before { + content: '\ec2f'; +} +.ti-menu:before { + content: '\eaeb'; +} +.ti-menu-2:before { + content: '\ec42'; +} +.ti-message:before { + content: '\eaef'; +} +.ti-message-2:before { + content: '\eaec'; +} +.ti-message-circle:before { + content: '\eaed'; +} +.ti-message-circle-2:before { + content: '\ed3f'; +} +.ti-message-circle-off:before { + content: '\ed40'; +} +.ti-message-dots:before { + content: '\eaee'; +} +.ti-message-off:before { + content: '\ed41'; +} +.ti-message-plus:before { + content: '\ec9a'; +} +.ti-message-report:before { + content: '\ec9b'; +} +.ti-messages:before { + content: '\eb6c'; +} +.ti-messages-off:before { + content: '\ed42'; +} +.ti-microphone:before { + content: '\eaf0'; +} +.ti-microphone-2:before { + content: '\ef2c'; +} +.ti-microphone-off:before { + content: '\ed16'; +} +.ti-milk:before { + content: '\ef13'; +} +.ti-minimize:before { + content: '\eaf1'; +} +.ti-minus:before { + content: '\eaf2'; +} +.ti-minus-vertical:before { + content: '\eeb4'; +} +.ti-mist:before { + content: '\ec30'; +} +.ti-mood-boy:before { + content: '\ed2d'; +} +.ti-mood-confuzed:before { + content: '\eaf3'; +} +.ti-mood-crazy-happy:before { + content: '\ed90'; +} +.ti-mood-cry:before { + content: '\ecbb'; +} +.ti-mood-empty:before { + content: '\eeb5'; +} +.ti-mood-happy:before { + content: '\eaf4'; +} +.ti-mood-kid:before { + content: '\ec03'; +} +.ti-mood-neutral:before { + content: '\eaf5'; +} +.ti-mood-sad:before { + content: '\eaf6'; +} +.ti-mood-smile:before { + content: '\eaf7'; +} +.ti-mood-suprised:before { + content: '\ec04'; +} +.ti-mood-tongue:before { + content: '\eb95'; +} +.ti-moon:before { + content: '\eaf8'; +} +.ti-moon-2:before { + content: '\ece6'; +} +.ti-moon-stars:before { + content: '\ece7'; +} +.ti-moped:before { + content: '\ecbc'; +} +.ti-motorbike:before { + content: '\eeb6'; +} +.ti-mouse:before { + content: '\eaf9'; +} +.ti-movie:before { + content: '\eafa'; +} +.ti-mug:before { + content: '\eafb'; +} +.ti-mushroom:before { + content: '\ef14'; +} +.ti-music:before { + content: '\eafc'; +} +.ti-new-section:before { + content: '\ebc1'; +} +.ti-news:before { + content: '\eafd'; +} +.ti-nfc:before { + content: '\eeb7'; +} +.ti-note:before { + content: '\eb6d'; +} +.ti-notebook:before { + content: '\eb96'; +} +.ti-notes:before { + content: '\eb6e'; +} +.ti-notification:before { + content: '\eafe'; +} +.ti-number-0:before { + content: '\edf0'; +} +.ti-number-1:before { + content: '\edf1'; +} +.ti-number-2:before { + content: '\edf2'; +} +.ti-number-3:before { + content: '\edf3'; +} +.ti-number-4:before { + content: '\edf4'; +} +.ti-number-5:before { + content: '\edf5'; +} +.ti-number-6:before { + content: '\edf6'; +} +.ti-number-7:before { + content: '\edf7'; +} +.ti-number-8:before { + content: '\edf8'; +} +.ti-number-9:before { + content: '\edf9'; +} +.ti-octagon:before { + content: '\ecbd'; +} +.ti-octagon-off:before { + content: '\eeb8'; +} +.ti-old:before { + content: '\eeb9'; +} +.ti-olympics:before { + content: '\eeba'; +} +.ti-omega:before { + content: '\eb97'; +} +.ti-outlet:before { + content: '\ebd7'; +} +.ti-overline:before { + content: '\eebb'; +} +.ti-package:before { + content: '\eaff'; +} +.ti-pacman:before { + content: '\eebc'; +} +.ti-page-break:before { + content: '\ec81'; +} +.ti-paint:before { + content: '\eb00'; +} +.ti-palette:before { + content: '\eb01'; +} +.ti-panorama-horizontal:before { + content: '\ed33'; +} +.ti-panorama-vertical:before { + content: '\ed34'; +} +.ti-paperclip:before { + content: '\eb02'; +} +.ti-parachute:before { + content: '\ed7c'; +} +.ti-parentheses:before { + content: '\ebd8'; +} +.ti-parking:before { + content: '\eb03'; +} +.ti-peace:before { + content: '\ecbe'; +} +.ti-pencil:before { + content: '\eb04'; +} +.ti-pennant:before { + content: '\ed7d'; +} +.ti-pepper:before { + content: '\ef15'; +} +.ti-percentage:before { + content: '\ecf4'; +} +.ti-perspective:before { + content: '\eebd'; +} +.ti-phone:before { + content: '\eb09'; +} +.ti-phone-call:before { + content: '\eb05'; +} +.ti-phone-calling:before { + content: '\ec43'; +} +.ti-phone-check:before { + content: '\ec05'; +} +.ti-phone-incoming:before { + content: '\eb06'; +} +.ti-phone-off:before { + content: '\ecf5'; +} +.ti-phone-outgoing:before { + content: '\eb07'; +} +.ti-phone-pause:before { + content: '\eb08'; +} +.ti-phone-plus:before { + content: '\ec06'; +} +.ti-phone-x:before { + content: '\ec07'; +} +.ti-photo:before { + content: '\eb0a'; +} +.ti-photo-off:before { + content: '\ecf6'; +} +.ti-physotherapist:before { + content: '\eebe'; +} +.ti-picture-in-picture:before { + content: '\ed35'; +} +.ti-picture-in-picture-off:before { + content: '\ed43'; +} +.ti-picture-in-picture-on:before { + content: '\ed44'; +} +.ti-pill:before { + content: '\ec44'; +} +.ti-pin:before { + content: '\ec9c'; +} +.ti-pinned:before { + content: '\ed60'; +} +.ti-pinned-off:before { + content: '\ed5f'; +} +.ti-pizza:before { + content: '\edbb'; +} +.ti-plane:before { + content: '\eb6f'; +} +.ti-plane-arrival:before { + content: '\eb99'; +} +.ti-plane-departure:before { + content: '\eb9a'; +} +.ti-planet:before { + content: '\ec08'; +} +.ti-plant:before { + content: '\ed50'; +} +.ti-plant-2:before { + content: '\ed7e'; +} +.ti-play-card:before { + content: '\eebf'; +} +.ti-player-pause:before { + content: '\ed45'; +} +.ti-player-play:before { + content: '\ed46'; +} +.ti-player-record:before { + content: '\ed47'; +} +.ti-player-skip-back:before { + content: '\ed48'; +} +.ti-player-skip-forward:before { + content: '\ed49'; +} +.ti-player-stop:before { + content: '\ed4a'; +} +.ti-player-track-next:before { + content: '\ed4b'; +} +.ti-player-track-prev:before { + content: '\ed4c'; +} +.ti-playlist:before { + content: '\eec0'; +} +.ti-plug:before { + content: '\ebd9'; +} +.ti-plus:before { + content: '\eb0b'; +} +.ti-point:before { + content: '\eb0c'; +} +.ti-pokeball:before { + content: '\eec1'; +} +.ti-polaroid:before { + content: '\eec2'; +} +.ti-pool:before { + content: '\ed91'; +} +.ti-power:before { + content: '\eb0d'; +} +.ti-pray:before { + content: '\ecbf'; +} +.ti-presentation:before { + content: '\eb70'; +} +.ti-presentation-analytics:before { + content: '\eec3'; +} +.ti-printer:before { + content: '\eb0e'; +} +.ti-prompt:before { + content: '\eb0f'; +} +.ti-propeller:before { + content: '\eec4'; +} +.ti-puzzle:before { + content: '\eb10'; +} +.ti-pyramid:before { + content: '\eec5'; +} +.ti-qrcode:before { + content: '\eb11'; +} +.ti-question-mark:before { + content: '\ec9d'; +} +.ti-radio:before { + content: '\ef2d'; +} +.ti-radioactive:before { + content: '\ecc0'; +} +.ti-radius-bottom-left:before { + content: '\eec6'; +} +.ti-radius-bottom-right:before { + content: '\eec7'; +} +.ti-radius-top-left:before { + content: '\eec8'; +} +.ti-radius-top-right:before { + content: '\eec9'; +} +.ti-rainbow:before { + content: '\edbc'; +} +.ti-receipt:before { + content: '\edfd'; +} +.ti-receipt-2:before { + content: '\edfa'; +} +.ti-receipt-off:before { + content: '\edfb'; +} +.ti-receipt-refund:before { + content: '\edfc'; +} +.ti-receipt-tax:before { + content: '\edbd'; +} +.ti-recharging:before { + content: '\eeca'; +} +.ti-record-mail:before { + content: '\eb12'; +} +.ti-rectangle:before { + content: '\ed37'; +} +.ti-rectangle-vertical:before { + content: '\ed36'; +} +.ti-recycle:before { + content: '\eb9b'; +} +.ti-refresh:before { + content: '\eb13'; +} +.ti-refresh-alert:before { + content: '\ed57'; +} +.ti-registered:before { + content: '\eb14'; +} +.ti-relation-many-to-many:before { + content: '\ed7f'; +} +.ti-relation-one-to-many:before { + content: '\ed80'; +} +.ti-relation-one-to-one:before { + content: '\ed81'; +} +.ti-repeat:before { + content: '\eb72'; +} +.ti-repeat-once:before { + content: '\eb71'; +} +.ti-replace:before { + content: '\ebc7'; +} +.ti-report:before { + content: '\eece'; +} +.ti-report-analytics:before { + content: '\eecb'; +} +.ti-report-medical:before { + content: '\eecc'; +} +.ti-report-money:before { + content: '\eecd'; +} +.ti-resize:before { + content: '\eecf'; +} +.ti-ripple:before { + content: '\ed82'; +} +.ti-road-sign:before { + content: '\ecdd'; +} +.ti-rocket:before { + content: '\ec45'; +} +.ti-rotate:before { + content: '\eb16'; +} +.ti-rotate-2:before { + content: '\ebb4'; +} +.ti-rotate-clockwise:before { + content: '\eb15'; +} +.ti-rotate-clockwise-2:before { + content: '\ebb5'; +} +.ti-rotate-rectangle:before { + content: '\ec15'; +} +.ti-route:before { + content: '\eb17'; +} +.ti-router:before { + content: '\eb18'; +} +.ti-row-insert-bottom:before { + content: '\eed0'; +} +.ti-row-insert-top:before { + content: '\eed1'; +} +.ti-rss:before { + content: '\eb19'; +} +.ti-ruler:before { + content: '\eb1a'; +} +.ti-ruler-2:before { + content: '\eed2'; +} +.ti-run:before { + content: '\ec82'; +} +.ti-sailboat:before { + content: '\ec83'; +} +.ti-salt:before { + content: '\ef16'; +} +.ti-satellite:before { + content: '\eed3'; +} +.ti-sausage:before { + content: '\ef17'; +} +.ti-scale:before { + content: '\ebc2'; +} +.ti-scan:before { + content: '\ebc8'; +} +.ti-school:before { + content: '\ecf7'; +} +.ti-scissors:before { + content: '\eb1b'; +} +.ti-scooter:before { + content: '\ec6c'; +} +.ti-scooter-electric:before { + content: '\ecc1'; +} +.ti-screen-share:before { + content: '\ed18'; +} +.ti-screen-share-off:before { + content: '\ed17'; +} +.ti-scuba-mask:before { + content: '\eed4'; +} +.ti-search:before { + content: '\eb1c'; +} +.ti-section:before { + content: '\eed5'; +} +.ti-seeding:before { + content: '\ed51'; +} +.ti-select:before { + content: '\ec9e'; +} +.ti-selector:before { + content: '\eb1d'; +} +.ti-send:before { + content: '\eb1e'; +} +.ti-separator:before { + content: '\ebda'; +} +.ti-separator-horizontal:before { + content: '\ec79'; +} +.ti-separator-vertical:before { + content: '\ec7a'; +} +.ti-server:before { + content: '\eb1f'; +} +.ti-servicemark:before { + content: '\ec09'; +} +.ti-settings:before { + content: '\eb20'; +} +.ti-settings-automation:before { + content: '\eed6'; +} +.ti-shadow:before { + content: '\eed8'; +} +.ti-shadow-off:before { + content: '\eed7'; +} +.ti-shape:before { + content: '\eb9c'; +} +.ti-shape-2:before { + content: '\eed9'; +} +.ti-shape-3:before { + content: '\eeda'; +} +.ti-share:before { + content: '\eb21'; +} +.ti-shield:before { + content: '\eb24'; +} +.ti-shield-check:before { + content: '\eb22'; +} +.ti-shield-lock:before { + content: '\ed58'; +} +.ti-shield-off:before { + content: '\ecf8'; +} +.ti-shield-x:before { + content: '\eb23'; +} +.ti-ship:before { + content: '\ec84'; +} +.ti-shirt:before { + content: '\ec0a'; +} +.ti-shopping-cart:before { + content: '\eb25'; +} +.ti-shopping-cart-discount:before { + content: '\eedb'; +} +.ti-shopping-cart-off:before { + content: '\eedc'; +} +.ti-shopping-cart-plus:before { + content: '\eedd'; +} +.ti-shopping-cart-x:before { + content: '\eede'; +} +.ti-shredder:before { + content: '\eedf'; +} +.ti-signature:before { + content: '\eee0'; +} +.ti-sitemap:before { + content: '\eb9d'; +} +.ti-skateboard:before { + content: '\ecc2'; +} +.ti-slice:before { + content: '\ebdb'; +} +.ti-slideshow:before { + content: '\ebc9'; +} +.ti-smart-home:before { + content: '\ecde'; +} +.ti-smoking:before { + content: '\ecc4'; +} +.ti-smoking-no:before { + content: '\ecc3'; +} +.ti-snowflake:before { + content: '\ec0b'; +} +.ti-soccer-field:before { + content: '\ed92'; +} +.ti-social:before { + content: '\ebec'; +} +.ti-sock:before { + content: '\eee1'; +} +.ti-sort-ascending:before { + content: '\eb26'; +} +.ti-sort-ascending-2:before { + content: '\eee2'; +} +.ti-sort-ascending-letters:before { + content: '\ef18'; +} +.ti-sort-ascending-numbers:before { + content: '\ef19'; +} +.ti-sort-descending:before { + content: '\eb27'; +} +.ti-sort-descending-2:before { + content: '\eee3'; +} +.ti-sort-descending-letters:before { + content: '\ef1a'; +} +.ti-sort-descending-numbers:before { + content: '\ef1b'; +} +.ti-soup:before { + content: '\ef2e'; +} +.ti-space:before { + content: '\ec0c'; +} +.ti-speakerphone:before { + content: '\ed61'; +} +.ti-speedboat:before { + content: '\ed93'; +} +.ti-sport-billard:before { + content: '\eee4'; +} +.ti-square:before { + content: '\eb2c'; +} +.ti-square-0:before { + content: '\eee5'; +} +.ti-square-1:before { + content: '\eee6'; +} +.ti-square-2:before { + content: '\eee7'; +} +.ti-square-3:before { + content: '\eee8'; +} +.ti-square-4:before { + content: '\eee9'; +} +.ti-square-5:before { + content: '\eeea'; +} +.ti-square-6:before { + content: '\eeeb'; +} +.ti-square-7:before { + content: '\eeec'; +} +.ti-square-8:before { + content: '\eeed'; +} +.ti-square-9:before { + content: '\eeee'; +} +.ti-square-check:before { + content: '\eb28'; +} +.ti-square-dot:before { + content: '\ed59'; +} +.ti-square-forbid:before { + content: '\ed5b'; +} +.ti-square-forbid-2:before { + content: '\ed5a'; +} +.ti-square-minus:before { + content: '\eb29'; +} +.ti-square-off:before { + content: '\eeef'; +} +.ti-square-plus:before { + content: '\eb2a'; +} +.ti-square-root:before { + content: '\eef1'; +} +.ti-square-root-2:before { + content: '\eef0'; +} +.ti-square-rotated:before { + content: '\ecdf'; +} +.ti-square-rotated-off:before { + content: '\eef2'; +} +.ti-square-toggle:before { + content: '\eef4'; +} +.ti-square-toggle-horizontal:before { + content: '\eef3'; +} +.ti-square-x:before { + content: '\eb2b'; +} +.ti-squares-diagonal:before { + content: '\eef5'; +} +.ti-squares-filled:before { + content: '\eef6'; +} +.ti-stack:before { + content: '\eb2d'; +} +.ti-stack-2:before { + content: '\eef7'; +} +.ti-stairs:before { + content: '\eca6'; +} +.ti-stairs-down:before { + content: '\eca4'; +} +.ti-stairs-up:before { + content: '\eca5'; +} +.ti-star:before { + content: '\eb2e'; +} +.ti-star-half:before { + content: '\ed19'; +} +.ti-star-off:before { + content: '\ed62'; +} +.ti-stars:before { + content: '\ed38'; +} +.ti-steering-wheel:before { + content: '\ec7b'; +} +.ti-step-into:before { + content: '\ece0'; +} +.ti-step-out:before { + content: '\ece1'; +} +.ti-stethoscope:before { + content: '\edbe'; +} +.ti-sticker:before { + content: '\eb2f'; +} +.ti-strikethrough:before { + content: '\eb9e'; +} +.ti-submarine:before { + content: '\ed94'; +} +.ti-subscript:before { + content: '\eb9f'; +} +.ti-subtask:before { + content: '\ec9f'; +} +.ti-sum:before { + content: '\eb73'; +} +.ti-sun:before { + content: '\eb30'; +} +.ti-sun-off:before { + content: '\ed63'; +} +.ti-sunrise:before { + content: '\ef1c'; +} +.ti-sunset:before { + content: '\ec31'; +} +.ti-superscript:before { + content: '\eba0'; +} +.ti-swimming:before { + content: '\ec92'; +} +.ti-switch:before { + content: '\eb33'; +} +.ti-switch-2:before { + content: '\edbf'; +} +.ti-switch-3:before { + content: '\edc0'; +} +.ti-switch-horizontal:before { + content: '\eb31'; +} +.ti-switch-vertical:before { + content: '\eb32'; +} +.ti-table:before { + content: '\eba1'; +} +.ti-table-export:before { + content: '\eef8'; +} +.ti-table-import:before { + content: '\eef9'; +} +.ti-table-off:before { + content: '\eefa'; +} +.ti-tag:before { + content: '\eb34'; +} +.ti-tallymark-1:before { + content: '\ec46'; +} +.ti-tallymark-2:before { + content: '\ec47'; +} +.ti-tallymark-3:before { + content: '\ec48'; +} +.ti-tallymark-4:before { + content: '\ec49'; +} +.ti-tallymarks:before { + content: '\ec4a'; +} +.ti-tank:before { + content: '\ed95'; +} +.ti-target:before { + content: '\eb35'; +} +.ti-temperature:before { + content: '\eb38'; +} +.ti-temperature-celsius:before { + content: '\eb36'; +} +.ti-temperature-fahrenheit:before { + content: '\eb37'; +} +.ti-temperature-minus:before { + content: '\ebed'; +} +.ti-temperature-plus:before { + content: '\ebee'; +} +.ti-template:before { + content: '\eb39'; +} +.ti-tent:before { + content: '\eefb'; +} +.ti-terminal:before { + content: '\ebdc'; +} +.ti-terminal-2:before { + content: '\ebef'; +} +.ti-test-pipe:before { + content: '\eb3a'; +} +.ti-text-direction-ltr:before { + content: '\eefc'; +} +.ti-text-direction-rtl:before { + content: '\eefd'; +} +.ti-text-wrap:before { + content: '\ebdd'; +} +.ti-text-wrap-disabled:before { + content: '\eca7'; +} +.ti-thumb-down:before { + content: '\eb3b'; +} +.ti-thumb-up:before { + content: '\eb3c'; +} +.ti-ticket:before { + content: '\eb3d'; +} +.ti-tilt-shift:before { + content: '\eefe'; +} +.ti-tir:before { + content: '\ebf0'; +} +.ti-toggle-left:before { + content: '\eb3e'; +} +.ti-toggle-right:before { + content: '\eb3f'; +} +.ti-tool:before { + content: '\eb40'; +} +.ti-tools:before { + content: '\ebca'; +} +.ti-tools-kitchen:before { + content: '\ed64'; +} +.ti-tools-kitchen-2:before { + content: '\eeff'; +} +.ti-tornado:before { + content: '\ece2'; +} +.ti-tournament:before { + content: '\ecd0'; +} +.ti-track:before { + content: '\ef00'; +} +.ti-tractor:before { + content: '\ec0d'; +} +.ti-trademark:before { + content: '\ec0e'; +} +.ti-traffic-cone:before { + content: '\ec0f'; +} +.ti-traffic-lights:before { + content: '\ed39'; +} +.ti-train:before { + content: '\ed96'; +} +.ti-transfer-in:before { + content: '\ef2f'; +} +.ti-transfer-out:before { + content: '\ef30'; +} +.ti-trash:before { + content: '\eb41'; +} +.ti-trash-off:before { + content: '\ed65'; +} +.ti-tree:before { + content: '\ef01'; +} +.ti-trees:before { + content: '\ec10'; +} +.ti-trending-down:before { + content: '\eb42'; +} +.ti-trending-down-2:before { + content: '\edc1'; +} +.ti-trending-down-3:before { + content: '\edc2'; +} +.ti-trending-up:before { + content: '\eb43'; +} +.ti-trending-up-2:before { + content: '\edc3'; +} +.ti-trending-up-3:before { + content: '\edc4'; +} +.ti-triangle:before { + content: '\eb44'; +} +.ti-triangle-off:before { + content: '\ef02'; +} +.ti-triangle-square-circle:before { + content: '\ece8'; +} +.ti-trident:before { + content: '\ecc5'; +} +.ti-trophy:before { + content: '\eb45'; +} +.ti-truck:before { + content: '\ebc4'; +} +.ti-truck-delivery:before { + content: '\ec4b'; +} +.ti-truck-off:before { + content: '\ef03'; +} +.ti-truck-return:before { + content: '\ec4c'; +} +.ti-typography:before { + content: '\ebc5'; +} +.ti-umbrella:before { + content: '\ebf1'; +} +.ti-underline:before { + content: '\eba2'; +} +.ti-unlink:before { + content: '\eb46'; +} +.ti-upload:before { + content: '\eb47'; +} +.ti-urgent:before { + content: '\eb48'; +} +.ti-user:before { + content: '\eb4d'; +} +.ti-user-check:before { + content: '\eb49'; +} +.ti-user-exclamation:before { + content: '\ec12'; +} +.ti-user-minus:before { + content: '\eb4a'; +} +.ti-user-off:before { + content: '\ecf9'; +} +.ti-user-plus:before { + content: '\eb4b'; +} +.ti-user-x:before { + content: '\eb4c'; +} +.ti-users:before { + content: '\ebf2'; +} +.ti-vaccine:before { + content: '\ef04'; +} +.ti-variable:before { + content: '\ef05'; +} +.ti-vector:before { + content: '\eca9'; +} +.ti-vector-beizer-2:before { + content: '\ed3a'; +} +.ti-vector-bezier:before { + content: '\ef1d'; +} +.ti-vector-triangle:before { + content: '\eca8'; +} +.ti-venus:before { + content: '\ec86'; +} +.ti-versions:before { + content: '\ed52'; +} +.ti-video:before { + content: '\ed22'; +} +.ti-video-minus:before { + content: '\ed1f'; +} +.ti-video-off:before { + content: '\ed20'; +} +.ti-video-plus:before { + content: '\ed21'; +} +.ti-view-360:before { + content: '\ed84'; +} +.ti-viewfinder:before { + content: '\eb4e'; +} +.ti-viewport-narrow:before { + content: '\ebf3'; +} +.ti-viewport-wide:before { + content: '\ebf4'; +} +.ti-virus:before { + content: '\eb74'; +} +.ti-virus-off:before { + content: '\ed66'; +} +.ti-virus-search:before { + content: '\ed67'; +} +.ti-vocabulary:before { + content: '\ef1e'; +} +.ti-volume:before { + content: '\eb51'; +} +.ti-volume-2:before { + content: '\eb4f'; +} +.ti-volume-3:before { + content: '\eb50'; +} +.ti-walk:before { + content: '\ec87'; +} +.ti-wallet:before { + content: '\eb75'; +} +.ti-wand:before { + content: '\ebcb'; +} +.ti-wave-saw-tool:before { + content: '\ecd3'; +} +.ti-wave-sine:before { + content: '\ecd4'; +} +.ti-wave-square:before { + content: '\ecd5'; +} +.ti-wifi:before { + content: '\eb52'; +} +.ti-wifi-0:before { + content: '\eba3'; +} +.ti-wifi-1:before { + content: '\eba4'; +} +.ti-wifi-2:before { + content: '\eba5'; +} +.ti-wifi-off:before { + content: '\ecfa'; +} +.ti-wind:before { + content: '\ec34'; +} +.ti-windmill:before { + content: '\ed85'; +} +.ti-window:before { + content: '\ef06'; +} +.ti-wiper:before { + content: '\ecab'; +} +.ti-wiper-wash:before { + content: '\ecaa'; +} +.ti-woman:before { + content: '\eb53'; +} +.ti-world:before { + content: '\eb54'; +} +.ti-world-latitude:before { + content: '\ed2e'; +} +.ti-world-longitude:before { + content: '\ed2f'; +} +.ti-wrecking-ball:before { + content: '\ed97'; +} +.ti-writing:before { + content: '\ef08'; +} +.ti-writing-sign:before { + content: '\ef07'; +} +.ti-x:before { + content: '\eb55'; +} +.ti-yin-yang:before { + content: '\ec35'; +} +.ti-zodiac-aquarius:before { + content: '\ecac'; +} +.ti-zodiac-aries:before { + content: '\ecad'; +} +.ti-zodiac-cancer:before { + content: '\ecae'; +} +.ti-zodiac-capricorn:before { + content: '\ecaf'; +} +.ti-zodiac-gemini:before { + content: '\ecb0'; +} +.ti-zodiac-leo:before { + content: '\ecb1'; +} +.ti-zodiac-libra:before { + content: '\ecb2'; +} +.ti-zodiac-pisces:before { + content: '\ecb3'; +} +.ti-zodiac-sagittarius:before { + content: '\ecb4'; +} +.ti-zodiac-scorpio:before { + content: '\ecb5'; +} +.ti-zodiac-taurus:before { + content: '\ecb6'; +} +.ti-zodiac-virgo:before { + content: '\ecb7'; +} +.ti-zoom-cancel:before { + content: '\ec4d'; +} +.ti-zoom-check:before { + content: '\ef09'; +} +.ti-zoom-in:before { + content: '\eb56'; +} +.ti-zoom-money:before { + content: '\ef0a'; +} +.ti-zoom-out:before { + content: '\eb57'; +} +.ti-zoom-question:before { + content: '\edeb'; +} diff --git a/jambotron-ui/src/scss/fonts/tabler/tabler-icons.eot b/jambotron-ui/src/scss/fonts/tabler/tabler-icons.eot new file mode 100644 index 0000000..a3b3e8c Binary files /dev/null and b/jambotron-ui/src/scss/fonts/tabler/tabler-icons.eot differ diff --git a/jambotron-ui/src/scss/fonts/tabler/tabler-icons.svg b/jambotron-ui/src/scss/fonts/tabler/tabler-icons.svg new file mode 100644 index 0000000..5c004e4 --- /dev/null +++ b/jambotron-ui/src/scss/fonts/tabler/tabler-icons.svg @@ -0,0 +1,3906 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jambotron-ui/src/scss/fonts/tabler/tabler-icons.ttf b/jambotron-ui/src/scss/fonts/tabler/tabler-icons.ttf new file mode 100644 index 0000000..8863a30 Binary files /dev/null and b/jambotron-ui/src/scss/fonts/tabler/tabler-icons.ttf differ diff --git a/jambotron-ui/src/scss/fonts/tabler/tabler-icons.woff b/jambotron-ui/src/scss/fonts/tabler/tabler-icons.woff new file mode 100644 index 0000000..c78f044 Binary files /dev/null and b/jambotron-ui/src/scss/fonts/tabler/tabler-icons.woff differ diff --git a/jambotron-ui/src/scss/fonts/tabler/tabler-icons.woff2 b/jambotron-ui/src/scss/fonts/tabler/tabler-icons.woff2 new file mode 100644 index 0000000..1df7554 Binary files /dev/null and b/jambotron-ui/src/scss/fonts/tabler/tabler-icons.woff2 differ diff --git a/jambotron-ui/src/scss/settings/bootstrap-variables.scss b/jambotron-ui/src/scss/settings/bootstrap-variables.scss new file mode 100644 index 0000000..fe737ad --- /dev/null +++ b/jambotron-ui/src/scss/settings/bootstrap-variables.scss @@ -0,0 +1,735 @@ +// Variables +// +// Variables should follow the `$component-state-property-size` formula for +// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs. + +// Color system + +$grays: ( + '100': $gray-100, + '200': $gray-200, + '300': $gray-300, + '400': $gray-400, + '500': $gray-500, + '600': $gray-600, + '700': $gray-700, + '800': $gray-800, + '900': $gray-900 +); + +// scss-docs-start colors-map +$colors: ( + 'blue': $blue, + 'indigo': $indigo, + 'purple': $purple, + 'pink': $pink, + 'red': $red, + 'orange': $orange, + 'yellow': $yellow, + 'green': $green, + 'teal': $teal, + 'cyan': $cyan, + 'black': $black, + 'white': $white, + 'gray': $gray-600, + 'gray-dark': $gray-800 +); +// scss-docs-end colors-map + +$primary: $blue; // change +$secondary: $secondary; // change +$success: $green; // change +$info: $cyan; // change +$warning: $yellow; // change +$danger: $red; // change +$light: $gray-100; // change +$dark: $dark; // change + +// scss-docs-start theme-colors-map +$theme-colors: ( + 'primary': $primary, + 'secondary': $secondary, + 'success': $success, + 'info': $info, + 'warning': $warning, + 'danger': $danger, + 'light': $light, + 'dark': $dark +); +// scss-docs-end theme-colors-map + +// scss-docs-start theme-colors-rgb +$theme-colors-rgb: map-loop($theme-colors, to-rgb, '$value'); +// scss-docs-end theme-colors-rgb + +// The contrast ratio to reach against white, to determine if color changes from "light" to "dark". Acceptable values for WCAG 2.0 are 3, 4.5 and 7. +// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast +$min-contrast-ratio: 1.55; + +// Customize the light and dark text colors for use in our color contrast function. +$color-contrast-dark: $body-color; +$color-contrast-light: $white; + +// fusv-disable +$blues: ( + 'blue-100': $blue-100, + 'blue-200': $blue-200, + 'blue-300': $blue-300, + 'blue-400': $blue-400, + 'blue-500': $blue-500, + 'blue-600': $blue-600, + 'blue-700': $blue-700, + 'blue-800': $blue-800, + 'blue-900': $blue-900 +); + +// Characters which are escaped by the escape-svg function +$escaped-characters: (('<', '%3c'), ('>', '%3e'), ('#', '%23'), ('(', '%28'), (')', '%29')); + +$variable-prefix: bs-; // Deprecated in v5.2.0 for the shorter `$prefix` +$prefix: $variable-prefix; + +// Gradient + +$gradient: linear-gradient(180deg, rgba($white, 0.15), rgba($white, 0)); + +// Spacing +$spacer: 1rem; +$spacers: ( + 0: 0, + 1: $spacer * 0.25, + 2: $spacer * 0.5, + 3: $spacer, + 4: $spacer * 1.5, + 5: $spacer * 3 +); +// scss-docs-end spacer-variables-maps + +// Position +// +// Define the edge positioning anchors of the position utilities. + +// scss-docs-start position-map +$position-values: ( + 0: 0, + 50: 50%, + 100: 100% +); +// scss-docs-end position-map + +// Body +// +// Settings for the `` element. +$body-bg: #fafafb; // change +$body-color: $gray-900; // change +$body-text-align: null; + +// Links +// +// Style anchor elements. + +$link-color: $primary; +$link-decoration: none; +$link-shade-percentage: 20%; +$link-hover-color: shift-color($link-color, $link-shade-percentage); +$link-hover-decoration: underline; + +$stretched-link-pseudo-element: after; +$stretched-link-z-index: 1; + +// Paragraphs +// +// Style p element. + +$paragraph-margin-bottom: 1rem; + +// Grid breakpoints +// +// Define the minimum dimensions at which your layout will change, +// adapting to different screen sizes, for use in media queries. + +// scss-docs-start grid-breakpoints +$grid-breakpoints: ( + xs: 0, + sm: 576px, + md: 768px, + lg: 992px, + xl: 1200px, + xxl: 1400px +); +// scss-docs-end grid-breakpoints + +@include _assert-ascending($grid-breakpoints, '$grid-breakpoints'); +@include _assert-starts-at-zero($grid-breakpoints, '$grid-breakpoints'); + +// Grid containers +// +// Define the maximum width of `.container` for different screen sizes. + +// scss-docs-start container-max-widths +$container-max-widths: ( + sm: 540px, + md: 720px, + lg: 960px, + xl: 1140px, + xxl: 1320px +); +// scss-docs-end container-max-widths + +@include _assert-ascending($container-max-widths, '$container-max-widths'); + +// Grid columns +// +// Set the number of columns and specify the width of the gutters. + +$grid-columns: 12; +$grid-gutter-width: 1.5rem; +$grid-row-columns: 6; + +// Container padding + +$container-padding-x: $grid-gutter-width; + +// Components +// +// Define common padding and border radius sizes and more. + +// scss-docs-start border-variables +$border-width: 1px; +$border-widths: ( + 0: 0, + 1: 1px, + 2: 2px, + 3: 3px, + 4: 4px, + 5: 5px +); + +$border-style: solid; +$border-color: #e6ebf1; +$border-color-translucent: rgba($black, 0.175); + +$border-radius: 4px; // change +$border-radius-lg: 6px; // change +$border-radius-sm: 2px; // change +$border-radius-pill: 50rem; +// scss-docs-end border-radius-variables + +$box-shadow-sm: 0 0.125rem 0.25rem rgba($black, 0.075); +$box-shadow: 0 0.5rem 1rem rgba($black, 0.15); +$box-shadow-lg: 0 1rem 3rem rgba($black, 0.175); +$box-shadow-inset: inset 0 1px 2px rgba($black, 0.075); + +$component-active-color: $white; +$component-active-bg: var(--bs-primary); + +// scss-docs-start caret-variables +$caret-width: 0.3em; +$caret-vertical-align: $caret-width * 0.85; +$caret-spacing: $caret-width * 0.85; +// scss-docs-end caret-variables + +$transition-base: all 0.2s ease-in-out; +$transition-fade: opacity 0.15s linear; +// scss-docs-start collapse-transition +$transition-collapse: height 0.35s ease; +$transition-collapse-width: width 0.35s ease; + +// stylelint-disable function-disallowed-list +// scss-docs-start aspect-ratios +$aspect-ratios: ( + '1x1': 100%, + '4x3': calc(3 / 4 * 100%), + '16x9': calc(9 / 16 * 100%), + '21x9': calc(9 / 21 * 100%) +); +// scss-docs-end aspect-ratios +// stylelint-enable function-disallowed-list + +// Typography +// +// Font, line-height, and color for body text, headings, and more. + +// stylelint-disable value-keyword-case +$font-family-sans-serif: 'Public Sans', sans-serif; // change +$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; +// stylelint-enable value-keyword-case +$font-family-base: var(--#{$variable-prefix}font-sans-serif); +$font-family-code: var(--#{$variable-prefix}font-monospace); + +$font-size-root: null; +$font-size-base: 0.875rem; +$font-size-sm: $font-size-base * 0.875; +$font-size-lg: $font-size-base * 1.25; +$font-weight-lighter: lighter; +$font-weight-light: 300; +$font-weight-normal: 400; +$font-weight-bold: 700; +$font-weight-bolder: bolder; + +$font-weight-base: $font-weight-normal; +$line-height-base: 1.5; +$line-height-sm: 1.25; +$line-height-lg: 2; + +$h1-font-size: 40px; // change +$h2-font-size: 30px; // change +$h3-font-size: 24px; // change +$h4-font-size: 20px; // change +$h5-font-size: 16px; // change +$h6-font-size: 14px; // change + +// scss-docs-start font-sizes +$font-sizes: ( + 1: $h1-font-size, + 2: $h2-font-size, + 3: $h3-font-size, + 4: $h4-font-size, + 5: $h5-font-size, + 6: $h6-font-size +); +// scss-docs-end font-sizes + +// scss-docs-end font-sizes +h1, +h2 { + font-weight: 700; +} + +$headings-margin-bottom: calc($spacer / 2); +$headings-font-family: null; +$headings-font-style: null; +$headings-font-weight: 600; +$headings-line-height: 1.2; +$headings-color: #262626; +$label-color: $gray-900; + +// scss-docs-start display-headings +$display-font-sizes: ( + 1: 5rem, + 2: 4.5rem, + 3: 4rem, + 4: 3.5rem, + 5: 3rem, + 6: 2.5rem +); + +$display-font-weight: 300; +$display-line-height: $headings-line-height; +// scss-docs-end display-headings + +$lead-font-size: $font-size-base * 1.25; +$lead-font-weight: 300; + +$small-font-size: 80%; + +$sub-sup-font-size: 0.75em; + +$text-muted: $gray-600; + +$hr-margin-y: $spacer; +$hr-color: inherit; +$hr-height: $border-width; +$hr-opacity: 0.13; + +$legend-margin-bottom: 0.5rem; +$legend-font-size: 1.5rem; +$legend-font-weight: null; + +$mark-padding: 0.2em; + +$dt-font-weight: $font-weight-bold; + +$nested-kbd-font-weight: $font-weight-bold; + +$list-inline-padding: 0.5rem; + +$mark-bg: #fcf8e3; +// Tables +// +// Customizes the `.table` component with basic values, each used across all table variations. +// scss-docs-start table-variables +$table-cell-padding-y: 0.9rem; +$table-cell-padding-x: 0.75rem; +$table-cell-padding-y-sm: 0.3rem; +$table-cell-padding-x-sm: 0.3rem; + +$table-cell-vertical-align: top; + +$table-color: $body-color; +$table-bg: transparent; +$table-accent-bg: transparent; + +$table-th-font-weight: null; +$table-striped-color: $table-color; +$table-striped-bg-factor: 0.05; +$table-striped-bg: rgba($black, $table-striped-bg-factor); + +$table-active-color: $table-color; +$table-active-bg-factor: 0.1; +$table-active-bg: rgba($black, $table-active-bg-factor); + +$table-hover-color: $table-color; +$table-hover-bg-factor: 0.02; +$table-hover-bg: rgba($primary, $table-hover-bg-factor); + +$table-border-factor: 0.1; +$table-border-width: $border-width; +$table-border-color: $border-color; + +$table-striped-order: odd; + +$table-group-seperator-color: currentColor; +$table-caption-color: $text-muted; + +$table-bg-scale: -80%; + +$table-variants: ( + 'primary': shift-color($primary, $table-bg-scale), + 'secondary': shift-color($secondary, $table-bg-scale), + 'success': shift-color($success, $table-bg-scale), + 'info': shift-color($info, $table-bg-scale), + 'warning': shift-color($warning, $table-bg-scale), + 'danger': shift-color($danger, $table-bg-scale), + 'light': $light, + 'dark': $dark +); +// scss-docs-end table-variables + +// Buttons + Forms +// +// Shared variables that are reassigned to `$input-` and `$btn-` specific variables. + +$input-btn-padding-y: 0.407rem; +$input-btn-padding-x: 1rem; +$input-btn-font-family: null; +$input-btn-font-size: 0.875rem; +$input-btn-line-height: $line-height-base; + +$input-btn-focus-width: 0.2rem; +$input-btn-focus-color-opacity: 0.25; +$input-btn-focus-color: rgba($component-active-bg, $input-btn-focus-color-opacity); +$input-btn-focus-blur: 0; +$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color; + +$input-btn-padding-y-sm: 0.25rem; +$input-btn-padding-x-sm: 0.5rem; +$input-btn-font-size-sm: $font-size-sm; + +$input-btn-padding-y-lg: 1rem; +$input-btn-padding-x-lg: 1.3rem; +$input-btn-font-size-lg: $font-size-lg; + +$input-btn-border-width: 1px; + +// Buttons +// +// For each of Bootstrap's buttons, define text, background, and border color. + +$btn-padding-y: $input-btn-padding-y; +$btn-padding-x: $input-btn-padding-x; +$btn-font-family: $input-btn-font-family; +$btn-font-size: $input-btn-font-size; +$btn-line-height: $input-btn-line-height; +$btn-white-space: null; // Set to `nowrap` to prevent text wrapping + +$btn-padding-y-sm: $input-btn-padding-y-sm; +$btn-padding-x-sm: $input-btn-padding-x-sm; +$btn-font-size-sm: $input-btn-font-size-sm; + +$btn-padding-y-lg: $input-btn-padding-y-lg; +$btn-padding-x-lg: $input-btn-padding-x-lg; +$btn-font-size-lg: $input-btn-font-size-lg; + +$btn-border-width: $input-btn-border-width; + +$btn-font-weight: 400; +$btn-box-shadow: + inset 0 1px 0 rgba($white, 0.15), + 0 1px 1px rgba($black, 0.075); +$btn-focus-width: $input-btn-focus-width; +$btn-focus-box-shadow: $input-btn-focus-box-shadow; +$btn-disabled-opacity: 0.65; +$btn-active-box-shadow: inset 0 3px 5px rgba($black, 0.125); + +$btn-link-color: $link-color; +$btn-link-hover-color: $link-hover-color; +$btn-link-disabled-color: $gray-600; + +// Allows for customizing button radius independently from global border radius +$btn-border-radius: 4px; +$btn-border-radius-sm: 2px; +$btn-border-radius-lg: 6px; + +$btn-transition: + color 0.15s ease-in-out, + background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out; + +$btn-hover-bg-shade-amount: 15%; +$btn-hover-bg-tint-amount: 15%; +$btn-hover-border-shade-amount: 20%; +$btn-hover-border-tint-amount: 10%; +$btn-active-bg-shade-amount: 20%; +$btn-active-bg-tint-amount: 20%; +$btn-active-border-shade-amount: 25%; +$btn-active-border-tint-amount: 10%; +// scss-docs-end btn-variables + +// Forms + +$form-text-margin-top: 0.25rem; +$form-text-font-size: $small-font-size; +$form-text-font-style: null; +$form-text-font-weight: null; +$form-text-color: $text-muted; + +$form-label-margin-bottom: 0.5rem; +$form-label-font-size: null; +$form-label-font-style: null; +$form-label-font-weight: null; +$form-label-color: $label-color; + +$input-padding-y: 0.65rem; +$input-padding-x: 0.75rem; +$input-font-family: $input-btn-font-family; +$input-font-size: $input-btn-font-size; +$input-font-weight: $font-weight-base; +$input-line-height: $input-btn-line-height; + +$input-padding-y-sm: 0.375rem; +$input-padding-x-sm: 0.7rem; +$input-font-size-sm: $input-btn-font-size-sm; + +$input-padding-y-lg: 0.775rem; +$input-padding-x-lg: 0.85rem; +$input-font-size-lg: $input-btn-font-size-lg; + +$input-bg: $white; +$input-disabled-bg: $gray-200; +$input-disabled-border-color: null; + +$input-color: $body-color; +$input-border-color: $gray-400; +$input-border-width: 1px; +$input-box-shadow: inset 0 1px 1px rgba($black, 0.075); + +$input-border-radius: 4px; +$input-border-radius-sm: 2px; +$input-border-radius-lg: 6px; + +$input-focus-bg: $input-bg; +$input-focus-border-color: $primary; +$input-focus-color: $input-color; +$input-focus-width: $input-btn-focus-width; +$input-focus-box-shadow: 0 0 0 2px rgba($component-active-bg, 0.2); + +$input-placeholder-color: $gray-600; +$input-plaintext-color: $headings-color; + +$input-height-border: $input-border-width * 2; + +$input-height-inner: add($input-line-height * 1em, calc($input-padding-y * 2)); +$input-height-inner-half: add($input-line-height * 0.5em, $input-padding-y); +$input-height-inner-quarter: add($input-line-height * 0.25em, calc($input-padding-y / 2)); + +$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)); +$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)); +$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)); + +$input-transition: + border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out; + +$form-color-width: 3rem; +// scss-docs-end form-input-variables + +// scss-docs-end form-validation-states + +// Z-index master list + +$zindex-dropdown: 1026; +$zindex-sticky: 1020; +$zindex-fixed: 1030; + +// Navs + +$nav-link-padding-y: 0.5rem; +$nav-link-padding-x: 1rem; +$nav-link-font-size: null; +$nav-link-font-weight: null; +$nav-link-color: null; +$nav-link-hover-color: null; +$nav-link-transition: + color 0.15s ease-in-out, + background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out; +$nav-link-disabled-color: $gray-600; + +$nav-tabs-border-color: $gray-300; +$nav-tabs-border-width: $border-width; +$nav-tabs-border-radius: $border-radius; +$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color; +$nav-tabs-link-active-color: $gray-700; +$nav-tabs-link-active-bg: $white; // change +$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg; + +$nav-pills-border-radius: $border-radius; +$nav-pills-link-active-color: $component-active-color; +$nav-pills-link-active-bg: $component-active-bg; + +// Navbar + +$navbar-padding-y: calc(#{$spacer} / 2); +$navbar-padding-x: null; + +$navbar-nav-link-padding-x: 0.5rem; + +$navbar-brand-font-size: $font-size-lg; +// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link +$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2; +$navbar-brand-height: $navbar-brand-font-size * $line-height-base; +$navbar-brand-padding-y: calc(($nav-link-height - $navbar-brand-height) / 2); +$navbar-brand-margin-end: 1rem; + +$navbar-toggler-padding-y: 0.25rem; +$navbar-toggler-padding-x: 0.75rem; +$navbar-toggler-font-size: $font-size-lg; +$navbar-toggler-border-radius: $btn-border-radius; +$navbar-toggler-focus-width: $btn-focus-width; +$navbar-toggler-transition: box-shadow 0.15s ease-in-out; + +$navbar-dark-color: rgba($white, 0.9); +$navbar-dark-hover-color: rgba($white, 0.75); +$navbar-dark-active-color: $white; +$navbar-dark-disabled-color: rgba($white, 0.25); +$navbar-dark-toggler-border-color: rgba($white, 0.1); + +$navbar-light-color: rgba($black, 0.55); +$navbar-light-hover-color: rgba($black, 0.7); +$navbar-light-active-color: rgba($black, 0.9); +$navbar-light-disabled-color: rgba($black, 0.3); +$navbar-light-toggler-border-color: rgba($black, 0.1); + +$navbar-light-brand-color: $navbar-light-active-color; +$navbar-light-brand-hover-color: $navbar-light-active-color; +$navbar-dark-brand-color: $navbar-dark-active-color; +$navbar-dark-brand-hover-color: $navbar-dark-active-color; + +// Dropdowns +$dropdown-font-size: $font-size-base; +$dropdown-color: $body-color; +$dropdown-bg: $white; + +// scss-docs-start placeholders +$placeholder-opacity-max: 0.5; +$placeholder-opacity-min: 0.2; +// scss-docs-end placeholders + +// Cards +$card-spacer-y: 25px; // change +$card-spacer-x: 25px; // change +$card-title-spacer-y: calc($spacer / 2); +$card-border-width: 1px; // change +$card-border-radius: $border-radius; +$card-border-color: $border-color; +$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}); +$card-cap-padding-y: 25px; +$card-cap-padding-x: 25px; +$card-cap-bg: transparent; +$card-cap-color: null; +$card-height: null; +$card-color: null; +$card-bg: $white; + +$card-img-overlay-padding: 1.25rem; + +$card-group-margin: calc($grid-gutter-width / 2); + +// Badges +$badge-font-size: 0.75em; +$badge-font-weight: 500; +$badge-color: $white; +$badge-padding-y: 0.35em; +$badge-padding-x: 0.5em; +$badge-border-radius: 2px; + +// List group + +$list-group-color: null; +$list-group-bg: $white; +$list-group-border-color: $border-color; +$list-group-border-width: $border-width; +$list-group-border-radius: $border-radius; + +$list-group-item-padding-y: calc($card-spacer-y / 1.5); +$list-group-item-padding-x: $card-spacer-x; +$list-group-item-bg-scale: -80%; +$list-group-item-color-scale: 40%; + +$list-group-hover-bg: $gray-100; +$list-group-active-color: $component-active-color; +$list-group-active-bg: $component-active-bg; +$list-group-active-border-color: $list-group-active-bg; + +$list-group-disabled-color: $gray-600; +$list-group-disabled-bg: $list-group-bg; + +$list-group-action-color: $gray-700; +$list-group-action-hover-color: $list-group-action-color; + +$list-group-action-active-color: $body-color; +$list-group-action-active-bg: $gray-200; + +// Figures + +$figure-caption-font-size: 90%; +$figure-caption-color: $gray-600; + +// Breadcrumbs + +$breadcrumb-font-size: null; +$breadcrumb-padding-y: 2; +$breadcrumb-padding-x: 0; +$breadcrumb-item-padding: 0.5rem; + +$breadcrumb-margin-bottom: 1rem; + +$breadcrumb-bg: null; +$breadcrumb-divider-color: $gray-600; +$breadcrumb-active-color: $gray-600; +$breadcrumb-divider: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='14' height='14' stroke='#{$gray-600}' stroke-width='2' fill='none' stroke-linecap='round' stroke-linejoin='round' class='css-i6dzq1'%3E%3Cpolyline points='9 18 15 12 9 6'%3E%3C/polyline%3E%3C/svg%3E"); +$breadcrumb-divider-flipped: $breadcrumb-divider; +$breadcrumb-border-radius: null; + +// Close + +$btn-close-width: 1em; +$btn-close-height: $btn-close-width; +$btn-close-padding-x: 0.25em; +$btn-close-padding-y: $btn-close-padding-x; +$btn-close-color: $black; +$btn-close-bg: url("data:image/svg+xml,"); +$btn-close-focus-shadow: $input-btn-focus-box-shadow; +$btn-close-opacity: 0.5; +$btn-close-hover-opacity: 0.75; +$btn-close-focus-opacity: 1; +$btn-close-disabled-opacity: 0.25; +$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%); + +// Code + +$code-font-size: 87.5%; +$code-color: $pink; + +$kbd-padding-y: 0.2rem; +$kbd-padding-x: 0.4rem; +$kbd-font-size: $code-font-size; +$kbd-color: $white; +$kbd-bg: $body-color; + +$pre-color: null; + +// scss-docs-start theme-colors-rgb +$theme-colors-rgb: map-loop($theme-colors, to-rgb, '$value'); diff --git a/jambotron-ui/src/scss/settings/color-variables.scss b/jambotron-ui/src/scss/settings/color-variables.scss new file mode 100644 index 0000000..657a29b --- /dev/null +++ b/jambotron-ui/src/scss/settings/color-variables.scss @@ -0,0 +1,44 @@ +// ======================================= +// List of variables for Preset color +// ======================================= + +// Gray color +$white: #ffffff; +$gray-100: #fafafa; +$gray-200: #f5f5f5; +$gray-300: #f0f0f0; +$gray-400: #d9d9d9; +$gray-500: #bfbfbf; +$gray-600: #8c8c8c; +$gray-700: #595959; +$gray-800: #262626; +$gray-900: #141414; +$black: #000000; + +$blue: #1677ff; +$indigo: #6610f2; +$purple: #6f42c1; +$pink: #e83e8c; +$red: #ff4d4f; +$orange: #fd7e14; +$yellow: #faad14; +$green: #52c41a; +$teal: #20c997; +$cyan: #13c2c2; + +$blue-100: tint-color($blue, 80%); +$blue-200: tint-color($blue, 60%); +$blue-300: tint-color($blue, 40%); +$blue-400: tint-color($blue, 20%); +$blue-500: $blue; +$blue-600: shade-color($blue, 20%); +$blue-700: shade-color($blue, 40%); +$blue-800: shade-color($blue, 60%); +$blue-900: shade-color($blue, 80%); + +$preset-colors: ( + preset-1: ( + primary: #1890ff + ) +); +$dark-bg-color: #1a1a1a; diff --git a/jambotron-ui/src/scss/settings/theme-variables.scss b/jambotron-ui/src/scss/settings/theme-variables.scss new file mode 100644 index 0000000..e1f2694 --- /dev/null +++ b/jambotron-ui/src/scss/settings/theme-variables.scss @@ -0,0 +1,111 @@ +// ======================================= +// List of variables for layout +// ======================================= +:root { + // body + --#{$variable-prefix}body-bg: #{$body-bg}; + --bs-body-bg-rgb: #{to-rgb($body-bg)}; + + --pc-heading-color: #{$gray-800}; + --pc-active-background: #{$gray-200}; + + // Navbar + --pc-sidebar-background: #{$white}; + --pc-sidebar-color: #262626; + --pc-sidebar-color-rgb: #{to-rgb(#262626)}; + --pc-sidebar-active-color: var(--bs-primary); + --pc-sidebar-shadow: none; + --pc-sidebar-caption-color: #{$gray-700}; + + // header + --pc-header-background: #{$white}; + --pc-header-color: #262626; + --pc-header-shadow: 0 1px 0 0px rgb(240 240 240); + + // card + --pc-card-box-shadow: none; + + // horizontal menu + --pc-header-submenu-background: #{$white}; + --pc-header-submenu-color: #{$gray-600}; +} + +$header-height: 60px; +$sidebar-width: 260px; +$sidebar-collapsed-width: 60px; +$sidebar-collapsed-active-width: 300px; +$sidebar-tab-width: 75px; +$sidebar-tab-navbar-width: 320px; + +// horizontal menu +$topbar-height: 60px; + +$soft-bg-level: -90%; + +// ===================================== +// Variables for dark layouts +// ===================================== + +$dark-layout-color: #121212; +$dark-layout-color-light: #1e1e1e; +// header +$dark-header-color: #d6d6d6; +$dark-header-shadow: 0 1px 20px 0 rgba(69, 90, 100, 0.08); + +// Menu +$dark-sidebar-color: #bfbfbf; +$dark-sidebar-caption: #d6d6d6; +$dark-sidebar-shadow: 0 1px 20px 0 rgba(69, 90, 100, 0.08); + +// card block +$dark-card-shadow: inset 0 0 0 1px #262626; + +// ===================================== +// Variables for bootstrap color +// ===================================== + +$blue: $blue-500; +$secondary: $gray-600; +$indigo: $indigo-500; +$purple: $purple-500; +$pink: $pink-500; +$red: $red-500; +$orange: $orange-500; +$yellow: $yellow-500; +$green: $green-500; +$teal: $teal-500; +$cyan: $cyan-500; +$dark: #262626; + +$primary-text: $blue-600; +$secondary-text: $gray-600; +$success-text: $green-600; +$info-text: $cyan-700; +$warning-text: $yellow-700; +$danger-text: $red-600; +$light-text: $gray-600; +$dark-text: $gray-700; + +$primary-bg-subtle: $blue-100; +$secondary-bg-subtle: $gray-100; +$success-bg-subtle: $green-100; +$info-bg-subtle: $cyan-100; +$warning-bg-subtle: $yellow-100; +$danger-bg-subtle: $red-100; +$light-bg-subtle: mix($gray-100, $white); +$dark-bg-subtle: $gray-400; + +$primary-border-subtle: $blue-200; +$secondary-border-subtle: $gray-200; +$success-border-subtle: $green-200; +$info-border-subtle: $cyan-200; +$warning-border-subtle: $yellow-200; +$danger-border-subtle: $red-200; +$light-border-subtle: $gray-200; +$dark-border-subtle: $gray-500; + +$preset-colors: ( + preset-1: ( + primary: #1677ff + ) +); diff --git a/jambotron-ui/src/scss/themes/components/avatar.scss b/jambotron-ui/src/scss/themes/components/avatar.scss new file mode 100644 index 0000000..75140fa --- /dev/null +++ b/jambotron-ui/src/scss/themes/components/avatar.scss @@ -0,0 +1,18 @@ +.avatar { + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: $border-radius; + font: { + size: 18px; + weight: 600; + } + width: 48px; + height: 48px; + + &.avatar-s { + width: 40px; + height: 40px; + font-size: 14px; + } +} diff --git a/jambotron-ui/src/scss/themes/components/badge.scss b/jambotron-ui/src/scss/themes/components/badge.scss new file mode 100644 index 0000000..b5d54b5 --- /dev/null +++ b/jambotron-ui/src/scss/themes/components/badge.scss @@ -0,0 +1,13 @@ +// ============================ +// Badge css start +// ============================ + +.badge { + @each $color, $value in $theme-colors { + &.bg-light-#{$color} { + background: shift-color($value, $soft-bg-level); + color: $value; + border-color: shift-color($value, $soft-bg-level); + } + } +} diff --git a/jambotron-ui/src/scss/themes/components/button.scss b/jambotron-ui/src/scss/themes/components/button.scss new file mode 100644 index 0000000..fa8e741 --- /dev/null +++ b/jambotron-ui/src/scss/themes/components/button.scss @@ -0,0 +1,125 @@ +// ============================ +// Button css start +// ============================ + +.btn { + font-size: 14px; + + i { + font-size: 18px; + } + + svg { + width: 18px; + height: 18px; + } + + &[class*='btn-link-'], + &[class*='btn-light-'] { + box-shadow: none; + } + + &[class*='btn-outline-']:not(:hover) { + box-shadow: none; + } + + &.btn-shadow { + box-shadow: 0 6px 7px -1px rgba(80, 86, 175, 0.3); + } + + &.btn-sm { + i { + font-size: 14px; + } + } +} +@each $color, $value in $theme-colors { + .btn-light-#{$color} { + background: shift-color($value, $soft-bg-level); + color: $value; + border-color: shift-color($value, $soft-bg-level); + .material-icons-two-tone { + background-color: $value; + } + + &:hover { + background: $value; + color: #fff; + border-color: $value; + .material-icons-two-tone { + background-color: #fff; + } + } + + &.focus, + &:focus { + background: $value; + color: #fff; + border-color: $value; + .material-icons-two-tone { + background-color: #fff; + } + } + + &:not(:disabled):not(.disabled).active, + &:not(:disabled):not(.disabled):active, + .show > &.dropdown-toggle { + background: $value; + color: #fff; + border-color: $value; + .material-icons-two-tone { + background-color: #fff; + } + } + } + + .btn-check:active, + .btn-check:checked { + + .btn-light-#{$color} { + background: $value; + color: #fff; + border-color: $value; + .material-icons-two-tone { + background-color: #fff; + } + } + } + + .btn-link-#{$color} { + background: transparent; + color: $value; + border-color: transparent; + .material-icons-two-tone { + background-color: $value; + } + &:hover { + background: shift-color($value, $soft-bg-level); + color: $value; + border-color: shift-color($value, $soft-bg-level); + } + + &.focus, + &:focus { + background: shift-color($value, $soft-bg-level); + color: $value; + border-color: shift-color($value, $soft-bg-level); + } + + &:not(:disabled):not(.disabled).active, + &:not(:disabled):not(.disabled):active, + .show > &.dropdown-toggle { + background: shift-color($value, $soft-bg-level); + color: $value; + border-color: shift-color($value, $soft-bg-level); + } + } + + .btn-check:active, + .btn-check:checked { + + .btn-link-#{$color} { + background: shift-color($value, $soft-bg-level); + color: $value; + border-color: shift-color($value, $soft-bg-level); + } + } +} diff --git a/jambotron-ui/src/scss/themes/components/card.scss b/jambotron-ui/src/scss/themes/components/card.scss new file mode 100644 index 0000000..da64faa --- /dev/null +++ b/jambotron-ui/src/scss/themes/components/card.scss @@ -0,0 +1,58 @@ +.card { + margin-bottom: 24px; + transition: box-shadow 0.2s ease-in-out; + + .card-header { + border-bottom: 1px solid $border-color; + + h5 { + margin-bottom: 0; + color: $headings-color; + font-size: 0.875rem; + font-weight: 600; + + + p, + + small { + margin-top: 10px; + + &:last-child { + margin-bottom: 0; + } + } + } + } + + .card-footer { + transition: box-shadow 0.2s ease-in-out; + border-top: 1px solid $border-color; + } + + &:hover { + .card-footer[class*='bg-'] { + box-shadow: none; + } + } + + .card-body { + &.pc-component { + position: relative; + padding: 25px; + border: 1px solid rgba(215, 223, 233, 0.5); + } + } +} + +@include media-breakpoint-down(sm) { + .card { + margin-bottom: 20px; + .card-header { + padding: 20px; + h5 { + font-size: 0.875rem; + } + } + .card-body { + padding: 20px; + } + } +} diff --git a/jambotron-ui/src/scss/themes/components/components.scss b/jambotron-ui/src/scss/themes/components/components.scss new file mode 100644 index 0000000..76cda15 --- /dev/null +++ b/jambotron-ui/src/scss/themes/components/components.scss @@ -0,0 +1,8 @@ +@import 'avatar'; +@import 'button'; +@import 'badge'; +@import 'dropdown'; +@import 'table'; +@import 'tabs'; +@import 'card'; +@import 'form'; diff --git a/jambotron-ui/src/scss/themes/components/dropdown.scss b/jambotron-ui/src/scss/themes/components/dropdown.scss new file mode 100644 index 0000000..72362b1 --- /dev/null +++ b/jambotron-ui/src/scss/themes/components/dropdown.scss @@ -0,0 +1,85 @@ +.dropdown-toggle { + &.arrow-none { + &:after { + display: none; + } + } +} + +.pc-header { + .dropdown-menu { + animation: 0.3s ease-in-out 0s normal forwards 0.3s fadeIn; + } +} +@keyframes fadeIn { + from { + transform: translate3d(0, 8px, 0); + opacity: 0; + } + + to { + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +.dropdown .dropdown-item { + display: flex; + align-items: center; + + &.active, + &:active, + &:focus, + &:hover { + background: var(--pc-active-background); + color: var(--bs-dropdown-link-color); + i { + &.material-icons-two-tone { + background-color: $dropdown-link-hover-color; + } + } + } +} + +.dropdown-menu { + --bs-dropdown-zindex: 8; + box-shadow: 0 4px 24px 0 rgba(62, 57, 107, 0.18); + border: none; + .dropdown-item { + padding: 10px 25px; + + i { + font-size: 18px; + margin-right: 10px; + + &.material-icons-two-tone { + vertical-align: bottom; + font-size: 22px; + background-color: var(--pc-header-color); + } + } + + svg { + width: 18px; + height: 18px; + margin-right: 10px; + } + + .float-right { + svg { + width: 14px; + height: 14px; + } + } + } +} + +.dropdown-menu-dark { + .dropdown-item { + &.active, + &:active { + color: var(--bs-dropdown-link-hover-color); + background-color: var(--bs-dropdown-link-hover-bg); + } + } +} diff --git a/jambotron-ui/src/scss/themes/components/form.scss b/jambotron-ui/src/scss/themes/components/form.scss new file mode 100644 index 0000000..2dfe2d6 --- /dev/null +++ b/jambotron-ui/src/scss/themes/components/form.scss @@ -0,0 +1,255 @@ +.form-group { + margin-bottom: 1rem; + + label { + font-size: 14px; + font-weight: 500; + } +} + +select.form-control, +.form-control { + &:hover { + background-color: $gray-100; + } + + &[readonly] { + opacity: 0.6; + } +} + +.input-group-text svg { + width: 18px; + height: 18px; +} + +.form-control-color-picker { + height: 43px; + padding: 0.5rem; +} + +select.form-control { + appearance: none; + background: #{$input-bg} + url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' stroke='currentColor' stroke-width='2' fill='none' stroke-linecap='round' stroke-linejoin='round' class='css-i6dzq1'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E") + no-repeat right 0.75rem center/18px 25px; + + &[data-multiselectsplitter-firstselect-selector], + &[data-multiselectsplitter-secondselect-selector] { + background: none; + } +} + +.form-floating { + > label { + top: 1px; + } + + > .form-control:focus, + > .form-control:not(:placeholder-shown), + > .form-select { + ~ label { + color: $gray-600; + } + } + + > .form-control:focus { + ~ label { + color: $component-active-bg; + } + } + + > input { + color: $body-color; + } +} + +.user-card { + .form-search { + position: relative; + i { + position: absolute; + top: 12px; + left: 15px; + font-size: 14px; + } + .form-control { + padding-left: 42px; + background: transparent; + } + } + + .btn { + i { + font-size: inherit; + } + span { + white-space: pre; + } + } +} + +.form-check { + label { + cursor: pointer; + + input { + cursor: pointer; + } + } +} + +@each $color, $value in $theme-colors { + .form-check { + .form-check-input { + &.input-#{$color} { + &:checked { + border-color: $value; + background-color: $value; + } + } + + &.input-light-#{$color} { + &:checked { + border-color: shift-color($value, $soft-bg-level); + background-color: shift-color($value, $soft-bg-level); + + &[type='checkbox'] { + background-image: escape-svg( + url("data:image/svg+xml,") + ); + } + + &[type='radio'] { + background-image: escape-svg( + url("data:image/svg+xml,") + ); + } + } + } + + &.input-#{$color}, + &.input-light-#{$color} { + &:focus { + &[type='checkbox'], + &[type='radio'] { + box-shadow: 0 0 0 0.2rem rgba($value, 0.25); + border-color: $value; + } + } + } + } + + &.form-switch { + .form-check-input.input-light-#{$color} { + &:checked { + background-image: escape-svg( + url("data:image/svg+xml,") + ); + } + } + } + } +} + +.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group > .input-group-append:last-child > .input-group-text:not(:last-child), +.input-group > .input-group-append:not(:last-child) > .btn, +.input-group > .input-group-append:not(:last-child) > .input-group-text, +.input-group > .input-group-prepend > .btn, +.input-group > .input-group-prepend > .input-group-text { + border-right: none; +} + +// sticky header start +.sticky-action { + top: $header-height; + position: sticky; + z-index: 1020; + background: var(--bs-card-bg); + border-radius: var(--bs-card-border-radius); +} +// sticky header end + +// switch v1 start +.switch-demo { + .custom-switch-v1 { + margin-bottom: 4px; + } +} +.custom-switch-v1 { + &.form-switch { + padding-left: 2.9em; + + .form-check-input { + height: 20px; + width: 35px; + margin-left: -2.9em; + background-image: escape-svg( + url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='4.1' fill='#{$form-switch-color}'/%3e%3c/svg%3e") + ); + transition: 0.35s cubic-bezier(0.54, 1.6, 0.5, 1); + //box-shadow: 0 0 3px rgba(0, 0, 0, 0.2); + + &[class*='input-light-'] { + border: none; + } + + &:focus { + box-shadow: none; + border-color: rgba(0, 0, 0, 0.25); + } + + &:checked { + background-image: escape-svg( + url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='4.1' fill='%23ffffff'/%3e%3c/svg%3e") + ); + } + } + + @each $color, $value in $theme-colors { + .form-check-input.input-light-#{$color} { + &:checked { + background-image: escape-svg( + url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='4.1' fill='#{$value}'/%3e%3c/svg%3e") + ); + } + } + } + } + + // =========== + .custom-control-label { + &::before { + transition: 0.2s cubic-bezier(0.24, 0, 0.5, 1); + height: 20px; + width: 35px; + border-radius: 0.8rem; + top: 0; + left: -2.55rem; + } + + &::after { + top: calc(0.15625rem - 2px); + left: calc(-2.25rem - 4px); + height: 19px; + width: 19px; + border-radius: 0.7rem; + box-shadow: + 0 0 0 1px rgba(0, 0, 0, 0.1), + 0 4px 0 0 rgba(0, 0, 0, 0.04), + 0 4px 9px rgba(0, 0, 0, 0.13), + 0 3px 3px rgba(0, 0, 0, 0.05); + transition: 0.35s cubic-bezier(0.54, 1.6, 0.5, 1); + } + } + + .custom-control-input { + &:checked ~ .custom-control-label::after { + transform: translateX(0.95rem); + } + } + + // =========== +} +// switch v1 end diff --git a/jambotron-ui/src/scss/themes/components/table.scss b/jambotron-ui/src/scss/themes/components/table.scss new file mode 100644 index 0000000..39377f4 --- /dev/null +++ b/jambotron-ui/src/scss/themes/components/table.scss @@ -0,0 +1,39 @@ +.table { + &.table-align-center { + td, + th { + vertical-align: middle; + } + } + thead th { + padding: 0.9rem 0.75rem; + } + td, + th { + vertical-align: middle; + + &:first-child { + padding-left: 24px; + } + &:last-child { + padding-right: 24px; + } + } + &.table-borderless { + td, + th { + border: none !important; + } + } + thead th { + background-color: $gray-100; + border-top: 1px solid $gray-300; + border-bottom: 2px solid $gray-300; + font-size: 12px; + } +} + +.table-hover tbody tr:hover { + // background-color: transparentize($primary, 0.97); + background-color: $gray-200; +} diff --git a/jambotron-ui/src/scss/themes/components/tabs.scss b/jambotron-ui/src/scss/themes/components/tabs.scss new file mode 100644 index 0000000..8b09660 --- /dev/null +++ b/jambotron-ui/src/scss/themes/components/tabs.scss @@ -0,0 +1,57 @@ +.tabs-border { + &.nav-tabs { + .nav-item { + margin-bottom: 0; + } + + .nav-link { + border: none; + background: + no-repeat center bottom, + center 100%; + background-size: + 0 100%, + 100% 100%; + transition: background 0.3s ease-out; + background-image: linear-gradient(to top, theme-color('primary') 2px, rgba(255, 255, 255, 0) 2px); + + &.active { + background-size: + 100% 100%, + 100% 100%; + } + } + } +} + +.tabs-light { + &.nav-pill { + + .tab-content { + border-top: 1px solid $border-color; + } + + .nav-item { + margin-bottom: 0; + + .nav-link { + color: $primary; + background: shift-color($primary, $soft-bg-level); + border-radius: 4px; + transition: background 0.3s ease-out; + } + + + .nav-item { + margin-left: 10px; + } + } + + .nav-link { + border: none; + + &.active { + color: $white; + background: $primary; + } + } + } +} diff --git a/jambotron-ui/src/scss/themes/general.scss b/jambotron-ui/src/scss/themes/general.scss new file mode 100644 index 0000000..0157c5a --- /dev/null +++ b/jambotron-ui/src/scss/themes/general.scss @@ -0,0 +1,233 @@ +/** ===================== + 2. Custom css start +========================== **/ + +* { + &:focus { + outline: none; + } +} + +.accordion { + --#{$prefix}accordion-color: #{$body-color}; +} + +a { + color: $black; + &:hover { + outline: none; + text-decoration: none; + } + + &:not([href]) { + color: inherit; + } +} + +p { + font-size: 14px; +} + +h6, +.h6, +h5, +.h5, +h4, +.h4, +h3, +.h3, +h2, +.h2, +h1, +.h1 { + color: var(--pc-heading-color); +} + +b, +strong { + font-weight: 600; +} + +.breadcrumb-default-icon { + .breadcrumb-item + .breadcrumb-item::before { + position: relative; + top: 2px; + } +} + +.btn-page { + .btn { + margin-right: 5px; + margin-bottom: 5px; + } + + .btn-group { + .btn { + margin-right: 0; + margin-bottom: 0; + + &:last-child { + border-left: none; + } + } + + label { + &:first-of-type { + border-right: none; + } + } + } +} + +.material-icons-two-tone { + background-color: $body-color; + -webkit-text-fill-color: transparent; + vertical-align: text-bottom; + -webkit-background-clip: text; + + &.text-white { + background-color: $white; + } +} + +.img-radius { + border-radius: 50%; +} + +.pc-icon { + &:not([class*='wid-']) { + width: 22px; + } + + &:not([class*='hei-']) { + height: 22px; + } +} + +/* ======================================================== + =============== document ====================== + ======================================================== + + Grid examples +*/ + +// modal box select +.ng-dropdown-panel.ng-select-bottom { + z-index: 1099; +} + +/* ================================ Blockquote Start ===================== */ + +@media (min-width: 1600px) { + .container { + max-width: 1540px; + } +} + +.media { + display: flex; + + .media-body { + flex-grow: 1; + } +} + +.blockquote { + padding: 0.5rem 1rem; +} + +/* ================================ Blockquote End ===================== */ + +.color-card { + .card-body { + margin: var(--bs-card-spacer-y) var(--bs-card-spacer-x); + background: rgba(107, 117, 125, 0.08); + border-radius: $border-radius; + } +} + +.color-block { + border-radius: $border-radius; + margin: 4px 0; + + @each $name, $value in $more-colors { + $i: 100; + + @while $i<=900 { + &.bg-#{$name}-#{$i} { + color: color-contrast(map-get($value, $i)); + } + + &.text-#{$name}-#{$i} { + background-color: color-contrast(map-get($value, $i)); + } + + $i: $i + 100; + } + } +} + +.row { + > div { + .color-block { + &:first-child { + margin-top: 0; + } + &:last-child { + margin-bottom: 0; + } + } + } +} + +.pagination { + .page-item { + .page-link { + border-radius: 0; + } + &:first-child { + .page-link { + border-radius: var(--bs-pagination-border-radius) 0 0 var(--bs-pagination-border-radius); + } + } + &:last-child { + .page-link { + border-radius: 0 var(--bs-pagination-border-radius) var(--bs-pagination-border-radius) 0; + } + } + } +} + +.form-search { + position: relative; + i { + position: absolute; + top: 12px; + left: 15px; + font-size: 20px; + } + .form-control { + padding-left: 50px; + } + + &.product-search { + i { + font-size: 13px; + color: rgba(0, 0, 0, 0.54); + top: 12px; + } + + .form-control { + padding-left: 35px; + } + } +} + +// offcanvas page css +.customer-body { + height: calc(100% - 60px); +} +.offcanvas-top, +.offcanvas-bottom { + min-height: 240px; +} diff --git a/jambotron-ui/src/scss/themes/generic.scss b/jambotron-ui/src/scss/themes/generic.scss new file mode 100644 index 0000000..102780c --- /dev/null +++ b/jambotron-ui/src/scss/themes/generic.scss @@ -0,0 +1,184 @@ +/** ===================== + Generic-class css start +========================== **/ +/*====== Padding , Margin css starts ======*/ +$i: 0; +@while $i<=50 { + .p { + &-#{$i} { + padding: #{$i}px; + } + + &-t-#{$i} { + padding-top: #{$i}px; + } + + &-b-#{$i} { + padding-bottom: #{$i}px; + } + + &-l-#{$i} { + padding-left: #{$i}px; + } + + &-r-#{$i} { + padding-right: #{$i}px; + } + } + + .m { + &-#{$i} { + margin: #{$i}px; + } + + &-t-#{$i} { + margin-top: #{$i}px; + } + + &-b-#{$i} { + margin-bottom: #{$i}px; + } + + &-l-#{$i} { + margin-left: #{$i}px; + } + + &-r-#{$i} { + margin-right: #{$i}px; + } + } + $i: $i + 5; +} +/*====== Padding , Margin css ends ======*/ +/*====== Font-size css starts ======*/ +$i: 6; +@while $i<=80 { + .f-#{$i} { + font-size: #{$i}px; + } + $i: $i + 2; +} +/*====== Font-size css ends ======*/ +/*====== Font-weight css starts ======*/ +$i: 100; +@while $i<=900 { + .f-w-#{$i} { + font-weight: #{$i}; + } + $i: $i + 100; +} +/*====== Font-weight css ends ======*/ +/*====== width, Height css starts ======*/ +$i: 10; +@while $i<=150 { + .wid-#{$i} { + width: #{$i}px; + } + + .hei-#{$i} { + height: #{$i}px; + } + $i: $i + 5; +} +/*====== width, Height css ends ======*/ +/*====== border-width css starts ======*/ +$i: 1; +@while $i<=8 { + .b-wid-#{$i} { + border-width: #{$i}px; + } + $i: $i + 1; +} +/*====== border-width css ends ======*/ +/*====== background starts ======*/ + +.text-header { + color: var(--bs-heading-color); +} +.bg-body { + background: var(--bs-body-bg); +} +@each $color, $value in $theme-colors { + .bg-light-#{$color} { + background: shift-color($value, $soft-bg-level); + color: $value; + } + + .icon-svg-#{$color} { + fill: shift-color($value, $soft-bg-level); + stroke: $value; + } + + .material-icons-two-tone { + &.text-#{$color} { + background-color: $value; + } + } + .text-hover-#{$color}:hover { + color: $value !important; + } +} +/*====== background ends ======*/ +/*====== border color css starts ======*/ +@each $color, $value in $theme-colors { + .b-#{$color} { + border: 1px solid $value; + } + + .border-bottom-#{$color} td { + border-bottom: 1px solid $value; + } + + .border-bottom-#{$color} th { + border-bottom: 1px solid $value !important; + } + + .fill-#{$color} { + fill: $value; + } +} +/*====== border color css ends ======*/ +/*====== text-color, background color css starts ======*/ + +.text-sm { + font-size: 0.75rem !important; +} + +/*====== more bootstrap colors start ======*/ +$more-colors: ( + 'blue': ( + 100: $blue-100, + 200: $blue-200, + 300: $blue-300, + 400: $blue-400, + 500: $blue-500, + 600: $blue-600, + 700: $blue-700, + 800: $blue-800, + 900: $blue-900 + ), + 'gray': ( + 100: $gray-100, + 200: $gray-200, + 300: $gray-300, + 400: $gray-400, + 500: $gray-500, + 600: $gray-600, + 700: $gray-700, + 800: $gray-800, + 900: $gray-900 + ) +); +@each $name, $value in $more-colors { + $i: 100; + @while $i<=900 { + .bg-#{$name}-#{$i} { + background: map-get($value, $i); + } + .text-#{$name}-#{$i} { + color: map-get($value, $i); + } + $i: $i + 100; + } +} +/*====== more bootstrap colors end ======*/ diff --git a/jambotron-ui/src/scss/themes/layouts/breadcrumb/breadcrumb.scss b/jambotron-ui/src/scss/themes/layouts/breadcrumb/breadcrumb.scss new file mode 100644 index 0000000..1b6a23b --- /dev/null +++ b/jambotron-ui/src/scss/themes/layouts/breadcrumb/breadcrumb.scss @@ -0,0 +1,65 @@ +.page-header { + display: flex; + align-items: center; + top: $header-height; + left: $sidebar-width; + right: 0; + z-index: 1023; + min-height: 55px; + padding: 0px 0px 13px 0px; + background: transparent; + border-radius: $border-radius; + + .page-block { + width: 100%; + } + + .page-header-title { + display: inline-block; + } + + h5 { + margin-bottom: 0; + margin-right: 8px; + padding-right: 8px; + font-weight: 500; + } + + .breadcrumb { + padding: 0; + display: inline-flex; + margin-bottom: 0; + background: transparent; + font-size: 13px; + + a { + color: var(--pc-sidebar-color); + } + + .breadcrumb-item { + .home { + color: $gray-600; + font-size: 14px; + } + + a:hover { + color: $primary; + } + + + .breadcrumb-item::before { + position: relative; + top: 2px; + } + + &:last-child { + opacity: 0.75; + } + } + + svg { + width: 14px; + height: 14px; + vertical-align: baseline; + } + } +} diff --git a/jambotron-ui/src/scss/themes/layouts/footer/footer.scss b/jambotron-ui/src/scss/themes/layouts/footer/footer.scss new file mode 100644 index 0000000..ccfdf10 --- /dev/null +++ b/jambotron-ui/src/scss/themes/layouts/footer/footer.scss @@ -0,0 +1,23 @@ +.pc-footer { + position: relative; + z-index: 995; + margin-left: $sidebar-width; + margin-top: $header-height; + padding: 15px 0; + background: rgb(250, 250, 251); + padding: 12px 48px; + + .footer-wrapper { + padding-left: 20px; + padding-right: 20px; + } + + .footer-link { + .list-inline-item:not(:last-child) { + margin-right: 0.9rem; + } + } + @media (max-width: 1024px) { + margin-left: 0; + } +} diff --git a/jambotron-ui/src/scss/themes/layouts/menu/sidebar.scss b/jambotron-ui/src/scss/themes/layouts/menu/sidebar.scss new file mode 100644 index 0000000..320f103 --- /dev/null +++ b/jambotron-ui/src/scss/themes/layouts/menu/sidebar.scss @@ -0,0 +1,338 @@ +.pc-sidebar { + background: var(--pc-sidebar-background); + width: $sidebar-width; + position: fixed; + top: 0; + bottom: 0; + overflow: hidden; + z-index: 1026; + box-shadow: var(--pc-sidebar-shadow); + display: block; + height: 100vh; + color: var(--pc-sidebar-color); + border-right: 1px solid rgb(240, 240, 240); + + a { + color: #262626; + cursor: pointer; + } + + .navbar-wrapper { + width: 100%; + height: 100%; + } + + ul { + list-style: none; + padding-left: 0; + margin-bottom: 0; + } + + .m-header { + height: $header-height; + display: flex; + align-items: center; + padding: 16px 24px; + position: relative; + + .logo-sm { + display: none; + } + } + + .nav-card { + background: $gray-100; + } + + .user-profile-section { + padding: 10px 24px; + border-top: 2px solid rgb(240, 240, 240); + .dropdown-toggle::after { + display: none; + } + + .user-images { + position: relative; + display: flex; + align-items: center; + justify-content: center; + line-height: 1; + border-radius: 50%; + overflow: hidden; + width: 46px; + height: 46px; + + img { + width: 100%; + height: 100%; + text-align: center; + object-fit: cover; + color: transparent; + text-indent: 10000px; + } + } + } + + &.navbar-collapsed { + width: 0px; + height: 100%; + transition: all 0.3s ease-in-out; + + ~ app-nav-bar .pc-header { + left: 0px; + } + + ~ .pc-footer { + margin-left: 20px; + } + + ~ .pc-container { + margin-left: 0px; + } + + .navbar-wrapper { + .m-header { + left: -260px; + } + } + } + .navbar-content { + // position: relative; + // height: calc(100vh - 60px); + padding: 16px 0; + + .coded-inner-navbar { + flex-direction: column; + + app-nav-item > li.active:after { + top: 0 !important; + height: 100% !important; + } + + li { + &.coded-hasmenu { + position: relative; + padding-bottom: 2px; + + > a { + &:after { + content: '\e844'; + font-family: 'feather'; + font-size: 15px; + border: none; + position: absolute; + top: 11px; + right: 20px; + transition: 0.3s ease-in-out; + } + } + + .coded-submenu { + opacity: 0; + visibility: hidden; + transform-origin: 50% 50%; + transition: + transform 0.3s, + opacity 0.3s; + transform-style: preserve-3d; + transform: rotateX(-90deg); + position: absolute; + display: block; + + > app-nav-item li { + > a { + text-align: left; + padding: 12px 30px 12px 55px; + margin: 0; + display: block; + + &:before { + content: ''; + position: absolute; + top: 0; + right: 0; + width: 2px; + height: 100%; + } + } + } + + > app-nav-collapse li { + > a { + text-align: left; + padding: 12px 30px 12px 55px; + margin: 0; + display: block; + } + .coded-submenu > { + app-nav-item li { + > a { + padding: 12px 30px 12px 75px; + } + } + } + } + } + + &.coded-trigger { + > a { + &:after { + transform: rotate(90deg); + } + } + + > .coded-submenu { + position: relative; + opacity: 1; + visibility: visible; + transform: rotateX(0deg); + } + } + } + + &.coded-menu-caption { + font-size: 0.75rem; + font-weight: 500; + padding: 12px 24px 12px; + text-transform: capitalize; + position: relative; + color: $gray-600; + + &.first-group { + padding: 0px 24px 12px; + } + } + + > a { + padding: 12px 16px 12px 28px; + display: flex; + align-items: center; + border-radius: 5px; + position: relative; + + .coded-mtext { + position: relative; + } + + > .coded-micon { + font-size: 16px; + margin-right: 8px; + height: 16px; + display: inline-block; + text-align: center; + + i { + display: flex; + } + + + .coded-mtext { + position: relative; + vertical-align: middle; + text-align: center; + } + } + } + } + + app-nav-item { + li { + > a { + > .coded-micon { + margin-right: 12px; + } + } + } + } + + > app-nav-group > app-nav-item { + li { + position: relative; + &:before { + content: ''; + position: absolute; + top: 0; + right: 0; + width: 2px; + height: 100%; + } + } + } + } + } + + .version { + display: flex; + flex-direction: row; + justify-content: center; + margin-bottom: 16px; + cursor: pointer; + + label { + overflow: hidden; + text-overflow: ellipsis; + padding-left: 8px; + padding-right: 8px; + white-space: nowrap; + background-color: rgb(250, 250, 250); + color: rgb(158, 158, 158); + border-radius: 16px; + } + } +} + +@media (min-width: 1025px) { + .pc-sidebar { + transition: width 0.15s ease; + ~ .pc-header { + transition: left 0.15s ease; + } + ~ .pc-footer, + ~ .pc-container { + transition: margin-left 0.15s ease; + } + &.pc-sidebar-hide { + width: 0; + ~ .pc-header { + left: 0; + } + ~ .pc-footer, + ~ .pc-container { + margin-left: 0px; + } + } + } +} + +@media (max-width: 1024px) { + .pc-header .pc-h-item.pc-sidebar-collapse { + display: none; + } + .pc-sidebar { + left: -#{$sidebar-width}; + box-shadow: none; + top: 0; + transition: all 0.15s ease-in-out; + + &.mob-open { + left: 0; + + .navbar-wrapper { + position: relative; + z-index: 5; + background: inherit; + } + + ~ .pc-container { + .pc-menu-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + z-index: 1025; + } + } + } + } +} diff --git a/jambotron-ui/src/scss/themes/layouts/navbar/navbar.scss b/jambotron-ui/src/scss/themes/layouts/navbar/navbar.scss new file mode 100644 index 0000000..7e5240c --- /dev/null +++ b/jambotron-ui/src/scss/themes/layouts/navbar/navbar.scss @@ -0,0 +1,465 @@ +.pc-header { + background: var(--pc-header-background); + color: var(--pc-header-color); + min-height: $header-height; + border-bottom: 1px solid rgb(240, 240, 240); + position: fixed; + left: $sidebar-width; + right: 0; + z-index: 1025; + display: flex; + + ul { + margin-bottom: 0; + display: inline-flex; + } + + .m-header { + height: $header-height; + display: flex; + align-items: center; + justify-content: space-between; + width: $sidebar-width; + padding: 16px 10px 16px 24px; + } + + .header-wrapper { + display: flex; + padding: 0 25px 0px 12px; + flex-grow: 1; + justify-content: space-between; + + @include media-breakpoint-down(sm) { + padding: 0 15px; + } + } + + .header-search { + position: relative; + + .form-control { + border-radius: $border-radius; + padding: 0.344rem 1.8rem; + width: 200px; + max-width: 100%; + font-size: 0.75rem; + + @media (max-width: 1024px) { + width: 100%; + } + } + + .search { + position: absolute; + top: 5px; + left: 11px; + width: 12px; + height: 12px; + } + + .btn-search { + position: absolute; + top: 7px; + right: 9px; + padding: 0; + display: inline-flex; + align-items: center; + justify-content: center; + width: 34px; + height: 34px; + border-radius: $border-radius; + } + } + + .pc-h-item { + min-height: $header-height; + display: flex; + align-items: center; + position: relative; + } + + .pc-head-link { + margin: 0 8px; + position: relative; + font-weight: 500; + padding: 0; + display: inline-flex; + align-items: center; + justify-content: center; + width: 34px; + height: 34px; + border-radius: $border-radius; + color: var(--pc-header-color); + overflow: hidden; + + &.dropdown-toggle::after { + display: none; + } + + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 1; + background: var(--pc-active-background); + border-radius: 50%; + transform: scale(0); + transition: all 0.08s cubic-bezier(0.37, 0.24, 0.53, 0.99); + } + + > img, + > span, + > svg, + > i { + position: relative; + z-index: 5; + transition: all 0.08s cubic-bezier(0.37, 0.24, 0.53, 0.99); + } + + > i { + color: var(--pc-header-color); + font-size: 16px; + } + + > svg { + width: 20px; + height: 20px; + } + + &.active, + &:active, + &:focus, + &:hover { + text-decoration: none; + color: var(--pc-header-color); + + > svg, + > i { + color: var(--pc-header-color); + } + + &::before { + border-radius: 0; + transform: scale(1); + } + + .hamburger { + .hamburger-inner { + background-color: $secondary; + + &::after, + &::before { + background-color: $secondary; + } + } + } + + i.material-icons-two-tone { + background-color: $secondary; + } + } + + .pc-h-badge { + display: flex; + flex-flow: wrap; + place-content: center; + font-weight: 500; + font-size: 0.75rem; + line-height: 1; + transition: transform 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; + transform-origin: 100% 0%; + min-width: 16px; + height: 16px; + padding: 4px; + position: absolute; + top: 2px; + right: 2px; + border-radius: 50%; + z-index: 9; + + &.dots { + width: 9px; + height: 9px; + top: 7px; + right: 16px; + padding: 0; + } + } + + .user-desc, + .user-name { + display: block; + line-height: 1; + } + + .user-name { + margin-bottom: 5px; + + font: { + size: 15px; + weight: 600; + } + } + + .user-desc { + font: { + size: 12px; + weight: 400; + } + + color: var(--pc-header-color); + } + + .settings { + animation: anim-rotate 2s infinite linear; + } + } + + .pc-h-dropdown { + transform: none !important; + top: 100% !important; + + &.dropdown-menu-end { + right: 0 !important; + left: auto !important; + } + } + + .drp-search { + min-width: 20rem; + } + + .user-avatar { + width: 40px; + border-radius: 50%; + } + + .header-user-profile { + .pc-head-link { + width: auto; + padding: 7px; + + > span > i { + font-size: 22px; + margin-right: 8px; + } + + .user-avatar { + width: 34px; + } + + @include media-breakpoint-down(sm) { + width: 40px; + + .user-avatar { + margin-right: 0; + } + + > span, + > span > i { + display: none; + } + } + } + } + + .dropdown-user-profile { + min-width: 290px; + max-width: 100%; + .drp-tabs { + border-bottom: 0; + display: flex; + margin-bottom: 10px; + .nav-item { + margin-bottom: -0px; + .nav-link { + position: relative; + padding: 0.7rem; + font-weight: 500; + color: $body-color; + display: flex; + align-items: center; + justify-content: center; + i { + font-size: 18px; + margin: 0 4px; + } + .material-icons-two-tone { + font-size: 20px; + } + &:after { + content: ''; + background: $primary; + position: absolute; + transition: all 0.3s ease-in-out; + left: 50%; + right: 50%; + bottom: -1px; + height: 2px; + border-radius: 2px 2px 0 0; + } + } + } + + .nav-link:hover { + border-color: transparent; + color: $primary; + .material-icons-two-tone { + background-color: $primary; + } + } + + .nav-item.show .nav-link, + .nav-link.active { + border-color: transparent; + color: $primary; + .material-icons-two-tone { + background-color: $primary; + } + &:after { + left: 0; + right: 0; + } + } + } + .tab-content { + .dropdown-item { + i { + font-size: 14px; + } + svg { + margin-right: 0px; + width: 14px; + height: 14px; + } + } + } + } + + .dropdown-notification { + min-width: 420px; + max-width: 100%; + + .list-group-item-action { + &:active, + &:hover, + &:focus { + background: shift-color($primary, $soft-bg-level); + } + + .user-avatar, + h5 { + cursor: pointer; + } + } + + .badge { + font-size: 0.8125rem; + padding: 0.43em 1em; + } + + .user-avatar { + display: flex; + align-items: center; + justify-content: center; + width: 40px; + height: 40px; + font-size: 20px; + } + + .notification-file { + display: flex; + align-items: center; + + i { + font-size: 20px; + margin-right: 16px; + } + } + @media (max-width: 575.98px) { + min-width: 100%; + } + } +} + +@keyframes anim-rotate { + 0% { + transform: rotate(0); + } + + to { + transform: rotate(360deg); + } +} + +@media (min-width: 1025px) { + .pc-header .pc-h-item.pc-sidebar-popup { + display: none; + } +} + +@media (max-width: 1024px) { + .pc-header { + top: 0; + left: 0; + transition: all 0.15s ease-in-out; + + .m-header { + display: none; + } + + .pc-head-link { + .user-desc, + .user-name { + display: none; + } + } + + .pc-mob-drp { + &.mob-drp-active { + .pc-h-item { + display: block; + min-height: auto; + position: relative; + + .pc-head-link { + display: block; + margin: 5px 10px !important; + } + + .dropdown-menu { + position: relative !important; + width: 100%; + float: none; + box-shadow: none; + } + } + + ul { + display: block; + } + } + } + } +} + +@include media-breakpoint-down(sm) { + .pc-header { + .pc-head-link { + padding: 0.65rem; + margin: 0 5px; + } + + .pc-h-item { + position: static; + + .pc-h-dropdown { + left: 0 !important; + right: 0 !important; + } + } + } +} diff --git a/jambotron-ui/src/scss/themes/layouts/pc-common.scss b/jambotron-ui/src/scss/themes/layouts/pc-common.scss new file mode 100644 index 0000000..c45fdd7 --- /dev/null +++ b/jambotron-ui/src/scss/themes/layouts/pc-common.scss @@ -0,0 +1,41 @@ +body { + background-color: $white; +} + +.pc-container { + $temp: $header-height + 53; + position: relative; + top: $header-height; + margin-left: $sidebar-width; + min-height: calc(100vh - #{$temp}); + background: rgba(250, 250, 251, 0.7); + + .coded-content { + padding-left: 48px; + padding-right: 48px; + padding-top: 24px; + @include media-breakpoint-down(xl) { + &.container { + max-width: 100%; + } + } + @include media-breakpoint-down(md) { + padding-left: 32px; + padding-right: 32px; + padding-top: 16px; + } + } + + .page-header + .row { + padding-top: 24px; + } + + .page-header + .coded-content { + padding-top: calc(30px + 55px); + } + + @media (max-width: 1024px) { + margin-left: 0px; + margin-right: 0px; + } +} diff --git a/jambotron-ui/src/scss/themes/preset-style.scss b/jambotron-ui/src/scss/themes/preset-style.scss new file mode 100644 index 0000000..57ca0af --- /dev/null +++ b/jambotron-ui/src/scss/themes/preset-style.scss @@ -0,0 +1,87 @@ +@import '../settings/color-variables.scss'; + +:root { + @each $name, $value in $preset-colors { + $pc-primary: map-get($value, 'primary'); + $color-rgb: to-rgb($pc-primary); + --bs-blue: #{$pc-primary}; + --bs-primary-rgb: #{$color-rgb}; + } +} + +.pc-sidebar { + .coded-inner-navbar { + > app-nav-group { + > app-nav-collapse { + .coded-hasmenu { + &.active, + &:focus, + &:hover { + > a { + background: rgba(var(--bs-primary-rgb), 0.1); + } + + &.coded-trigger { + > a { + color: var(--bs-blue); + background: none; + } + + .coded-submenu { + > app-nav-item { + li { + &.active, + &:focus, + &:hover { + > a { + background: rgba(var(--bs-primary-rgb), 0.1); + } + } + } + } + } + } + } + } + + .coded-submenu > app-nav-item li { + &.active { + > a { + background: rgba(var(--bs-primary-rgb), 0.1); + color: var(--bs-blue); + + &:before { + background: var(--bs-blue); + } + } + } + } + } + > app-nav-item { + li { + &.nav-item { + &.active, + &:focus, + &:hover { + background: rgba(var(--bs-primary-rgb), 0.1); + } + + &.active { + > a { + color: var(--bs-blue); + + .coded-micon { + color: var(--bs-blue); + } + } + + &:before { + background: var(--bs-blue); + } + } + } + } + } + } + } +} diff --git a/jambotron-ui/src/server.ts b/jambotron-ui/src/server.ts new file mode 100644 index 0000000..e6546c4 --- /dev/null +++ b/jambotron-ui/src/server.ts @@ -0,0 +1,68 @@ +import { + AngularNodeAppEngine, + createNodeRequestHandler, + isMainModule, + writeResponseToNodeResponse, +} from '@angular/ssr/node'; +import express from 'express'; +import { join } from 'node:path'; + +const browserDistFolder = join(import.meta.dirname, '../browser'); + +const app = express(); +const angularApp = new AngularNodeAppEngine(); + +/** + * Example Express Rest API endpoints can be defined here. + * Uncomment and define endpoints as necessary. + * + * Example: + * ```ts + * app.get('/api/{*splat}', (req, res) => { + * // Handle API request + * }); + * ``` + */ + +/** + * Serve static files from /browser + */ +app.use( + express.static(browserDistFolder, { + maxAge: '1y', + index: false, + redirect: false, + }), +); + +/** + * Handle all other requests by rendering the Angular application. + */ +app.use((req, res, next) => { + angularApp + .handle(req) + .then((response) => + response ? writeResponseToNodeResponse(response, res) : next(), + ) + .catch(next); +}); + +/** + * Start the server if this module is the main entry point. + * The server listens on the port defined by the `PORT` environment variable, or defaults to 4000. + */ +if (isMainModule(import.meta.url)) { + const port = process.env['PORT'] || 4000; + app.listen(port, (error) => { + if (error) { + throw error; + } + + console.log(`Node Express server listening on http://localhost:${port}`); + }); +} + +/** + * Request handler used by the Angular CLI (for dev-server and during build) or Firebase Cloud Functions. + */ +export const reqHandler = createNodeRequestHandler(app); diff --git a/jambotron-ui/src/styles.scss b/jambotron-ui/src/styles.scss new file mode 100644 index 0000000..cea92f3 --- /dev/null +++ b/jambotron-ui/src/styles.scss @@ -0,0 +1,53 @@ +/* You can add global styles to this file, and also import other style files */ +/**====================================================================== +========================================================================= +Template Name: MAntis Angular - Angular Admin Template +Author: codedThemes +Support: https://codedthemes.support-hub.io/ +File: style.css +========================================================================= +=================================================================================== */ + +// main framework +@import '../node_modules/bootstrap/scss/functions'; +@import '../node_modules/bootstrap/scss/variables'; +@import '../node_modules/bootstrap/scss/variables-dark'; + +@import 'scss/settings/color-variables'; +@import 'scss/settings/theme-variables'; +@import 'scss/settings/bootstrap-variables'; + +// bootstrap import +@import 'scss/bootstrap/bootstrap.scss'; + +@import '../node_modules/bootstrap/scss/utilities'; +@import '../node_modules/bootstrap/scss/utilities/api'; + +// main framework +@import 'scss/themes/generic.scss'; +@import 'scss/themes/general.scss'; + +@import 'scss/themes/components/components.scss'; + +// theme +@import 'scss/themes/layouts/menu/sidebar.scss'; +@import 'scss/themes/layouts/navbar/navbar.scss'; +@import 'scss/themes/layouts/pc-common.scss'; +@import 'scss/themes/layouts/breadcrumb/breadcrumb.scss'; +@import 'scss/themes/layouts/footer/footer.scss'; + +@import 'scss/themes/preset-style.scss'; + +html, body { height: 100%; } +body { + background-image: url('../public/Firefly_jambo tron 118290.png'); + background-attachment:fixed; + background-repeat: no-repeat; + background-size: cover; + margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; +} + +.router_outlet_padding{ + padding-top: 60px; + scroll-padding-inline: 40%; +} diff --git a/jambotron-ui/tsconfig.app.json b/jambotron-ui/tsconfig.app.json new file mode 100644 index 0000000..ef19921 --- /dev/null +++ b/jambotron-ui/tsconfig.app.json @@ -0,0 +1,17 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [ + "node" + ] + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "src/**/*.spec.ts" + ] +} diff --git a/jambotron-ui/tsconfig.json b/jambotron-ui/tsconfig.json new file mode 100644 index 0000000..e4955f2 --- /dev/null +++ b/jambotron-ui/tsconfig.json @@ -0,0 +1,34 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "compileOnSave": false, + "compilerOptions": { + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "isolatedModules": true, + "experimentalDecorators": true, + "importHelpers": true, + "target": "ES2022", + "module": "preserve" + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "typeCheckHostBindings": true, + "strictTemplates": true + }, + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/jambotron-ui/tsconfig.spec.json b/jambotron-ui/tsconfig.spec.json new file mode 100644 index 0000000..04df34c --- /dev/null +++ b/jambotron-ui/tsconfig.spec.json @@ -0,0 +1,14 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "include": [ + "src/**/*.ts" + ] +} diff --git a/logs/application.log.2025-06-21.0.gz b/logs/application.log.2025-06-21.0.gz new file mode 100644 index 0000000..f916f89 Binary files /dev/null and b/logs/application.log.2025-06-21.0.gz differ diff --git a/logs/application.log.2025-06-22.0.gz b/logs/application.log.2025-06-22.0.gz new file mode 100644 index 0000000..3f93117 Binary files /dev/null and b/logs/application.log.2025-06-22.0.gz differ diff --git a/logs/application.log.2025-06-23.0.gz b/logs/application.log.2025-06-23.0.gz new file mode 100644 index 0000000..83ead94 Binary files /dev/null and b/logs/application.log.2025-06-23.0.gz differ diff --git a/logs/application.log.2025-06-24.0.gz b/logs/application.log.2025-06-24.0.gz new file mode 100644 index 0000000..b9e1d05 Binary files /dev/null and b/logs/application.log.2025-06-24.0.gz differ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4006651 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "jambotron", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/src/Docker/Dockerfile b/src/Docker/Dockerfile new file mode 100644 index 0000000..766fe68 --- /dev/null +++ b/src/Docker/Dockerfile @@ -0,0 +1,15 @@ +#FROM openjdk:24 AS BUILD_IMAGE +#ENV APP_HOME=/jambotron +#RUN mkdir -p $APP_HOME/src/main/java +#WORKDIR $APP_HOME +#COPY ./build.gradle ./gradlew ./gradlew.bat $APP_HOME/ +#COPY gradle $APP_HOME/gradle +#COPY ./src/ $APP_HOME/src/ +#RUN ./gradlew clean build + +FROM openjdk:24 +WORKDIR /jambotron/ +COPY './build/libs/jambotron-0.0.1-SNAPSHOT.jar' '/app/jambotron.jar' +#COPY --from=BUILD_IMAGE '/jambotron/build/libs/jambotron-0.0.1-SNAPSHOT.jar' '/app/jambotron.jar' +EXPOSE 8080 +CMD ["java","-jar","/app/jambotron.jar"] \ No newline at end of file diff --git a/src/Docker/db_password.txt b/src/Docker/db_password.txt new file mode 100644 index 0000000..8c30b51 --- /dev/null +++ b/src/Docker/db_password.txt @@ -0,0 +1 @@ +postgrespw \ No newline at end of file diff --git a/src/Docker/docker-compose.yml b/src/Docker/docker-compose.yml new file mode 100644 index 0000000..bf8728d --- /dev/null +++ b/src/Docker/docker-compose.yml @@ -0,0 +1,43 @@ +services: + jambotron: + image: 'jambotron-image' + container_name: 'jambotron-container' + build: + context: ../../ + dockerfile: ./src/Docker/Dockerfile + ports: + - "8080:8080" + depends_on: + - postgres_jambotron + environment: + SPRING_DATASOURCE_URL: jdbc:postgresql://postgres_jambotron:5432/jambotronDB + SPRING_DATASOURCE_USERNAME: admin + SPRING_DATASOURCE_PASSWORD: postgrespw + SPRING_FLYWAY_BASELINE-ON-MIGRATE: true + SPRING_FLYWAY_VALIDATE-ON-MIGRATE: true + + SPRING_FLYWAY_USER: admin + SPRING_FLYWAY_PASSWORD: postgrespw + SPRING_FLYWAY_URL: jdbc:postgresql://postgres_jambotron:5432/jambotronDB + +# SPRING_DATASOURCE_PASSWORD: /run/secrets/db_password +# secrets: +# - db_password + + + postgres_jambotron: + image: 'postgres' + container_name: 'jambotron-postgres-container' + ports: + - "5432:5432" + environment: + POSTGRES_USER: admin + POSTGRES_PASSWORD: postgrespw +# POSTGRES_PASSWORD: /run/secrets/db_password + POSTGRES_DB: jambotronDB +# secrets: +# - db_password +# +#secrets: +# db_password: +# file: db_password.txt \ No newline at end of file diff --git a/src/main/java/com/jambotronGroup/jambotron/JambotronApplication.java b/src/main/java/com/jambotronGroup/jambotron/JambotronApplication.java index debeb88..2bfd3f8 100644 --- a/src/main/java/com/jambotronGroup/jambotron/JambotronApplication.java +++ b/src/main/java/com/jambotronGroup/jambotron/JambotronApplication.java @@ -1,14 +1,27 @@ package com.jambotronGroup.jambotron; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.Marker; +import org.slf4j.event.Level; +import org.slf4j.helpers.BasicMarker; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import java.util.Iterator; + @SpringBootApplication public class JambotronApplication { + private static final Logger logger = LoggerFactory.getLogger(JambotronApplication.class); public static void main(String[] args) { SpringApplication.run(JambotronApplication.class, args); + + + logger.error("Application Run."); + logger.debug("Application Run."); + logger.info("Application Run."); } } diff --git a/src/main/java/com/jambotronGroup/jambotron/ZhiPuAi/ZhiPuAiImageService.java b/src/main/java/com/jambotronGroup/jambotron/ZhiPuAi/ZhiPuAiImageService.java new file mode 100644 index 0000000..5b34d19 --- /dev/null +++ b/src/main/java/com/jambotronGroup/jambotron/ZhiPuAi/ZhiPuAiImageService.java @@ -0,0 +1,44 @@ +package com.jambotronGroup.jambotron.ZhiPuAi; + + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +//import org.springframework.web.reactive.function.client.WebClient; +// +//@Service +//public class ZhiPuAiImageService { +// +// @Value("${spring.ai.zhipuai.base-url}") +// private String baseUrl; +// +// @Value("${spring.ai.zhipuai.api-key}") +// private String apiKey; +// +// private final WebClient webClient; +// +// public ZhiPuAiImageService(WebClient.Builder webClientBuilder) { +// this.webClient = webClientBuilder.baseUrl(baseUrl).build(); +// } +// +// public String generateImage(String prompt) { +// return webClient.post() +// .uri("/image/generate") +// .header("Authorization", "Bearer " + apiKey) +// .bodyValue(new ImageRequest(prompt)) +// .retrieve() +// .bodyToMono(String.class) +// .block(); +// } +// +// private static class ImageRequest { +// private final String prompt; +// +// public ImageRequest(String prompt) { +// this.prompt = prompt; +// } +// +// public String getPrompt() { +// return prompt; +// } +// } +//} \ No newline at end of file diff --git a/src/main/java/com/jambotronGroup/jambotron/configuretions/MvcConfig.java b/src/main/java/com/jambotronGroup/jambotron/configuretions/MvcConfig.java new file mode 100644 index 0000000..260f19b --- /dev/null +++ b/src/main/java/com/jambotronGroup/jambotron/configuretions/MvcConfig.java @@ -0,0 +1,19 @@ +package com.jambotronGroup.jambotron.configuretions; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class MvcConfig implements WebMvcConfigurer { + @Value("${spring.resources.static-locations}") + String resourceLocations; + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + //registry.addResourceHandler("/public/**").addResourceLocations(resourceLocations); + // registry.addResourceHandler("/media/**").addResourceLocations("resources/main/public/media/"); + + } +} diff --git a/src/main/java/com/jambotronGroup/jambotron/configuretions/NotFoundHandler.java b/src/main/java/com/jambotronGroup/jambotron/configuretions/NotFoundHandler.java new file mode 100644 index 0000000..101b6d1 --- /dev/null +++ b/src/main/java/com/jambotronGroup/jambotron/configuretions/NotFoundHandler.java @@ -0,0 +1,36 @@ +package com.jambotronGroup.jambotron.configuretions; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.util.ResourceUtils; +import org.springframework.util.StreamUtils; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.servlet.NoHandlerFoundException; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.charset.Charset; +/* + +@ControllerAdvice +public class NotFoundHandler { + @Value("${spa.default-file}") + String defaultFile; + + @ExceptionHandler(NoHandlerFoundException.class) + public ResponseEntity renderDefaultPage() { + try { + File indexFile = ResourceUtils.getFile(defaultFile); + FileInputStream inputStream = new FileInputStream(indexFile); + String body = StreamUtils.copyToString(inputStream, Charset.defaultCharset()); + return ResponseEntity.ok().contentType(MediaType.TEXT_HTML).body(body); + } catch (IOException e) { + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("There was an error completing the action."); + } + } +}*/ diff --git a/src/main/java/com/jambotronGroup/jambotron/controllers/SystemController.java b/src/main/java/com/jambotronGroup/jambotron/controllers/SystemController.java new file mode 100644 index 0000000..8cca937 --- /dev/null +++ b/src/main/java/com/jambotronGroup/jambotron/controllers/SystemController.java @@ -0,0 +1,55 @@ +package com.jambotronGroup.jambotron.controllers; + +import com.jambotronGroup.jambotron.model.Bean; +import com.jambotronGroup.jambotron.model.Setting; +import com.jambotronGroup.jambotron.system.SystemService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@CrossOrigin(origins = "http://localhost:4200", maxAge = 3600, allowCredentials="true") +@RestController +@RequestMapping("/api/system") +public class SystemController { + + @Autowired + SystemService systemService; + + + + @GetMapping("/beans") + public ResponseEntity> getLoadedBeans(@RequestParam(required = false) String title) { + try { + List beans = systemService.getLodedBeans(); + //userRepository.findAll().forEach(users::add); + + + if (beans.isEmpty()) { + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + return new ResponseEntity<>(beans, HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); + } + } + @GetMapping("/beans/custom") + public ResponseEntity> getLoadedCustomBeans(@RequestParam(required = false) String title) { + try { + List beans = systemService.getLodedCustomBeans(); + //userRepository.findAll().forEach(users::add); + + + if (beans.isEmpty()) { + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + return new ResponseEntity<>(beans, HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); + } + } +} diff --git a/src/main/java/com/jambotronGroup/jambotron/controllers/ZhiPuAiController.java b/src/main/java/com/jambotronGroup/jambotron/controllers/ZhiPuAiController.java new file mode 100644 index 0000000..9c0f817 --- /dev/null +++ b/src/main/java/com/jambotronGroup/jambotron/controllers/ZhiPuAiController.java @@ -0,0 +1,15 @@ +package com.jambotronGroup.jambotron.controllers; + +public class ZhiPuAiController { + + // This class is a placeholder for the ZhiPuAiController. + // You can implement methods to handle requests related to ZhiPuAi functionality. + // For example, you might want to add methods for generating images or processing text. + + // Example method (to be implemented): + // @GetMapping("/generate-image") + // public ResponseEntity generateImage(@RequestParam String prompt) { + // String imageUrl = zhiPuAiService.generateImage(prompt); + // return new ResponseEntity<>(imageUrl, HttpStatus.OK); + // } +} diff --git a/src/main/java/com/jambotronGroup/jambotron/model/Bean.java b/src/main/java/com/jambotronGroup/jambotron/model/Bean.java new file mode 100644 index 0000000..dd32292 --- /dev/null +++ b/src/main/java/com/jambotronGroup/jambotron/model/Bean.java @@ -0,0 +1,86 @@ +package com.jambotronGroup.jambotron.model; + +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import lombok.ToString; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + + +@Entity +public class Bean { + + + private String name; + @Id + private String shortName; + private String type; + private String typeShortName; + private String scope; + + public Bean(String name, String type, String scope) { + this.name = name; + this.type = type; + this.scope = scope; + + this.shortName = getAfterLastDot(name); + this.typeShortName = getAfterLastDot(type); + + } + + @Override + public String toString() { + return String.format("name = %s type= %s", this.shortName, this.typeShortName); + } + + public String getAfterLastDot(String input) { + if (input == null || !input.contains(".")) { + return input; // Return the input if it's null or doesn't contain a dot + } + return input.substring(input.lastIndexOf('.') + 1); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } + + + + public String getShortName() { + return shortName; + } + + public void setShortName(String shortName) { + this.shortName = shortName; + } + + public String getTypeShortName() { + return typeShortName; + } + + public void setTypeShortName(String typeShortName) { + this.typeShortName = typeShortName; + } +} diff --git a/src/main/java/com/jambotronGroup/jambotron/model/DataBaseSettings.java b/src/main/java/com/jambotronGroup/jambotron/model/DataBaseSettings.java new file mode 100644 index 0000000..7c8d2dd --- /dev/null +++ b/src/main/java/com/jambotronGroup/jambotron/model/DataBaseSettings.java @@ -0,0 +1,49 @@ +package com.jambotronGroup.jambotron.model; + +import jakarta.persistence.*; + +@Entity +@Table(name = "DataBaseSettings") +public class DataBaseSettings { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + + @Column(length = 20) + private String name; + + @Column(length = 20) + private String url; + + @Column(length = 20) + private String userName; + + @Column(length = 20) + private String password; + + + + + public DataBaseSettings(String name) { + this.name = name; + } + + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/main/java/com/jambotronGroup/jambotron/model/Tutorial.java b/src/main/java/com/jambotronGroup/jambotron/model/Tutorial.java index 50dadc4..0c92d84 100644 --- a/src/main/java/com/jambotronGroup/jambotron/model/Tutorial.java +++ b/src/main/java/com/jambotronGroup/jambotron/model/Tutorial.java @@ -9,7 +9,7 @@ import jakarta.persistence.*; public class Tutorial { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column(name = "title") diff --git a/src/main/java/com/jambotronGroup/jambotron/model/User.java b/src/main/java/com/jambotronGroup/jambotron/model/User.java index 42e639a..cc0843a 100644 --- a/src/main/java/com/jambotronGroup/jambotron/model/User.java +++ b/src/main/java/com/jambotronGroup/jambotron/model/User.java @@ -18,7 +18,7 @@ import java.util.Set; }) public class User { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column(name = "username") diff --git a/src/main/java/com/jambotronGroup/jambotron/security/WebSecurityConfig.java b/src/main/java/com/jambotronGroup/jambotron/security/WebSecurityConfig.java index 8b50eaa..958da04 100644 --- a/src/main/java/com/jambotronGroup/jambotron/security/WebSecurityConfig.java +++ b/src/main/java/com/jambotronGroup/jambotron/security/WebSecurityConfig.java @@ -105,16 +105,21 @@ public class WebSecurityConfig {// extends WebSecurityConfigurerAdapter { .authorizeHttpRequests(auth -> auth.requestMatchers("/api/auth/**").permitAll() .requestMatchers("/*", "/home", "/resources/**").permitAll() + .requestMatchers("/resources/public/media/**").permitAll() + .requestMatchers("/media/**").permitAll() .requestMatchers("/api/test/**").permitAll() .requestMatchers("/api/tutorials").permitAll() - .requestMatchers("api/users").permitAll() - .requestMatchers("api/users/**").permitAll() + .requestMatchers("/api/users").permitAll() + .requestMatchers("/api/users/**").permitAll() - .requestMatchers("api/roles").permitAll() - .requestMatchers("api/roles/**").permitAll() + .requestMatchers("/api/roles").permitAll() + .requestMatchers("/api/roles/**").permitAll() .requestMatchers("/api/tutorials/**").permitAll() + + .requestMatchers("/api/settings").permitAll() + .requestMatchers("/api/system/**").permitAll() .anyRequest().authenticated() ); diff --git a/src/main/java/com/jambotronGroup/jambotron/system/SystemService.java b/src/main/java/com/jambotronGroup/jambotron/system/SystemService.java new file mode 100644 index 0000000..76c8036 --- /dev/null +++ b/src/main/java/com/jambotronGroup/jambotron/system/SystemService.java @@ -0,0 +1,12 @@ +package com.jambotronGroup.jambotron.system; + +import com.jambotronGroup.jambotron.model.Bean; + +import java.util.List; + +public interface SystemService { + List getLodedBeans(); + + List getLodedCustomBeans(); + +} diff --git a/src/main/java/com/jambotronGroup/jambotron/system/SystemServiceImpl.java b/src/main/java/com/jambotronGroup/jambotron/system/SystemServiceImpl.java new file mode 100644 index 0000000..d1f757d --- /dev/null +++ b/src/main/java/com/jambotronGroup/jambotron/system/SystemServiceImpl.java @@ -0,0 +1,55 @@ +package com.jambotronGroup.jambotron.system; + +import com.jambotronGroup.jambotron.JambotronApplication; +import com.jambotronGroup.jambotron.model.Bean; +import com.jambotronGroup.jambotron.utils.EntityLoggingConsumer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +@Service +public class SystemServiceImpl implements SystemService { + + @Autowired + private ApplicationContext applicationContext; + @Autowired + private Environment environment; + + private static final Logger logger = LoggerFactory.getLogger(SystemServiceImpl.class); + + + @Override + public List getLodedBeans() { + // Get all bean names from the application context and map them to Bean objects + List beans = Arrays.stream(applicationContext.getBeanDefinitionNames()).map( + name -> new Bean(name, applicationContext.getType(name).getName(),applicationContext.getApplicationName())) + + .toList(); + beans.forEach(new EntityLoggingConsumer(logger)); + return beans; + } + + @Override + public List getLodedCustomBeans() { + List beans = getLodedBeans(); + + beans = beans.stream() + .filter(bean -> bean.getName() != null && + bean.getType().contains( + environment.getRequiredProperty("spring.application.name") + ) + ) + .sorted((o1, o2) -> o1.getName().compareTo(o2.getName())) + .collect(Collectors.toList()); + + return beans; + } +} \ No newline at end of file diff --git a/src/main/java/com/jambotronGroup/jambotron/utils/EntityLoggingConsumer.java b/src/main/java/com/jambotronGroup/jambotron/utils/EntityLoggingConsumer.java new file mode 100644 index 0000000..73d4d83 --- /dev/null +++ b/src/main/java/com/jambotronGroup/jambotron/utils/EntityLoggingConsumer.java @@ -0,0 +1,22 @@ +package com.jambotronGroup.jambotron.utils; + +import org.slf4j.Logger; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +import java.util.function.Consumer; + + + +public class EntityLoggingConsumer implements Consumer { + + private Logger _logger; + public EntityLoggingConsumer(Logger logger) + { + _logger = logger; + } + + public void accept(Object o) { + _logger.info(o.toString()); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 1063fa9..66f0cf0 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,17 +1,48 @@ spring.application.name=jambotron -spring.datasource.url= jdbc:postgresql://localhost:5432/springangulardb +spring.datasource.url= jdbc:postgresql://localhost:5432/jambotronDB spring.datasource.username= admin spring.datasource.password= postgrespw -spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation= true +#spring.datasource.url=${SPRING_DATASOURCE_URL} +#spring.datasource.username=${SPRING_DATASOURCE_USERNAME} +#spring.datasource.password=${SPRING_DATASOURCE_PASSWORD} + + +#spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation= true spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.PostgreSQLDialect # Hibernate ddl auto (create, create-drop, validate, update) -spring.jpa.hibernate.ddl-auto= update +#spring.jpa.hibernate.ddl-auto= update + +spring.jpa.show-sql=true + # App Properties app.jwtSecret= ======================spring=back==================== app.jwtExpirationMs= 30000 app.jwtCookieName=springangularts app.origin=http://localhost:4200 + +spring.mvc.throw-exception-if-no-handler-found=true + +# Disable the default mappings +#spring.resources.add-mappings=false + +spring.resources.static-locations=classpath:/public +spring.resources.cache.period=31557600s # 1 year if you want +spa.default-file=classpath:/public/browser/index.html + + +spring.docker.compose.file=../Docker/docker-compose.yml + +spring.flyway.baseline-on-migrate=true +spring.flyway.validate-on-migrate=true + +spring.flyway.user=admin +spring.flyway.password=postgrespw +spring.flyway.url=jdbc:postgresql://localhost:5432/jambotronDB + + +spring.ai.zhipuai.base-url=https://open.bigmodel.cn/api/paas/v3 +spring.ai.zhipuai.api-key = 628447c8c65845a48a7226391464a2ea.Dw8ci6TiW0BRF5LI \ No newline at end of file diff --git a/src/main/resources/db/migration/V1__Init.sql b/src/main/resources/db/migration/V1__Init.sql new file mode 100644 index 0000000..4480b4e --- /dev/null +++ b/src/main/resources/db/migration/V1__Init.sql @@ -0,0 +1,7 @@ + +CREATE TABLE IF NOT EXISTS roles +( + id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + name character varying(20) COLLATE pg_catalog."default" + +); diff --git a/src/main/resources/db/migration/V2__init.sql b/src/main/resources/db/migration/V2__init.sql new file mode 100644 index 0000000..4a88861 --- /dev/null +++ b/src/main/resources/db/migration/V2__init.sql @@ -0,0 +1,14 @@ + + +CREATE TABLE IF NOT EXISTS users +( + id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + email character varying(50) COLLATE pg_catalog."default", + password character varying(120) COLLATE pg_catalog."default", + username character varying(20) COLLATE pg_catalog."default", + + CONSTRAINT uk6dotkott2kjsp8vw4d0m25fb7 UNIQUE (email), + CONSTRAINT ukr43af9ap4edm43mmtq01oddj6 UNIQUE (username) +); + + diff --git a/src/main/resources/db/migration/V3__init.sql b/src/main/resources/db/migration/V3__init.sql new file mode 100644 index 0000000..a4adedb --- /dev/null +++ b/src/main/resources/db/migration/V3__init.sql @@ -0,0 +1,25 @@ + +CREATE TABLE IF NOT EXISTS public.user_roles +( + user_id bigint NOT NULL, + role_id integer NOT NULL, + CONSTRAINT user_roles_pkey PRIMARY KEY (user_id, role_id), + CONSTRAINT fkh8ciramu9cc9q3qcqiv4ue8a6 FOREIGN KEY (role_id) + REFERENCES public.roles (id) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE NO ACTION, + CONSTRAINT fkhfh9dx7w3ubf1co1vdev94g3f FOREIGN KEY (user_id) + REFERENCES public.users (id) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE NO ACTION +); + + +CREATE TABLE IF NOT EXISTS public.tutorials +( + id bigint NOT NULL, + description character varying(255) COLLATE pg_catalog."default", + published boolean, + title character varying(255) COLLATE pg_catalog."default", + CONSTRAINT tutorials_pkey PRIMARY KEY (id) +); \ No newline at end of file diff --git a/src/main/resources/db/migration/V4__Init_data.sql b/src/main/resources/db/migration/V4__Init_data.sql new file mode 100644 index 0000000..b2f1629 --- /dev/null +++ b/src/main/resources/db/migration/V4__Init_data.sql @@ -0,0 +1,20 @@ + +INSERT INTO roles (id, name) OVERRIDING SYSTEM VALUE VALUES (1, 'ROLE_USER'); +INSERT INTO roles (id, name) OVERRIDING SYSTEM VALUE VALUES (2, 'ROLE_MODERATOR'); +INSERT INTO roles (id, name) OVERRIDING SYSTEM VALUE VALUES (3, 'ROLE_ADMIN'); + + +INSERT INTO users (id, email, password, username) +OVERRIDING SYSTEM VALUE +VALUES (1, 'liosha84@gmail.com', '$2a$10$qyoKXYSukha6XCjorTzoweF4Os1pwmwyzbaSsb3RCVB0LK6WLQKPC', 'Admin'); +INSERT INTO users (id, email, password, username) +OVERRIDING SYSTEM VALUE +VALUES (2, 'Moderator@gmail.com', '$2a$10$zLo5th8Xbfq.MM7y/dCRQu3Ud7HHyAwm.7.yS08ytJtkHMKrbOJlu', 'Moderator'); +INSERT INTO users (id, email, password, username) +OVERRIDING SYSTEM VALUE +VALUES (3, 'user@gmail.com', '$2a$10$2EcwYffteBF3GhVaf5qPB.I7XiHepDEauU5D4fx9fpBXMTZI/QnnC', 'User'); + + +INSERT INTO user_roles (user_id, role_id) OVERRIDING SYSTEM VALUE VALUES (3, 1); +INSERT INTO user_roles (user_id, role_id) OVERRIDING SYSTEM VALUE VALUES (1, 3); +INSERT INTO user_roles (user_id, role_id) OVERRIDING SYSTEM VALUE VALUES (2, 2); \ No newline at end of file diff --git a/src/main/resources/db/migration/V5__Fixes.sql b/src/main/resources/db/migration/V5__Fixes.sql new file mode 100644 index 0000000..8c1492e --- /dev/null +++ b/src/main/resources/db/migration/V5__Fixes.sql @@ -0,0 +1,2 @@ +ALTER TABLE IF EXISTS public.tutorials + ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY; \ No newline at end of file diff --git a/src/test/java/com/jambotronGroup/jambotron/JambotronApplicationTests.java b/src/test/java/com/jambotronGroup/jambotron/JambotronApplicationTests.java index cc0ed4d..b50ea52 100644 --- a/src/test/java/com/jambotronGroup/jambotron/JambotronApplicationTests.java +++ b/src/test/java/com/jambotronGroup/jambotron/JambotronApplicationTests.java @@ -3,11 +3,11 @@ package com.jambotronGroup.jambotron; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; -@SpringBootTest + class JambotronApplicationTests { - @Test - void contextLoads() { - } - + @Test + void contextLoads() { + // Test will pass if the application context loads successfully + } }