diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 00000000..459c1725 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,34 @@ +name: Backend server tests + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + tests: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Set up PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.1' + + - name: Install dependencies + run: cd backend-server && composer install --prefer-dist --no-progress --no-interaction + + - name: Copy .env + run: cd backend-server && cp .env.example .env + + - name: Generate key + run: cd backend-server && php artisan key:generate + + - name: Run tests + run: cd backend-server && vendor/bin/phpunit diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..33921112 --- /dev/null +++ b/Makefile @@ -0,0 +1,51 @@ +# Variables +DOCKER_COMPOSE = docker-compose + +# Colors +COLOR_RESET = \033[0m +COLOR_BOLD = \033[1m +COLOR_GREEN = \033[32m +COLOR_YELLOW = \033[33m + +# Targets +install: + @echo "$(COLOR_BOLD)=== Putting the services down (if already running) ===$(COLOR_RESET)" + $(DOCKER_COMPOSE) down --remove-orphans + + @echo "$(COLOR_BOLD)=== Setting up Docker environment ===$(COLOR_RESET)" + # Copy .env.example to .env for backend-server + # Show warning before continue, and wait for 10 secounds + @echo "$(COLOR_BOLD)=== This will overwrite your .env files, you still have some time to abort ===$(COLOR_RESET)" + @sleep 5 + @echo "$(COLOR_BOLD)=== Copying .env files ===$(COLOR_RESET)" + cp -n backend-server/.env.example backend-server/.env 2>/dev/null || true + cp -n common.env llm-server/.env 2>/dev/null || true + $(DOCKER_COMPOSE) build #--no-cache + $(DOCKER_COMPOSE) up -d #--force-recreate + @echo "$(COLOR_BOLD)=== Waiting for services to start (~20 seconds) ===$(COLOR_RESET)" + @sleep 20 + + @echo "$(COLOR_BOLD)=== Clearing backend server config cache ===$(COLOR_RESET)" + $(DOCKER_COMPOSE) exec backend-server php artisan config:cache + + @echo "$(COLOR_BOLD)=== Run backend server server migrations ===$(COLOR_RESET)" + $(DOCKER_COMPOSE) exec backend-server php artisan migrate --seed + $(DOCKER_COMPOSE) exec backend-server php artisan storage:link + $(DOCKER_COMPOSE) run -d backend-server php artisan queue:work --timeout=200 + + @echo "$(COLOR_BOLD)=== Installation completed ===$(COLOR_RESET)" + @echo "$(COLOR_BOLD)=== 🔥🔥 You can now access the dashboard at -> http://localhost:8000 ===$(COLOR_RESET)" + @echo "$(COLOR_BOLD)=== Enjoy! ===$(COLOR_RESET)" + +run-worker: + $(DOCKER_COMPOSE) exec backend-server php artisan queue:work --timeout=200 + +db-setup: + $(DOCKER_COMPOSE) exec backend-server php artisan migrate:fresh --seed + +down: + $(DOCKER_COMPOSE) down --remove-orphans + +exec-backend-server: + $(DOCKER_COMPOSE) exec backend-server bash +.PHONY: install down diff --git a/README.md b/README.md new file mode 100644 index 00000000..cc433c7b --- /dev/null +++ b/README.md @@ -0,0 +1,91 @@ + +[![](https://dcbadge.vercel.app/api/server/Q4DxvXGw?style=flat&compact=True)](https://discord.gg/Q4DxvXGw) + +![Tests](https://github.com/openchatai/OpenChat/actions/workflows/tests.yml/badge.svg) + + + +![](https://gcdnb.pbrd.co/images/gjX4atjx9uKT.png?o=1) + +------ +# 🔥 OpenChat + +**Important disclaimer:** This is an undergoing efforts to create a free & open source chatbot console that allows you to easily create unlimited chatbots using different models for your daily use. Our main goal is to make the interface simple and user-friendly for everyone. If you find this interesting, we would greatly appreciate your support in contributing to this project. We have a highly ambitious plan that we are determined to implement! + +---- +OpenChat is an everyday user chatbot console that simplifies the utilization of large language models. With the advancements in AI, the installation and usage of these models have become overwhelming. OpenChat aims to address this challenge by providing a two-step setup process to create a comprehensive chatbot console. It serves as a central hub for managing multiple customized chatbots. + +> Currently, OpenChat supports GPT models, and we are actively working on incorporating various open-source drivers that can be activated with a single click. + + + +https://github.com/gharbat/OpenChat/assets/32633162/2f0c4587-cd93-496c-8b1b-1ed8d8c162b4 + +## Try it out: +You can try it out on OpenChat.so (we use our own OpenAI/pinecone token for the demo, please be mindful on the usage, we will clear out bots every 3 hours) + +## 🏁 Current Features + +- Create unlimited local chatbots based on GPT-3 (and GPT-4 if available). +- Customize your chatbots by providing PDF files, websites, and soon, integrations with platforms like Notion, Confluence, and Office 365. +- Each chatbot has unlimited memory capacity, enabling seamless interaction with large files such as a 400-page PDF. +- Embed chatbots as widgets on your website or internal company tools. +- And much more! + +## 🛣️ Roadmap: +- [x] Create unlimited chatbots +- [x] Share chatbots via URL +- [x] Integrate chatbots on any website using JS (as a widget on the bottom right corner) +- [x] Support GPT-3 models +- [x] Support vector database to provide chatbots with larger memory +- [x] Accept websites as a data source +- [x] Accept PDF files as a data source +- [x] Support multiple data sources per chatbot +- [ ] Support Slack integration (allow users to connect chatbots with their Slack workspaces) +- [ ] Support Intercom integration (enable users to sync chat conversations with Intercom) +- [ ] Support offline open-source models (e.g., Alpaca, LLM drivers) +- [ ] Support Confluence, Notion, Office 365, and Google Workspace +- [ ] Refactor the codebase to be API ready +- [ ] Create a new UI designer for website-embedded chatbots +- [ ] Support custom input fields for chatbots +- [ ] Support pre-defined messages with a single click + +We love hearing from you! Got any cool ideas or requests? We're all ears! So, if you have something in mind, give us a shout! + + +## 🚀 Getting Started + +- To begin, clone this Git repository: + +```bash +git clone git@github.com:openchatai/OpenChat.git +``` + +- Update common.env with your keys: +``` +OPENAI_API_KEY=# you can get it from your account in openai.com +PINECONE_API_KEY=# you can get from "API Keys" tab in pinecone +PINECONE_ENVIRONMENT=# you can get it after creating your index in pinecone +PINECONE_INDEX_NAME=# you can get it after creating your index in pinecone +``` + +- Navigate to the repository folder and run the following command: +``` +make install +``` + +Once the installation is complete, you can access the OpenChat console at: http://localhost:8000 + + + +## ❤️ Thanks: +- To ![@mayooear](https://github.com/mayooear) for his work and tutorial on chatting with PDF files, we utilized a lot of his code in the LLM server. + + + +## Disclaimer: +We quickly built this project to validate the idea, so please excuse any shortcomings in the code. You may come across several areas that require enhancements, and we truly appreciate your support by opening issues, submitting pull requests, and providing suggestions. + + +## License +This project is licensed under the MIT License. diff --git a/backend-server/.editorconfig b/backend-server/.editorconfig new file mode 100644 index 00000000..8f0de65c --- /dev/null +++ b/backend-server/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[docker-compose.yml] +indent_size = 4 diff --git a/backend-server/.env.example b/backend-server/.env.example new file mode 100644 index 00000000..640f29dc --- /dev/null +++ b/backend-server/.env.example @@ -0,0 +1,29 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY= +APP_DEBUG=true + +APP_URL=http://localhost + +LOG_CHANNEL=stack +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +BROADCAST_DRIVER=log +CACHE_DRIVER=file +FILESYSTEM_DISK=local +SESSION_DRIVER=file +SESSION_LIFETIME=120 + +QUEUE_CONNECTION=database +DB_CONNECTION=mysql + +REDIS_HOST=redis +REDIS_PASSWORD=null +REDIS_PORT=6379 + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false diff --git a/backend-server/.gitattributes b/backend-server/.gitattributes new file mode 100644 index 00000000..fcb21d39 --- /dev/null +++ b/backend-server/.gitattributes @@ -0,0 +1,11 @@ +* text=auto eol=lf + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +/.github export-ignore +CHANGELOG.md export-ignore +.styleci.yml export-ignore diff --git a/backend-server/.gitignore b/backend-server/.gitignore new file mode 100644 index 00000000..7fe978f8 --- /dev/null +++ b/backend-server/.gitignore @@ -0,0 +1,19 @@ +/.phpunit.cache +/node_modules +/public/build +/public/hot +/public/storage +/storage/*.key +/vendor +.env +.env.backup +.env.production +.phpunit.result.cache +Homestead.json +Homestead.yaml +auth.json +npm-debug.log +yarn-error.log +/.fleet +/.idea +/.vscode diff --git a/backend-server/Dockerfile b/backend-server/Dockerfile new file mode 100644 index 00000000..0fc71a89 --- /dev/null +++ b/backend-server/Dockerfile @@ -0,0 +1,36 @@ +# Use an official PHP runtime as the base image +FROM php:8.1-cli + +# Install system dependencies +RUN apt-get update && apt-get install -y \ + libpq-dev \ + libzip-dev \ + zip \ + unzip \ + git + +RUN docker-php-ext-install pdo pdo_mysql + +# Set the working directory +WORKDIR /var/www/html + +# Copy the project files to the container +COPY . . + +# Copy the .env file (assuming it's in the same directory as the Dockerfile) +COPY .env .env + +# Install Composer +RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer + +# Install Composer dependencies +RUN composer install --no-plugins --no-scripts + +# Generate the Laravel application key +RUN php artisan key:generate + +# Expose the container's port 8000 (default for `php artisan serve`) +EXPOSE 8000 + +# Start the Laravel development server +CMD php artisan serve --host=0.0.0.0 --port=8000 diff --git a/backend-server/app/Console/Kernel.php b/backend-server/app/Console/Kernel.php new file mode 100644 index 00000000..e6b9960e --- /dev/null +++ b/backend-server/app/Console/Kernel.php @@ -0,0 +1,27 @@ +command('inspire')->hourly(); + } + + /** + * Register the commands for the application. + */ + protected function commands(): void + { + $this->load(__DIR__.'/Commands'); + + require base_path('routes/console.php'); + } +} diff --git a/backend-server/app/Exceptions/Handler.php b/backend-server/app/Exceptions/Handler.php new file mode 100644 index 00000000..56af2640 --- /dev/null +++ b/backend-server/app/Exceptions/Handler.php @@ -0,0 +1,30 @@ + + */ + protected $dontFlash = [ + 'current_password', + 'password', + 'password_confirmation', + ]; + + /** + * Register the exception handling callbacks for the application. + */ + public function register(): void + { + $this->reportable(function (Throwable $e) { + // + }); + } +} diff --git a/backend-server/app/Http/Controllers/AuthController.php b/backend-server/app/Http/Controllers/AuthController.php new file mode 100644 index 00000000..2b81b63c --- /dev/null +++ b/backend-server/app/Http/Controllers/AuthController.php @@ -0,0 +1,94 @@ +check()) { + return redirect()->route('index'); + } + + return view('marketing.signin'); + } + + public function marketingRegister() + { + // check if the user is already logged in + if (auth()->check()) { + return redirect()->route('index'); + } + + return view('marketing.signup'); + } + + public function register(Request $request) + { + // Validate the request... + $validatedData = $request->validate(['name' => 'required|max:55', 'email' => 'email|required', 'password' => 'required']); + + // Create user + $validatedData['password'] = bcrypt($request->password); + $user = User::create($validatedData); + + // Login the user + Auth::login($user); + + // Redirect to home + return redirect()->route('onboarding.welcome'); + } + + public function login(Request $request) + { + // Validate the request... + $validatedData = $request->validate(['email' => 'email|required', 'password' => 'required']); + + // Login the user + if (Auth::attempt($validatedData)) { + return redirect()->route('index'); + } + + // Redirect to log in + return redirect()->route('marketing.login')->with('error', 'Invalid credentials'); + } + + + public function redirectToGoogle() + { + return Socialite::driver('google')->redirect(); + } + + public function handleGoogleCallback() + { + $googleUser = Socialite::driver('google')->user(); + + + // Check if the user already exists in the database + $user = User::where('email', $googleUser->getEmail())->first(); + + if (!$user) { + $this->initiateUserAccount($googleUser->getName(), $googleUser->getEmail(), null, 'google', $googleUser->getAvatar()); + } else { + auth()->login($user); + } + // Make the user data is updated as it is from Google + $user->name = $googleUser->getName(); + $user->avatar = $googleUser->getAvatar(); + $user->save(); + + return redirect()->route('index'); + } + + public function logout() + { + Auth::logout(); + return redirect()->route('marketing'); + } +} diff --git a/backend-server/app/Http/Controllers/ChatbotController.php b/backend-server/app/Http/Controllers/ChatbotController.php new file mode 100644 index 00000000..d96c1ee0 --- /dev/null +++ b/backend-server/app/Http/Controllers/ChatbotController.php @@ -0,0 +1,181 @@ + Chatbot::all(), + ]); + } + + /** + * Create a chatbot via website flow. + * + * @param \App\Http\Requests\CreateChatbotRequest $request + * @return \Illuminate\Http\RedirectResponse + */ + public function createViaWebsiteFlow(CreateChatbotRequest $request): RedirectResponse + { + // Create a new Chatbot instance + $chatbot = new Chatbot(); + + // Set the properties of the chatbot + $chatbot->setId(Uuid::uuid4()); + $chatbot->setName($request->getName()); + $chatbot->setToken(Str::random(20)); + $chatbot->setWebsite($request->getWebsite()); + $chatbot->setPromptMessage($request->getPromptMessage()); + + // Save the chatbot to the database + $chatbot->save(); + + // Trigger the ChatbotWasCreated event + event(new ChatbotWasCreated( + $chatbot->getId(), + $chatbot->getName(), + $chatbot->getWebsite(), + $chatbot->getPromptMessage(), + )); + + // Redirect to the onboarding configuration page + return redirect()->route('onboarding.config', ['id' => $chatbot->getId()->toString()]); + } + + /** + * Create a chatbot via PDF flow. + * + * @param \App\Http\Requests\CreateChatbotViaPdfFlowRequest $request + * @return \Illuminate\Http\RedirectResponse + */ + public function createViaPdfFlow(CreateChatbotViaPdfFlowRequest $request): RedirectResponse + { + // Create a new Chatbot instance + $chatbot = new Chatbot(); + + // Set the properties of the chatbot + $chatbot->setId(Uuid::uuid4()); + $chatbot->setName($request->getName()); + $chatbot->setToken(Str::random(20)); + $chatbot->setPromptMessage($request->getPromptMessage()); + + // Save the chatbot to the database + $chatbot->save(); + + // Get the PDF files from the request + $files = $request->file('pdffiles'); + + // Handle the PDF data source + $dataSource = (new HandlePdfDataSource($chatbot, $files))->handle(); // todo this should be moved to an event listener similar to the one in the previous method + + // Trigger the PdfDataSourceWasAdded event + event(new PdfDataSourceWasAdded($chatbot->getId(), $dataSource->getId())); + + // Redirect to the onboarding configuration page + return redirect()->route('onboarding.config', ['id' => $chatbot->getId()->toString()]); + } + + /** + * Update character settings for a chatbot. + * + * @param \App\Http\Requests\UpdateCharacterSettingsRequest $request + * @return \Illuminate\Http\RedirectResponse + */ + public function updateCharacterSettings(UpdateCharacterSettingsRequest $request): RedirectResponse + { + // Get the chatbot ID from the request + $chatbotId = $request->getChatbotId(); + + // Find the chatbot by ID + $chatbot = Chatbot::where('id', $chatbotId->toString())->firstOrFail(); + + // Create or update the character settings + $chatbot->crateOrUpdateSetting('character_name', $request->getCharacterName()); + + // Redirect to the onboarding done page + return redirect()->route('onboarding.done', ['id' => $chatbot->getId()->toString()]); + } + + /** + * Send a chat message to a chatbot. + * + * @param \App\Http\Requests\SendChatMessageRequest $request + * @param string $token + * @return \Illuminate\Http\JsonResponse + */ + public function sendMessage(SendChatMessageRequest $request, $token): JsonResponse + { + // Find the chatbot by token + $bot = Chatbot::where('token', $token)->firstOrFail(); + + // Get the question and history from the request + $question = $request->getMessage(); + $history = $request->getHistory(); + + // Remove null and empty values and empty arrays or objects from the history + $history = array_filter($history, function ($value) { + return !is_null($value) && $value !== '' && $value !== [] && $value !== (object) []; + }); + + // Call the API to send the message to the chatbot with a timeout of 5 seconds + $response = Http::connectTimeout(60)->post("http://llm-server:3000/api/chat", [ + 'question' => $question, + 'history' => $history, + 'namespace' => $bot->getId()->toString(), + ]); + + if ($response->failed()) { + return response()->json([ + 'error' => 'Something went wrong', + ], 500); + } + + // Create a ChatbotResponse instance from the API response + $botResponse = new ChatbotResponse($response->json()); + + // Return the response from the chatbot + return response()->json([ + 'botReply' => $botResponse->getBotReply(), + 'sources' => $botResponse->getSourceDocuments(), + ]); + } + + /** + * Display the chat view for a chatbot. + * + * @param string $token + * @return \Illuminate\View\View + */ + public function getChatView($token) + { + // Find the chatbot by token + $bot = Chatbot::where('token', $token)->firstOrFail(); + + // Render the chat view with the chatbot data + return view('chat', [ + 'bot' => $bot, + ]); + } +} diff --git a/backend-server/app/Http/Controllers/ChatbotSettingController.php b/backend-server/app/Http/Controllers/ChatbotSettingController.php new file mode 100644 index 00000000..27568fd2 --- /dev/null +++ b/backend-server/app/Http/Controllers/ChatbotSettingController.php @@ -0,0 +1,148 @@ +firstOrFail(); + + return view('settings', [ + 'bot' => $bot, + ]); + } + + /** + * Update the general settings for a chatbot. + * + * @param \Illuminate\Http\Request $request + * @param string $id + * @return \Illuminate\Http\RedirectResponse + * + * @throws \Illuminate\Validation\ValidationException + */ + public function generalSettingsUpdate(Request $request, $id) + { + // Find the chatbot by ID + $bot = Chatbot::where('id', $id)->firstOrFail(); + + // Validate the request + $this->validate($request, [ + 'name' => 'required', + ]); + + // Update the chatbot name + $bot->setName($request->input('name')); + $bot->save(); + + return redirect()->route('chatbot.settings', ['id' => $bot->getId()])->with('success', 'Settings updated!'); + } + + /** + * Display the data settings page for a chatbot. + * + * @param \Illuminate\Http\Request $request + * @param string $id + * @return \Illuminate\View\View + */ + public function dataSettings(Request $request, $id) + { + // Find the chatbot by ID + $bot = Chatbot::where('id', $id)->firstOrFail(); + + // Get website data sources and PDF data sources for the chatbot + $websiteDataSources = $bot->getWebsiteDataSources()->get(); + $pdfDataSources = $bot->getPdfFilesDataSources()->get(); + + return view('settings-data', [ + 'bot' => $bot, + 'websiteDataSources' => $websiteDataSources, + 'pdfDataSources' => $pdfDataSources, + ]); + } + + /** + * Display the analytics settings page for a chatbot. + * + * @param \Illuminate\Http\Request $request + * @param string $id + * @return \Illuminate\View\View + */ + public function analyticsSettings(Request $request, $id) + { + // Find the chatbot by ID + $bot = Chatbot::where('id', $id)->firstOrFail(); + + // Get website data sources for the chatbot + $dataSources = $bot->getWebsiteDataSources()->get(); + + return view('settings-analytics', [ + 'bot' => $bot, + 'dataSources' => $dataSources, + ]); + } + + /** + * Display the integrations settings page for a chatbot. + * + * @param \Illuminate\Http\Request $request + * @param string $id + * @return \Illuminate\View\View + */ + public function integrationsSettings(Request $request, $id) + { + // Find the chatbot by ID + $bot = Chatbot::where('id', $id)->firstOrFail(); + + return view('settings-integrations', [ + 'bot' => $bot, + ]); + } + + /** + * Display the data sources updates widget for a chatbot. + * + * @param string $id + * @return \Illuminate\View\View + */ + public function dataSourcesUpdates($id) + { + // Find the chatbot by ID + $bot = Chatbot::where('id', $id)->firstOrFail(); + + // Get website data sources for the chatbot + $dataSources = $bot->getWebsiteDataSources()->get(); + + return view('widgets.data-sources-updates', [ + 'dataSources' => $dataSources, + ]); + } + + /** + * Display the theme settings page for a chatbot. + * + * @param string $id + * @return \Illuminate\View\View + */ + public function themeSettings($id) + { + // Find the chatbot by ID + $bot = Chatbot::where('id', $id)->firstOrFail(); + + return view('settings-theme', [ + 'bot' => $bot, + ]); + } +} diff --git a/backend-server/app/Http/Controllers/Controller.php b/backend-server/app/Http/Controllers/Controller.php new file mode 100644 index 00000000..77ec359a --- /dev/null +++ b/backend-server/app/Http/Controllers/Controller.php @@ -0,0 +1,12 @@ +firstOrFail(); + $files = $request->file('pdffiles'); + $dataSource = (new HandlePdfDataSource($bot, $files))->handle(); + event(new PdfDataSourceWasAdded($bot->getId(), $dataSource->getId())); + + return redirect()->route('chatbot.settings-data', ['id' => $bot->getId()])->with('success', 'Your files have been uploaded successfully, we are training the model now, it should take around 5 minutes to reflect.'); + } + + public function show($id) + { + /** @var Chatbot $bot */ + $bot = Chatbot::where('id', $id)->firstOrFail(); + $pdfDataSources = $bot->getPdfFilesDataSources()->get(); + return view('onboarding.other-data-sources-pdf', ['bot' => $bot, 'pdfDataSources' => $pdfDataSources]); + } + +} diff --git a/backend-server/app/Http/Controllers/WebsiteDataSourceController.php b/backend-server/app/Http/Controllers/WebsiteDataSourceController.php new file mode 100644 index 00000000..865afffc --- /dev/null +++ b/backend-server/app/Http/Controllers/WebsiteDataSourceController.php @@ -0,0 +1,39 @@ +firstOrFail(); + return view('onboarding.other-data-sources-website', ['bot' => $bot]); + } + + public function create(AddWebsiteDataSourceRequest $request, $id){ + /** @var Chatbot $bot */ + $bot = Chatbot::where('id', $id)->firstOrFail(); + + $dataSource = new WebsiteDataSource(); + $dataSource->setId(Uuid::uuid4()); + $dataSource->setChatbotId($bot->getId()); + $dataSource->setRootUrl($request->getWebsite()); + $dataSource->setIcon($this->getLogo($request->getWebsite())); + $dataSource->save(); + + event(new WebsiteDataSourceWasAdded($bot->getId(), $dataSource->getId())); + + return redirect()->route('chatbot.settings-data', ['id' => $bot->getId()->toString()]); + } +} diff --git a/backend-server/app/Http/Enums/ChatbotStatusType.php b/backend-server/app/Http/Enums/ChatbotStatusType.php new file mode 100644 index 00000000..1c131d03 --- /dev/null +++ b/backend-server/app/Http/Enums/ChatbotStatusType.php @@ -0,0 +1,73 @@ + 'Draft', + self::PUBLISHED => 'Published', + self::ARCHIVED => 'Archived', + ]; + } + + public function getLabel(): string + { + return self::getLabels()[$this->getStatus()]; + } + + public static function getValues(): array + { + return array_keys(self::getLabels()); + } + + public static function isValid(string $type): bool + { + return in_array($type, self::getValues()); + } + + public function getStatus(): string + { + return $this->status; + } + + public function isDraft(): bool + { + return $this->getStatus() === self::DRAFT; + } + + public function isPublished(): bool + { + return $this->getStatus() === self::PUBLISHED; + } + + public function isArchived(): bool + { + return $this->getStatus() === self::ARCHIVED; + } + + +} diff --git a/backend-server/app/Http/Enums/WebsiteDataSourceStatusType.php b/backend-server/app/Http/Enums/WebsiteDataSourceStatusType.php new file mode 100644 index 00000000..7a169935 --- /dev/null +++ b/backend-server/app/Http/Enums/WebsiteDataSourceStatusType.php @@ -0,0 +1,80 @@ + 'Pending', + self::IN_PROGRESS => 'In Progress', + self::COMPLETED => 'Completed', + self::FAILED => 'Failed', + ]; + } + + public static function getLabels(): array + { + return [ + self::PENDING => 'Pending', + self::IN_PROGRESS => 'In Progress', + self::COMPLETED => 'Completed', + self::FAILED => 'Failed', + ]; + } + + public function getLabel(): string + { + return self::getLabels()[$this->getStatus()]; + } + + public static function getValues(): array + { + return array_keys(self::getLabels()); + } + + public static function isValid(string $type): bool + { + return in_array($type, self::getValues()); + } + + public function getStatus(): string + { + return $this->status; + } + + public function isPending(): bool + { + return $this->status === self::PENDING; + } + + public function isInProgress(): bool + { + return $this->status === self::IN_PROGRESS; + } + + public function isCompleted(): bool + { + return $this->status === self::COMPLETED; + } + + public function isFailed(): bool + { + return $this->status === self::FAILED; + } +} diff --git a/backend-server/app/Http/Events/ChatbotWasCreated.php b/backend-server/app/Http/Events/ChatbotWasCreated.php new file mode 100644 index 00000000..98d9f374 --- /dev/null +++ b/backend-server/app/Http/Events/ChatbotWasCreated.php @@ -0,0 +1,41 @@ +chatbotId; + } + + public function getChatbotName(): string + { + return $this->chatbotName; + } + + public function getChatbotWebsite(): ?string + { + return $this->chatbotWebsite; + } + + public function getChatbotPromptMessage(): string + { + return $this->chatbotPromptMessage; + } +} diff --git a/backend-server/app/Http/Events/PdfDataSourceWasAdded.php b/backend-server/app/Http/Events/PdfDataSourceWasAdded.php new file mode 100644 index 00000000..ff1865e3 --- /dev/null +++ b/backend-server/app/Http/Events/PdfDataSourceWasAdded.php @@ -0,0 +1,29 @@ +chatbotId; + } + + public function getPdfDataSourceId(): UuidInterface + { + return $this->pdfDataSourceId; + } +} diff --git a/backend-server/app/Http/Events/WebsiteDataSourceCrawlingWasCompleted.php b/backend-server/app/Http/Events/WebsiteDataSourceCrawlingWasCompleted.php new file mode 100644 index 00000000..ecb6fe03 --- /dev/null +++ b/backend-server/app/Http/Events/WebsiteDataSourceCrawlingWasCompleted.php @@ -0,0 +1,29 @@ +chatbotId; + } + + public function getWebsiteDataSourceId(): UuidInterface + { + return $this->websiteDataSourceId; + } +} diff --git a/backend-server/app/Http/Events/WebsiteDataSourceWasAdded.php b/backend-server/app/Http/Events/WebsiteDataSourceWasAdded.php new file mode 100644 index 00000000..d47b0561 --- /dev/null +++ b/backend-server/app/Http/Events/WebsiteDataSourceWasAdded.php @@ -0,0 +1,29 @@ +chatbotId; + } + + public function getWebsiteDataSourceId(): UuidInterface + { + return $this->websiteDataSourceId; + } +} diff --git a/backend-server/app/Http/GetLogoFromUrlTrait.php b/backend-server/app/Http/GetLogoFromUrlTrait.php new file mode 100644 index 00000000..6f227f11 --- /dev/null +++ b/backend-server/app/Http/GetLogoFromUrlTrait.php @@ -0,0 +1,38 @@ +get('https://logo.clearbit.com/' . $domain); + + // Check if request was successful + if ($response->getStatusCode() == 200) { + // Generate hashed name for logo file + $logoName = md5($domain) . '.png'; + + // Store logo file using Laravel's Storage + Storage::disk('public')->put($logoName, $response->getBody()); + + // Return logo file name + return $logoName; + } else { + return null; + } + } catch (Exception $e) { + return null; + } + } +} diff --git a/backend-server/app/Http/Interfaces/DataSourceInterface.php b/backend-server/app/Http/Interfaces/DataSourceInterface.php new file mode 100644 index 00000000..6d53fef4 --- /dev/null +++ b/backend-server/app/Http/Interfaces/DataSourceInterface.php @@ -0,0 +1,8 @@ + + */ + protected $middleware = [ + // \App\Http\Middleware\TrustHosts::class, + \App\Http\Middleware\TrustProxies::class, + \Illuminate\Http\Middleware\HandleCors::class, + \App\Http\Middleware\PreventRequestsDuringMaintenance::class, + \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, + \App\Http\Middleware\TrimStrings::class, + \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, + ]; + + /** + * The application's route middleware groups. + * + * @var array> + */ + protected $middlewareGroups = [ + 'web' => [ + \App\Http\Middleware\EncryptCookies::class, + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, + \Illuminate\Session\Middleware\StartSession::class, + \Illuminate\View\Middleware\ShareErrorsFromSession::class, + \App\Http\Middleware\VerifyCsrfToken::class, + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + + 'api' => [ + // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, + \Illuminate\Routing\Middleware\ThrottleRequests::class.':api', + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + ]; + + /** + * The application's middleware aliases. + * + * Aliases may be used instead of class names to conveniently assign middleware to routes and groups. + * + * @var array + */ + protected $middlewareAliases = [ + 'auth' => \App\Http\Middleware\Authenticate::class, + 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, + 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class, + 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, + 'can' => \Illuminate\Auth\Middleware\Authorize::class, + 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, + 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'signed' => \App\Http\Middleware\ValidateSignature::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + ]; +} diff --git a/backend-server/app/Http/Listeners/CreateWebsiteDataSourceIfNeeded.php b/backend-server/app/Http/Listeners/CreateWebsiteDataSourceIfNeeded.php new file mode 100644 index 00000000..bb67d021 --- /dev/null +++ b/backend-server/app/Http/Listeners/CreateWebsiteDataSourceIfNeeded.php @@ -0,0 +1,38 @@ +getChatbotWebsite()) { + return; + } + + $botId = $event->getChatbotId(); + + $dataSource = new WebsiteDataSource(); + $dataSource->setId(Uuid::uuid4()); + $dataSource->setChatbotId($botId); + $dataSource->setRootUrl($event->getChatbotWebsite()); + $dataSource->setIcon($this->getLogo($event->getChatbotWebsite())); + $dataSource->save(); + + + event(new WebsiteDataSourceWasAdded($botId, $dataSource->getId())); + } + +} diff --git a/backend-server/app/Http/Listeners/IngestPdfDataSource.php b/backend-server/app/Http/Listeners/IngestPdfDataSource.php new file mode 100644 index 00000000..efa89c23 --- /dev/null +++ b/backend-server/app/Http/Listeners/IngestPdfDataSource.php @@ -0,0 +1,48 @@ +getChatbotId(); + $pdfDataSourceId = $event->getPdfDataSourceId(); + + /** @var PdfDataSource $pdfDataSource */ + $pdfDataSource = PdfDataSource::where('id', $pdfDataSourceId)->firstOrFail(); + $files = $pdfDataSource->getFiles(); + + $requestBody = [ + 'type' => 'pdf', + 'shared_folder' => $pdfDataSource->getFolderName(), + 'namespace' => $botId, + ]; + + // Call to ingest service endpoint + $client = new Client(); + $response = $client->request('POST', "http://llm-server:3000/api/ingest", [ + 'json' => $requestBody, + ]); + + if ($response->getStatusCode() !== 200) { + throw new Exception('Ingest service returned an error: ' . $response->getBody()->getContents()); + } + } +} diff --git a/backend-server/app/Http/Listeners/IngestWebsiteDataSource.php b/backend-server/app/Http/Listeners/IngestWebsiteDataSource.php new file mode 100644 index 00000000..8c77ecf9 --- /dev/null +++ b/backend-server/app/Http/Listeners/IngestWebsiteDataSource.php @@ -0,0 +1,47 @@ +getChatbotId(); + $websiteDataSourceId = $event->getWebsiteDataSourceId(); + + /** @var WebsiteDataSource $websiteDataSource */ + $websiteDataSource = WebsiteDataSource::find($websiteDataSourceId); + + $requestBody = [ + 'type' => 'website', + 'shared_folder' => $websiteDataSourceId, + 'namespace' => $botId, + ]; + + // Call to ingest service endpoint + $client = new Client(); + // @todo - this is not optimal, we should use .env + $response = $client->request('POST', "http://llm-server:3000/api/ingest", ['json' => $requestBody,]); + + if ($response->getStatusCode() !== 200) { + throw new Exception('Ingest service returned an error: ' . $response->getBody()->getContents()); + } + } +} diff --git a/backend-server/app/Http/Listeners/StartRecursiveCrawler.php b/backend-server/app/Http/Listeners/StartRecursiveCrawler.php new file mode 100644 index 00000000..b684fb7f --- /dev/null +++ b/backend-server/app/Http/Listeners/StartRecursiveCrawler.php @@ -0,0 +1,225 @@ +getWebsiteDataSourceId()); + $chatbotId = $event->getChatbotId(); + + if($dataSource->getCrawlingStatus()->isCompleted()) { + return; + } + + $rootUrl = $dataSource->getRootUrl(); + $url = $rootUrl; + + // Initialize an empty array to store the crawled URLs + $crawledUrls = []; + + // Set the crawling status to "in progress" + $dataSource->setCrawlingStatus(WebsiteDataSourceStatusType::IN_PROGRESS); + $dataSource->save(); + + // Start crawling from the root URL + $this->crawl($url, $crawledUrls, 15, $rootUrl, $chatbotId, $dataSource->getId()); + + // Set the crawling status to "completed" + $dataSource->setCrawlingStatus(WebsiteDataSourceStatusType::COMPLETED); + $dataSource->save(); + + event(new WebsiteDataSourceCrawlingWasCompleted($chatbotId, $dataSource->getId())); + } + + private function storeOnLocalDesk($htmlPage, $fileName, $folderName) + { + $path = $folderName . '/' . $fileName; + Storage::disk('shared_volume')->put($path, $htmlPage); + } + + private function crawl($url, &$crawledUrls, $maxPages, $rootUrl, $chatbotId, $dataSourceId): void + { + // Check if the maximum page limit has been reached + if (count($crawledUrls) >= $maxPages) { + return; + } + + // Check if the URL has already been crawled + if (in_array($url, $crawledUrls)) { + return; + } + + // Add the current URL to the crawled URLs list + $crawledUrls[] = $url; + + try { + // Send an HTTP GET request to the URL + $client = new Client(); + $response = $client->get($url); + + // Retrieve the HTML content of the page + $html = $response->getBody(); + + // Store the crawled page content in the database + $this->storeCrawledPageContentToDatabase($url, $response, $chatbotId, $dataSourceId, $html); + + // Extract all the links from the HTML content + $links = $this->extractLinks($html, $rootUrl); + + // Recursively crawl each extracted link + foreach ($links as $link) { + // Crawl + $this->crawl($link, $crawledUrls, $maxPages, $rootUrl, $chatbotId, $dataSourceId); + + // Update crawling progress + $progress = $this->calculateCrawlingProgress(count($crawledUrls), $maxPages); + $this->updateCrawlingProgress($chatbotId, $dataSourceId, $progress); + } + } catch (Exception|GuzzleException $e) { + + } + } + + public function storeCrawledPageContentToDatabase(string $url, ResponseInterface $response, UuidInterface $chatbotId, UuidInterface $dataSourceId, ?string $html): void + { + $textPath = $dataSourceId . "/" . Str::random() . ".txt"; + $normalizedText = $this->getNormalizedContent($response->getBody()); + $this->storeOnLocalDesk($normalizedText, $textPath, $dataSourceId); + + $page = new CrawledPages(); + $page->setUrl($url); + $page->setContent($response->getBody()); + $page->setStatusCode($response->getStatusCode()); + $page->setNormalizedContent($this->getNormalizedContent($response->getBody())); + $page->setChatbotId($chatbotId); + $page->setTitle($this->getCrawledPageTitle($response->getBody())); + $page->setId(Uuid::uuid4()); + $page->setWebsiteDataSourceId($dataSourceId); + $page->save(); + } + + private function getNormalizedContent($html): string + { + // Remove inline script and style tags and their contents + $html = preg_replace('/)<[^<]*)*<\/script>/i', '', $html); + $html = preg_replace('/)<[^<]*)*<\/style>/i', '', $html); + + // Remove all HTML tags except for line break and paragraph tags + $html = strip_tags($html, '

'); + + // Replace line breaks and paragraphs with new lines + $html = preg_replace('/<(br|p)[^>]*>/i', "\n", $html); + + // Remove extra whitespace and normalize new lines + $html = preg_replace('/\s+/', ' ', $html); + $html = preg_replace('/\n\s*\n/', "\n", $html); + + // Trim leading and trailing whitespace + return trim($html); + } + + private function getCrawledPageTitle(string $html): ?string + { + $dom = new DOMDocument(); + libxml_use_internal_errors(true); // Disable error reporting for invalid HTML + $dom->loadHTML($html); + libxml_clear_errors(); + + $titleElements = $dom->getElementsByTagName('title'); + if ($titleElements->length > 0) { + $title = $titleElements->item(0)->textContent; + $title = trim($title); + + // Decode any HTML entities in the title + return html_entity_decode($title, ENT_QUOTES | ENT_HTML5, 'UTF-8'); + } + + return null; // Return null if no title element was found + } + + private function extractLinks($html, $rootUrl): array + { + // Use regular expressions or an HTML parsing library + // to extract the URLs from the HTML content. + // Here's a simple example using regular expressions: + + $pattern = '/]*)href="([^"]*)"/i'; + preg_match_all($pattern, $html, $matches); + + // Extract the URLs from the matches + $urls = $matches[1]; + + $links = []; + + foreach ($urls as $url) { + if (str_starts_with($url, 'http')) { + // Full URL starting with "http" + $links[] = $url; + } elseif (str_starts_with($url, '/')) { + // URL starting with "/" + $parsedRoot = parse_url($rootUrl); + $rootHost = $parsedRoot['scheme'] . '://' . $parsedRoot['host']; + $links[] = $rootHost . $url; + } + } + + // Remove any duplicate URLs + $links = array_unique($links); + + // Remove any URL that does not belong to the same root URL host + return array_filter($links, function ($url) use ($rootUrl) { + $urlHost = $this->removeWwwPrefix(parse_url($url, PHP_URL_HOST)); + $rootHost = $this->removeWwwPrefix(parse_url($rootUrl, PHP_URL_HOST)); + return $urlHost === $rootHost; + }); + } + + + private function removeWwwPrefix($host): array|string|null + { + return preg_replace('/^www\./', '', $host); + } + + public function calculateCrawlingProgress($crawledPages, $maxPages) + { + if ($maxPages <= 0) { + return 0; // Avoid division by zero + } + + $progress = ($crawledPages / $maxPages) * 100; + // Cap the progress at 100% + + return min($progress, 100); + } + + public function updateCrawlingProgress($chatbotId, $dataSourceId, $progress): void + { + /** @var WebsiteDataSource $dataSource */ + $dataSource = WebsiteDataSource::find($dataSourceId); + $dataSource->setCrawlingProgress($progress); + $dataSource->save(); + } +} diff --git a/backend-server/app/Http/Middleware/Authenticate.php b/backend-server/app/Http/Middleware/Authenticate.php new file mode 100644 index 00000000..d4ef6447 --- /dev/null +++ b/backend-server/app/Http/Middleware/Authenticate.php @@ -0,0 +1,17 @@ +expectsJson() ? null : route('login'); + } +} diff --git a/backend-server/app/Http/Middleware/EncryptCookies.php b/backend-server/app/Http/Middleware/EncryptCookies.php new file mode 100644 index 00000000..867695bd --- /dev/null +++ b/backend-server/app/Http/Middleware/EncryptCookies.php @@ -0,0 +1,17 @@ + + */ + protected $except = [ + // + ]; +} diff --git a/backend-server/app/Http/Middleware/IframeMiddleware.php b/backend-server/app/Http/Middleware/IframeMiddleware.php new file mode 100644 index 00000000..f083b6f9 --- /dev/null +++ b/backend-server/app/Http/Middleware/IframeMiddleware.php @@ -0,0 +1,24 @@ +headers->set('X-Frame-Options', 'ALLOW-FROM ' . implode(' ', $domains), false); + return $response; + } +} diff --git a/backend-server/app/Http/Middleware/PreventRequestsDuringMaintenance.php b/backend-server/app/Http/Middleware/PreventRequestsDuringMaintenance.php new file mode 100644 index 00000000..74cbd9a9 --- /dev/null +++ b/backend-server/app/Http/Middleware/PreventRequestsDuringMaintenance.php @@ -0,0 +1,17 @@ + + */ + protected $except = [ + // + ]; +} diff --git a/backend-server/app/Http/Middleware/RedirectIfAuthenticated.php b/backend-server/app/Http/Middleware/RedirectIfAuthenticated.php new file mode 100644 index 00000000..afc78c4e --- /dev/null +++ b/backend-server/app/Http/Middleware/RedirectIfAuthenticated.php @@ -0,0 +1,30 @@ +check()) { + return redirect(RouteServiceProvider::HOME); + } + } + + return $next($request); + } +} diff --git a/backend-server/app/Http/Middleware/TrimStrings.php b/backend-server/app/Http/Middleware/TrimStrings.php new file mode 100644 index 00000000..88cadcaa --- /dev/null +++ b/backend-server/app/Http/Middleware/TrimStrings.php @@ -0,0 +1,19 @@ + + */ + protected $except = [ + 'current_password', + 'password', + 'password_confirmation', + ]; +} diff --git a/backend-server/app/Http/Middleware/TrustHosts.php b/backend-server/app/Http/Middleware/TrustHosts.php new file mode 100644 index 00000000..c9c58bdd --- /dev/null +++ b/backend-server/app/Http/Middleware/TrustHosts.php @@ -0,0 +1,20 @@ + + */ + public function hosts(): array + { + return [ + $this->allSubdomainsOfApplicationUrl(), + ]; + } +} diff --git a/backend-server/app/Http/Middleware/TrustProxies.php b/backend-server/app/Http/Middleware/TrustProxies.php new file mode 100644 index 00000000..3391630e --- /dev/null +++ b/backend-server/app/Http/Middleware/TrustProxies.php @@ -0,0 +1,28 @@ +|string|null + */ + protected $proxies; + + /** + * The headers that should be used to detect proxies. + * + * @var int + */ + protected $headers = + Request::HEADER_X_FORWARDED_FOR | + Request::HEADER_X_FORWARDED_HOST | + Request::HEADER_X_FORWARDED_PORT | + Request::HEADER_X_FORWARDED_PROTO | + Request::HEADER_X_FORWARDED_AWS_ELB; +} diff --git a/backend-server/app/Http/Middleware/ValidateSignature.php b/backend-server/app/Http/Middleware/ValidateSignature.php new file mode 100644 index 00000000..093bf64a --- /dev/null +++ b/backend-server/app/Http/Middleware/ValidateSignature.php @@ -0,0 +1,22 @@ + + */ + protected $except = [ + // 'fbclid', + // 'utm_campaign', + // 'utm_content', + // 'utm_medium', + // 'utm_source', + // 'utm_term', + ]; +} diff --git a/backend-server/app/Http/Middleware/VerifyCsrfToken.php b/backend-server/app/Http/Middleware/VerifyCsrfToken.php new file mode 100644 index 00000000..9e865217 --- /dev/null +++ b/backend-server/app/Http/Middleware/VerifyCsrfToken.php @@ -0,0 +1,17 @@ + + */ + protected $except = [ + // + ]; +} diff --git a/backend-server/app/Http/Requests/AddWebsiteDataSourceRequest.php b/backend-server/app/Http/Requests/AddWebsiteDataSourceRequest.php new file mode 100644 index 00000000..25398180 --- /dev/null +++ b/backend-server/app/Http/Requests/AddWebsiteDataSourceRequest.php @@ -0,0 +1,22 @@ + 'required|string|url', + ]; + } + public function getWebsite(): string + { + return $this->get('website'); + } + +} diff --git a/backend-server/app/Http/Requests/CreateChatbotRequest.php b/backend-server/app/Http/Requests/CreateChatbotRequest.php new file mode 100644 index 00000000..5d31a09e --- /dev/null +++ b/backend-server/app/Http/Requests/CreateChatbotRequest.php @@ -0,0 +1,32 @@ + 'required|string|url', + ]; + } + + public function getName(): string + { + return $this->get('name', 'My first chatbot'); + } + + public function getWebsite(): string + { + return $this->get('website'); + } + + public function getPromptMessage(): string + { + return $this->get('prompt_message', ""); + } +} diff --git a/backend-server/app/Http/Requests/CreateChatbotViaPdfFlowRequest.php b/backend-server/app/Http/Requests/CreateChatbotViaPdfFlowRequest.php new file mode 100644 index 00000000..638e7923 --- /dev/null +++ b/backend-server/app/Http/Requests/CreateChatbotViaPdfFlowRequest.php @@ -0,0 +1,37 @@ + 'required', + ]; + } + + public function getName(): string + { + return $this->get('name', 'My first chatbot'); + } + + public function getWebsite(): string + { + return $this->get('website'); + } + + public function getPromptMessage(): string + { + return $this->get('prompt_message', ""); + } + + public function getFiles() + { + return $this->get('pdffiles'); + } +} diff --git a/backend-server/app/Http/Requests/SendChatMessageRequest.php b/backend-server/app/Http/Requests/SendChatMessageRequest.php new file mode 100644 index 00000000..11a1257f --- /dev/null +++ b/backend-server/app/Http/Requests/SendChatMessageRequest.php @@ -0,0 +1,27 @@ + 'required|string', + ]; + } + + public function getMessage(): string + { + return $this->get('message'); + } + + public function getHistory(): array + { + return $this->get('history'); + } +} diff --git a/backend-server/app/Http/Requests/UpdateCharacterSettingsRequest.php b/backend-server/app/Http/Requests/UpdateCharacterSettingsRequest.php new file mode 100644 index 00000000..ddd13d0d --- /dev/null +++ b/backend-server/app/Http/Requests/UpdateCharacterSettingsRequest.php @@ -0,0 +1,29 @@ + 'nullable|string|in:knowledgeable,wise', + ]; + } + + + public function getCharacterName(): string + { + return $this->get('character_name', 'knowledgeable'); + } + + public function getChatbotId(): UuidInterface + { + return Uuid::fromString($this->route('id')); + } +} diff --git a/backend-server/app/Http/Requests/UploadPdfFilesRequest.php b/backend-server/app/Http/Requests/UploadPdfFilesRequest.php new file mode 100644 index 00000000..70a73809 --- /dev/null +++ b/backend-server/app/Http/Requests/UploadPdfFilesRequest.php @@ -0,0 +1,18 @@ + 'required', + ]; + } +} diff --git a/backend-server/app/Http/Responses/ChatbotResponse.php b/backend-server/app/Http/Responses/ChatbotResponse.php new file mode 100644 index 00000000..350e3d18 --- /dev/null +++ b/backend-server/app/Http/Responses/ChatbotResponse.php @@ -0,0 +1,20 @@ +response['text']; + } + + public function getSourceDocuments(): array + { + return $this->response['sourceDocuments']; + } +} diff --git a/backend-server/app/Http/Services/HandlePdfDataSource.php b/backend-server/app/Http/Services/HandlePdfDataSource.php new file mode 100644 index 00000000..ace21b48 --- /dev/null +++ b/backend-server/app/Http/Services/HandlePdfDataSource.php @@ -0,0 +1,45 @@ +setChatbotId($this->bot->getId()); + $dataSource->setId(Uuid::uuid4()); + + $files = $this->files; + $filesUrls = []; + $folderName = Str::random(20); + foreach ($files as $file) { + $extension = $file->getClientOriginalExtension(); + $fileName = Str::random(20) . '.' . $extension; + // random folder name + try { + $file->storeAs($folderName, $fileName, ['disk' => 'shared_volume']); + $filesUrls[] = $fileName; + } catch (\Exception $e) { + // Handle exception + } + } + + $dataSource->setFiles($filesUrls); + $dataSource->setFolderName($folderName); + + $dataSource->save(); + return $dataSource; + } +} diff --git a/backend-server/app/Models/Chatbot.php b/backend-server/app/Models/Chatbot.php new file mode 100644 index 00000000..6ed48b3a --- /dev/null +++ b/backend-server/app/Models/Chatbot.php @@ -0,0 +1,126 @@ + + */ + protected $casts = [ + 'id' => 'string', + ]; + + public function getId(): UuidInterface + { + return Uuid::fromString($this->id); + } + + public function setId(UuidInterface $id): void + { + $this->id = $id->toString(); + } + + public function getName(): string + { + return $this->name; + } + + public function setName(string $name): void + { + $this->name = $name; + } + + public function getWebsite(): string + { + return $this->website; + } + + public function setWebsite(string $website): void + { + $this->website = $website; + } + + public function getStatus(): ChatbotStatusType + { + return new ChatbotStatusType($this->status); + } + + public function setStatus(ChatbotStatusType $status): void + { + $this->status = $status->getStatus(); + } + + public function getPromptMessage(): string + { + return $this->prompt_message; + } + + public function setPromptMessage(string $promptMessage): void + { + $this->prompt_message = $promptMessage; + } + + public function setToken(string $token): void + { + $this->token = $token; + } + + public function getToken(): string + { + return $this->token; + } + + public function settings(): HasMany + { + return $this->hasMany(ChatbotSetting::class); + } + + public function crateOrUpdateSetting($name, $value): void + { + $setting = $this->settings()->where('name', $name)->first(); + if ($setting) { + $setting->value = $value; + $setting->save(); + } else { + $setting = new ChatbotSetting(); + $setting->setId(Uuid::uuid4()); + $setting->setChatbotId($this->getId()); + $setting->setName($name); + $setting->setValue($value); + $setting->save(); + } + } + + public function getSetting($name) + { + $setting = $this->settings()->where('name', $name)->first(); + if ($setting) { + return $setting->value; + } + return null; + } + + public function getWebsiteDataSources() + { + return $this->hasMany(WebsiteDataSource::class); + } + + public function getPdfFilesDataSources() + { + return $this->hasMany(PdfDataSource::class); + } +} diff --git a/backend-server/app/Models/ChatbotSetting.php b/backend-server/app/Models/ChatbotSetting.php new file mode 100644 index 00000000..59992a28 --- /dev/null +++ b/backend-server/app/Models/ChatbotSetting.php @@ -0,0 +1,73 @@ + 'string', + 'chatbot_id' => 'string', + ]; + + public function setChatbotId(UuidInterface $chatbotId): void + { + $this->chatbot_id = $chatbotId; + } + + public function setName(string $name): void + { + $this->name = $name; + } + + public function setValue(string $value): void + { + $this->value = $value; + } + + public function getId(): UuidInterface + { + return $this->id; + } + + public function setId(UuidInterface $id): void + { + $this->id = $id; + } + + + public function getChatbotId(): UuidInterface + { + return $this->chatbot_id; + } + + public function getName(): string + { + return $this->name; + } + + public function getValue(): string + { + return $this->value; + } + + public function chatbot() + { + return $this->belongsTo(Chatbot::class); + } + +} diff --git a/backend-server/app/Models/CrawledPages.php b/backend-server/app/Models/CrawledPages.php new file mode 100644 index 00000000..9f3615f9 --- /dev/null +++ b/backend-server/app/Models/CrawledPages.php @@ -0,0 +1,113 @@ +id); + } + + public function getChatbotId(): UuidInterface + { + return Uuid::fromString($this->chatbot_id); + } + + public function getWebsiteDataSourceId(): UuidInterface + { + return Uuid::fromString($this->website_data_source_id); + } + + public function getUrl(): string + { + return $this->url; + } + + public function getTitle(): ?string + { + return $this->title; + } + + + public function getStatusCode(): string + { + return $this->status_code; + } + + public function getContent(): string + { + return $this->content; + } + + public function getNormalizedContent(): string + { + return $this->normalized_content; + } + + public function setId(UuidInterface $id): void + { + $this->id = $id; + } + + public function setChatbotId(UuidInterface $chatbotId): void + { + $this->chatbot_id = $chatbotId; + } + + public function setWebsiteDataSourceId(UuidInterface $websiteDataSourceId): void + { + $this->website_data_source_id = $websiteDataSourceId; + } + + public function setUrl(string $url): void + { + $this->url = $url; + } + + public function setTitle(?string $title): void + { + $this->title = $title; + } + + public function setStatusCode(?string $statusCode): void + { + $this->status_code = $statusCode; + } + + public function setContent(?string $content): void + { + $this->content = $content; + } + + public function setNormalizedContent(?string $normalizedContent): void + { + $this->normalized_content = $normalizedContent; + } + + public function getCreatedAt(): DateTimeInterface + { + return $this->created_at; + } +} diff --git a/backend-server/app/Models/PdfDataSource.php b/backend-server/app/Models/PdfDataSource.php new file mode 100644 index 00000000..7791356c --- /dev/null +++ b/backend-server/app/Models/PdfDataSource.php @@ -0,0 +1,66 @@ + 'string', + 'chatbot_id' => 'string', + 'files' => 'array', + ]; + + public function setChatbotId(UuidInterface $chatbotId): void + { + $this->chatbot_id = $chatbotId; + } + + public function getId(): UuidInterface + { + return Uuid::fromString($this->id); + } + + public function getChatbotId(): UuidInterface + { + return Uuid::fromString($this->chatbot_id); + } + + public function setId(UuidInterface $id): void + { + $this->id = $id; + } + + public function setFiles($files): void + { + $this->files = $files; + } + + public function setFolderName($folderName): void + { + $this->folder_name = $folderName; + } + + public function getFolderName(): string + { + return $this->folder_name; + } + + public function getFiles() + { + return $this->files; + } + + public function getCreatedAt(): \DateTimeInterface + { + return $this->created_at; + } +} diff --git a/backend-server/app/Models/User.php b/backend-server/app/Models/User.php new file mode 100644 index 00000000..23b40634 --- /dev/null +++ b/backend-server/app/Models/User.php @@ -0,0 +1,44 @@ + + */ + protected $fillable = [ + 'name', + 'email', + 'password', + ]; + + /** + * The attributes that should be hidden for serialization. + * + * @var array + */ + protected $hidden = [ + 'password', + 'remember_token', + ]; + + /** + * The attributes that should be cast. + * + * @var array + */ + protected $casts = [ + 'email_verified_at' => 'datetime', + ]; +} diff --git a/backend-server/app/Models/WebsiteDataSource.php b/backend-server/app/Models/WebsiteDataSource.php new file mode 100644 index 00000000..4365f274 --- /dev/null +++ b/backend-server/app/Models/WebsiteDataSource.php @@ -0,0 +1,112 @@ + 'string', + 'chatbot_id' => 'string', + 'html_files' => 'array', + ]; + + public function setChatbotId(UuidInterface $chatbotId): void + { + $this->chatbot_id = $chatbotId; + } + + public function getId(): UuidInterface + { + return Uuid::fromString($this->id); + } + + public function getChatbotId(): UuidInterface + { + return Uuid::fromString($this->chatbot_id); + } + + public function setId(UuidInterface $id): void + { + $this->id = $id; + } + + public function setRootUrl(string $rootUrl): void + { + $this->root_url = $rootUrl; + } + + public function setIcon(?string $icon): void + { + $this->icon = $icon; + } + + public function setVectorDatabasedLastIngestedAt(string $vectorDatabasedLastIngestedAt): void + { + $this->vector_databased_last_ingested_at = $vectorDatabasedLastIngestedAt; + } + + public function setCrawlingStatus(string $crawlingStatus): void + { + $this->crawling_status = $crawlingStatus; + } + + + public function getRootUrl(): string + { + return $this->root_url; + } + + public function getIcon(): ?string + { + if (is_null($this->icon)) { + return '/dashboard/images/user-40-07.jpg'; + } + return url(Storage::url($this->icon)); + } + + public function getVectorDatabasedLastIngestedAt(): string + { + return $this->vector_databased_last_ingested_at; + } + + public function getCrawlingStatus(): WebsiteDataSourceStatusType + { + return new WebsiteDataSourceStatusType($this->crawling_status); + } + + public function chatbot() + { + return $this->belongsTo(Chatbot::class); + } + + public function setCrawlingProgress(float $crawlingProgress): void + { + $this->crawling_progress = $crawlingProgress; + } + + public function getCrawlingProgress(): float + { + return $this->crawling_progress; + } + + public function getCrawledPages() + { + return $this->hasMany(CrawledPages::class, 'website_data_source_id', 'id'); + } + + public function getCreatedAt(): \DateTimeInterface + { + return $this->created_at; + } +} diff --git a/backend-server/app/Providers/AppServiceProvider.php b/backend-server/app/Providers/AppServiceProvider.php new file mode 100644 index 00000000..452e6b65 --- /dev/null +++ b/backend-server/app/Providers/AppServiceProvider.php @@ -0,0 +1,24 @@ + + */ + protected $policies = [ + // + ]; + + /** + * Register any authentication / authorization services. + */ + public function boot(): void + { + // + } +} diff --git a/backend-server/app/Providers/BroadcastServiceProvider.php b/backend-server/app/Providers/BroadcastServiceProvider.php new file mode 100644 index 00000000..2be04f5d --- /dev/null +++ b/backend-server/app/Providers/BroadcastServiceProvider.php @@ -0,0 +1,19 @@ +> + */ + protected $listen = [ + Registered::class => [ + SendEmailVerificationNotification::class, + ], + + ChatbotWasCreated::class => [ + CreateWebsiteDataSourceIfNeeded::class + ], + WebsiteDataSourceWasAdded::class => [ + StartRecursiveCrawler::class + ], + PdfDataSourceWasAdded::class => [ + IngestPdfDataSource::class + ], + WebsiteDataSourceCrawlingWasCompleted::class => [ + IngestWebsiteDataSource::class + ] + ]; + + /** + * Register any events for your application. + */ + public function boot(): void + { + // + } + + /** + * Determine if events and listeners should be automatically discovered. + */ + public function shouldDiscoverEvents(): bool + { + return false; + } +} diff --git a/backend-server/app/Providers/RouteServiceProvider.php b/backend-server/app/Providers/RouteServiceProvider.php new file mode 100644 index 00000000..1cf5f15c --- /dev/null +++ b/backend-server/app/Providers/RouteServiceProvider.php @@ -0,0 +1,40 @@ +by($request->user()?->id ?: $request->ip()); + }); + + $this->routes(function () { + Route::middleware('api') + ->prefix('api') + ->group(base_path('routes/api.php')); + + Route::middleware('web') + ->group(base_path('routes/web.php')); + }); + } +} diff --git a/backend-server/artisan b/backend-server/artisan new file mode 100755 index 00000000..67a3329b --- /dev/null +++ b/backend-server/artisan @@ -0,0 +1,53 @@ +#!/usr/bin/env php +make(Illuminate\Contracts\Console\Kernel::class); + +$status = $kernel->handle( + $input = new Symfony\Component\Console\Input\ArgvInput, + new Symfony\Component\Console\Output\ConsoleOutput +); + +/* +|-------------------------------------------------------------------------- +| Shutdown The Application +|-------------------------------------------------------------------------- +| +| Once Artisan has finished running, we will fire off the shutdown events +| so that any final work may be done by the application before we shut +| down the process. This is the last thing to happen to the request. +| +*/ + +$kernel->terminate($input, $status); + +exit($status); diff --git a/backend-server/bootstrap/app.php b/backend-server/bootstrap/app.php new file mode 100644 index 00000000..037e17df --- /dev/null +++ b/backend-server/bootstrap/app.php @@ -0,0 +1,55 @@ +singleton( + Illuminate\Contracts\Http\Kernel::class, + App\Http\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Console\Kernel::class, + App\Console\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Debug\ExceptionHandler::class, + App\Exceptions\Handler::class +); + +/* +|-------------------------------------------------------------------------- +| Return The Application +|-------------------------------------------------------------------------- +| +| This script returns the application instance. The instance is given to +| the calling script so we can separate the building of the instances +| from the actual running of the application and sending responses. +| +*/ + +return $app; diff --git a/backend-server/bootstrap/cache/.gitignore b/backend-server/bootstrap/cache/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/backend-server/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/backend-server/composer.json b/backend-server/composer.json new file mode 100644 index 00000000..1e2b6dd6 --- /dev/null +++ b/backend-server/composer.json @@ -0,0 +1,72 @@ +{ + "name": "laravel/laravel", + "type": "project", + "description": "The Laravel Framework.", + "keywords": ["framework", "laravel"], + "license": "MIT", + "require": { + "php": "^8.1", + "ext-dom": "*", + "ext-libxml": "*", + "aws/aws-sdk-php-laravel": "^3.8", + "fiveam-code/laravel-notion-api": "^1.0", + "guzzlehttp/guzzle": "^7.2", + "laravel/framework": "^10.8", + "laravel/sanctum": "^3.2", + "laravel/socialite": "^5.6", + "laravel/telescope": "^4.14", + "laravel/tinker": "^2.8" + }, + "require-dev": { + "fakerphp/faker": "^1.9.1", + "laravel/pint": "^1.0", + "laravel/sail": "^1.18", + "mockery/mockery": "^1.4.4", + "nunomaduro/collision": "^7.0", + "phpunit/phpunit": "^10.1", + "spatie/laravel-ignition": "^2.0" + }, + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Factories\\": "database/factories/", + "Database\\Seeders\\": "database/seeders/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, + "scripts": { + "post-autoload-dump": [ + "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", + "@php artisan package:discover --ansi" + ], + "post-update-cmd": [ + "@php artisan vendor:publish --tag=laravel-assets --ansi --force" + ], + "post-root-package-install": [ + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" + ], + "post-create-project-cmd": [ + "@php artisan key:generate --ansi" + ] + }, + "extra": { + "laravel": { + "dont-discover": [] + } + }, + "config": { + "optimize-autoloader": true, + "preferred-install": "dist", + "sort-packages": true, + "allow-plugins": { + "pestphp/pest-plugin": true, + "php-http/discovery": true + } + }, + "minimum-stability": "stable", + "prefer-stable": true +} diff --git a/backend-server/composer.lock b/backend-server/composer.lock new file mode 100644 index 00000000..e98db0f1 --- /dev/null +++ b/backend-server/composer.lock @@ -0,0 +1,8483 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "022a9eaeec285398cdcbd69cde0a3eb1", + "packages": [ + { + "name": "aws/aws-crt-php", + "version": "v1.2.1", + "source": { + "type": "git", + "url": "https://github.com/awslabs/aws-crt-php.git", + "reference": "1926277fc71d253dfa820271ac5987bdb193ccf5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/1926277fc71d253dfa820271ac5987bdb193ccf5", + "reference": "1926277fc71d253dfa820271ac5987bdb193ccf5", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35||^5.6.3||^9.5", + "yoast/phpunit-polyfills": "^1.0" + }, + "suggest": { + "ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality." + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "AWS SDK Common Runtime Team", + "email": "aws-sdk-common-runtime@amazon.com" + } + ], + "description": "AWS Common Runtime for PHP", + "homepage": "https://github.com/awslabs/aws-crt-php", + "keywords": [ + "amazon", + "aws", + "crt", + "sdk" + ], + "support": { + "issues": "https://github.com/awslabs/aws-crt-php/issues", + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.1" + }, + "time": "2023-03-24T20:22:19+00:00" + }, + { + "name": "aws/aws-sdk-php", + "version": "3.269.0", + "source": { + "type": "git", + "url": "https://github.com/aws/aws-sdk-php.git", + "reference": "6d759ef9f24f0c7f271baf8014f41fc0cfdfbf78" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/6d759ef9f24f0c7f271baf8014f41fc0cfdfbf78", + "reference": "6d759ef9f24f0c7f271baf8014f41fc0cfdfbf78", + "shasum": "" + }, + "require": { + "aws/aws-crt-php": "^1.0.4", + "ext-json": "*", + "ext-pcre": "*", + "ext-simplexml": "*", + "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", + "guzzlehttp/promises": "^1.4.0", + "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "mtdowling/jmespath.php": "^2.6", + "php": ">=5.5" + }, + "require-dev": { + "andrewsville/php-token-reflection": "^1.4", + "aws/aws-php-sns-message-validator": "~1.0", + "behat/behat": "~3.0", + "composer/composer": "^1.10.22", + "dms/phpunit-arraysubset-asserts": "^0.4.0", + "doctrine/cache": "~1.4", + "ext-dom": "*", + "ext-openssl": "*", + "ext-pcntl": "*", + "ext-sockets": "*", + "nette/neon": "^2.3", + "paragonie/random_compat": ">= 2", + "phpunit/phpunit": "^4.8.35 || ^5.6.3 || ^9.5", + "psr/cache": "^1.0", + "psr/http-message": "^1.0", + "psr/simple-cache": "^1.0", + "sebastian/comparator": "^1.2.3 || ^4.0", + "yoast/phpunit-polyfills": "^1.0" + }, + "suggest": { + "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", + "doctrine/cache": "To use the DoctrineCacheAdapter", + "ext-curl": "To send requests using cURL", + "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", + "ext-sockets": "To use client-side monitoring" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Aws\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Amazon Web Services", + "homepage": "http://aws.amazon.com" + } + ], + "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", + "homepage": "http://aws.amazon.com/sdkforphp", + "keywords": [ + "amazon", + "aws", + "cloud", + "dynamodb", + "ec2", + "glacier", + "s3", + "sdk" + ], + "support": { + "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", + "issues": "https://github.com/aws/aws-sdk-php/issues", + "source": "https://github.com/aws/aws-sdk-php/tree/3.269.0" + }, + "time": "2023-04-26T18:21:04+00:00" + }, + { + "name": "aws/aws-sdk-php-laravel", + "version": "3.8.1", + "source": { + "type": "git", + "url": "https://github.com/aws/aws-sdk-php-laravel.git", + "reference": "fdecc2c8c15b3bf3843401b257229c7f883d6bab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aws/aws-sdk-php-laravel/zipball/fdecc2c8c15b3bf3843401b257229c7f883d6bab", + "reference": "fdecc2c8c15b3bf3843401b257229c7f883d6bab", + "shasum": "" + }, + "require": { + "aws/aws-sdk-php": "~3.0", + "illuminate/support": "^5.1 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0", + "php": ">=5.5.9" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^9.0", + "vlucas/phpdotenv": "^1.0 || ^2.0 || ^3.0 || ^4.0 || ^5.0", + "yoast/phpunit-polyfills": "^1.0" + }, + "suggest": { + "laravel/framework": "To test the Laravel bindings", + "laravel/lumen-framework": "To test the Lumen bindings" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Aws\\Laravel\\AwsServiceProvider" + ], + "aliases": { + "AWS": "Aws\\Laravel\\AwsFacade" + } + } + }, + "autoload": { + "psr-4": { + "Aws\\Laravel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Amazon Web Services", + "homepage": "http://aws.amazon.com" + } + ], + "description": "A simple Laravel 5/6/7/8/9 service provider for including the AWS SDK for PHP.", + "homepage": "http://aws.amazon.com/sdkforphp2", + "keywords": [ + "amazon", + "aws", + "dynamodb", + "ec2", + "laravel", + "laravel 10", + "laravel 5", + "laravel 6", + "laravel 7", + "laravel 8", + "laravel 9", + "s3", + "sdk" + ], + "support": { + "issues": "https://github.com/aws/aws-sdk-php-laravel/issues", + "source": "https://github.com/aws/aws-sdk-php-laravel/tree/3.8.1" + }, + "time": "2023-03-24T20:26:35+00:00" + }, + { + "name": "brick/math", + "version": "0.11.0", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/0ad82ce168c82ba30d1c01ec86116ab52f589478", + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^9.0", + "vimeo/psalm": "5.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.11.0" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2023-01-15T23:15:59+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "f41715465d65213d644d3141a6a93081be5d3549" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", + "reference": "f41715465d65213d644d3141a6a93081be5d3549", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" + }, + "time": "2022-10-27T11:44:00+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.6", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/d9d313a36c872fd6ee06d9a6cbcf713eaa40f024", + "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.6" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2022-10-20T09:10:12+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "84a527db05647743d50373e0ec53a152f2cde568" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", + "reference": "84a527db05647743d50373e0ec53a152f2cde568", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^9.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2022-12-15T16:57:16+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.3.2", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/782ca5968ab8b954773518e9e49a6f892a34b2a8", + "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "webmozart/assert": "^1.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-webmozart-assert": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.2" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2022-09-10T18:51:20+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/3a85486b709bc384dae8eb78fb2eec649bdb64ff", + "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^4.30" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-01-14T14:17:03+00:00" + }, + { + "name": "fiveam-code/laravel-notion-api", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/5am-code/laravel-notion-api.git", + "reference": "4d5e55661c774ccfdedd4d7d55438d7889bfccd9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/5am-code/laravel-notion-api/zipball/4d5e55661c774ccfdedd4d7d55438d7889bfccd9", + "reference": "4d5e55661c774ccfdedd4d7d55438d7889bfccd9", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^7.0.1", + "illuminate/support": "^8.0|^9.0|^10.0", + "php": "^8.0" + }, + "require-dev": { + "orchestra/testbench": "^6.0|^8.0", + "pestphp/pest": "^1.22", + "pestphp/pest-plugin-laravel": "^1.3", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "FiveamCode\\LaravelNotionApi\\LaravelNotionApiServiceProvider" + ], + "aliases": { + "Notion": "FiveamCode\\LaravelNotionApi\\NotionFacade" + } + } + }, + "autoload": { + "psr-4": { + "FiveamCode\\LaravelNotionApi\\": "src", + "FiveamCode\\LaravelNotionApi\\Endpoints\\": "src/Endpoints", + "FiveamCode\\LaravelNotionApi\\Exceptions\\": "src/Exceptions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Diana Scharf", + "email": "hello@dianaweb.dev", + "role": "Developer" + }, + { + "name": "Johannes Güntner", + "email": "johannes.guentner@it-guentner.de", + "role": "Developer" + } + ], + "description": "Laravel Wrapper for the Notion API", + "homepage": "https://github.com/fiveam-code/laravel-notion-api", + "keywords": [ + "api-wrapper", + "fiveam-code", + "laravel", + "laravel-notion-api", + "notion", + "notion-api" + ], + "support": { + "issues": "https://github.com/5am-code/laravel-notion-api/issues", + "source": "https://github.com/5am-code/laravel-notion-api/tree/v1.0.1" + }, + "funding": [ + { + "url": "https://www.patreon.com/5amcode", + "type": "patreon" + } + ], + "time": "2023-04-21T03:39:06+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/58571acbaa5f9f462c9c77e911700ac66f446d4e", + "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2022-02-20T15:07:15+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", + "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2023-02-25T20:23:15+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.5.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b964ca597e86b752cd994f27293e9fa6b6a95ed9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b964ca597e86b752cd994f27293e9fa6b6a95ed9", + "reference": "b964ca597e86b752cd994f27293e9fa6b6a95ed9", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "ext-curl": "*", + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "7.5-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.5.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2023-04-17T16:30:08+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "1.5.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "b94b2807d85443f9719887892882d0329d1e2598" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", + "reference": "b94b2807d85443f9719887892882d0329d1e2598", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.5.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2022-08-28T14:55:35+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.5.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "b635f279edd83fc275f822a1188157ffea568ff6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", + "reference": "b635f279edd83fc275f822a1188157ffea568ff6", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.5.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2023-04-17T16:11:26+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "b945d74a55a25a949158444f09ec0d3c120d69e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/b945d74a55a25a949158444f09ec0d3c120d69e2", + "reference": "b945d74a55a25a949158444f09ec0d3c120d69e2", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.19 || ^9.5.8", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2021-10-07T12:57:01+00:00" + }, + { + "name": "laravel/framework", + "version": "v10.10.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "0da22a8d179f79b49d4e71f4822f759651f35012" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/0da22a8d179f79b49d4e71f4822f759651f35012", + "reference": "0da22a8d179f79b49d4e71f4822f759651f35012", + "shasum": "" + }, + "require": { + "brick/math": "^0.9.3|^0.10.2|^0.11", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.3.2", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/serializable-closure": "^1.3", + "league/commonmark": "^2.2.1", + "league/flysystem": "^3.8.0", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^2.62.1", + "nunomaduro/termwind": "^1.13", + "php": "^8.1", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^6.2", + "symfony/error-handler": "^6.2", + "symfony/finder": "^6.2", + "symfony/http-foundation": "^6.2", + "symfony/http-kernel": "^6.2", + "symfony/mailer": "^6.2", + "symfony/mime": "^6.2", + "symfony/process": "^6.2", + "symfony/routing": "^6.2", + "symfony/uid": "^6.2", + "symfony/var-dumper": "^6.2", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.4.1", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.235.5", + "doctrine/dbal": "^3.5.1", + "ext-gmp": "*", + "fakerphp/faker": "^1.21", + "guzzlehttp/guzzle": "^7.5", + "league/flysystem-aws-s3-v3": "^3.0", + "league/flysystem-ftp": "^3.0", + "league/flysystem-path-prefixing": "^3.3", + "league/flysystem-read-only": "^3.3", + "league/flysystem-sftp-v3": "^3.0", + "mockery/mockery": "^1.5.1", + "orchestra/testbench-core": "^8.4", + "pda/pheanstalk": "^4.0", + "phpstan/phpdoc-parser": "^1.15", + "phpstan/phpstan": "^1.4.7", + "phpunit/phpunit": "^10.0.7", + "predis/predis": "^2.0.2", + "symfony/cache": "^6.2", + "symfony/http-client": "^6.2.4" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", + "brianium/paratest": "Required to run tests in parallel (^6.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^3.5.1).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "guzzlehttp/guzzle": "Required to use the HTTP Client and the ping methods on schedules (^7.5).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", + "league/flysystem-read-only": "Required to use read-only disks (^3.3)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", + "mockery/mockery": "Required to use mocking (^1.5.1).", + "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^9.5.8|^10.0.7).", + "predis/predis": "Required to use the predis connector (^2.0.2).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^6.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^6.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "10.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2023-05-09T13:08:05+00:00" + }, + { + "name": "laravel/sanctum", + "version": "v3.2.5", + "source": { + "type": "git", + "url": "https://github.com/laravel/sanctum.git", + "reference": "8ebda85d59d3c414863a7f4d816ef8302faad876" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/8ebda85d59d3c414863a7f4d816ef8302faad876", + "reference": "8ebda85d59d3c414863a7f4d816ef8302faad876", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "^9.21|^10.0", + "illuminate/contracts": "^9.21|^10.0", + "illuminate/database": "^9.21|^10.0", + "illuminate/support": "^9.21|^10.0", + "php": "^8.0.2" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^7.0|^8.0", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Sanctum\\SanctumServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sanctum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.", + "keywords": [ + "auth", + "laravel", + "sanctum" + ], + "support": { + "issues": "https://github.com/laravel/sanctum/issues", + "source": "https://github.com/laravel/sanctum" + }, + "time": "2023-05-01T19:39:51+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", + "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "nesbot/carbon": "^2.61", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2023-01-30T18:31:20+00:00" + }, + { + "name": "laravel/socialite", + "version": "v5.6.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/socialite.git", + "reference": "a14a177f2cc71d8add71e2b19e00800e83bdda09" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/socialite/zipball/a14a177f2cc71d8add71e2b19e00800e83bdda09", + "reference": "a14a177f2cc71d8add71e2b19e00800e83bdda09", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/guzzle": "^6.0|^7.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0", + "league/oauth1-client": "^1.10.1", + "php": "^7.2|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0|^8.0", + "phpunit/phpunit": "^8.0|^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Socialite\\SocialiteServiceProvider" + ], + "aliases": { + "Socialite": "Laravel\\Socialite\\Facades\\Socialite" + } + } + }, + "autoload": { + "psr-4": { + "Laravel\\Socialite\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel wrapper around OAuth 1 & OAuth 2 libraries.", + "homepage": "https://laravel.com", + "keywords": [ + "laravel", + "oauth" + ], + "support": { + "issues": "https://github.com/laravel/socialite/issues", + "source": "https://github.com/laravel/socialite" + }, + "time": "2023-01-20T15:42:35+00:00" + }, + { + "name": "laravel/telescope", + "version": "v4.14.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/telescope.git", + "reference": "222bbea975d9f3a10879af153db5c34ffac08034" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/telescope/zipball/222bbea975d9f3a10879af153db5c34ffac08034", + "reference": "222bbea975d9f3a10879af153db5c34ffac08034", + "shasum": "" + }, + "require": { + "ext-json": "*", + "laravel/framework": "^8.37|^9.0|^10.0", + "php": "^8.0", + "symfony/var-dumper": "^5.0|^6.0" + }, + "require-dev": { + "ext-gd": "*", + "guzzlehttp/guzzle": "^6.0|^7.0", + "laravel/octane": "^1.4", + "orchestra/testbench": "^6.0|^7.0|^8.0", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Telescope\\TelescopeServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Telescope\\": "src/", + "Laravel\\Telescope\\Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Mohamed Said", + "email": "mohamed@laravel.com" + } + ], + "description": "An elegant debug assistant for the Laravel framework.", + "keywords": [ + "debugging", + "laravel", + "monitoring" + ], + "support": { + "issues": "https://github.com/laravel/telescope/issues", + "source": "https://github.com/laravel/telescope/tree/v4.14.2" + }, + "time": "2023-04-19T15:24:14+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.8.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "04a2d3bd0d650c0764f70bf49d1ee39393e4eb10" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/04a2d3bd0d650c0764f70bf49d1ee39393e4eb10", + "reference": "04a2d3bd0d650c0764f70bf49d1ee39393e4eb10", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.10.4|^0.11.1", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpunit/phpunit": "^8.5.8|^9.3.3" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.8.1" + }, + "time": "2023-02-15T16:40:09+00:00" + }, + { + "name": "league/commonmark", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "d44a24690f16b8c1808bf13b1bd54ae4c63ea048" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d44a24690f16b8c1808bf13b1bd54ae4c63ea048", + "reference": "d44a24690f16b8c1808bf13b1bd54ae4c63ea048", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.30.0", + "commonmark/commonmark.js": "0.30.0", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2023-03-24T15:16:10+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/flysystem", + "version": "3.15.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "a141d430414fcb8bf797a18716b09f759a385bed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a141d430414fcb8bf797a18716b09f759a385bed", + "reference": "a141d430414fcb8bf797a18716b09f759a385bed", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5", + "async-aws/simple-s3": "^1.1", + "aws/aws-sdk-php": "^3.220.0", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "microsoft/azure-storage-blob": "^1.1", + "phpseclib/phpseclib": "^3.0.14", + "phpstan/phpstan": "^0.12.26", + "phpunit/phpunit": "^9.5.11", + "sabre/dav": "^4.3.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.15.1" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2023-05-04T09:04:26+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.15.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "543f64c397fefdf9cfeac443ffb6beff602796b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/543f64c397fefdf9cfeac443ffb6beff602796b3", + "reference": "543f64c397fefdf9cfeac443ffb6beff602796b3", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem-local/issues", + "source": "https://github.com/thephpleague/flysystem-local/tree/3.15.0" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2023-05-02T20:02:14+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.11.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2022-04-17T13:12:02+00:00" + }, + { + "name": "league/oauth1-client", + "version": "v1.10.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth1-client.git", + "reference": "d6365b901b5c287dd41f143033315e2f777e1167" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/d6365b901b5c287dd41f143033315e2f777e1167", + "reference": "d6365b901b5c287dd41f143033315e2f777e1167", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-openssl": "*", + "guzzlehttp/guzzle": "^6.0|^7.0", + "guzzlehttp/psr7": "^1.7|^2.0", + "php": ">=7.1||>=8.0" + }, + "require-dev": { + "ext-simplexml": "*", + "friendsofphp/php-cs-fixer": "^2.17", + "mockery/mockery": "^1.3.3", + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5||9.5" + }, + "suggest": { + "ext-simplexml": "For decoding XML-based responses." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev", + "dev-develop": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "League\\OAuth1\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Corlett", + "email": "bencorlett@me.com", + "homepage": "http://www.webcomm.com.au", + "role": "Developer" + } + ], + "description": "OAuth 1.0 Client Library", + "keywords": [ + "Authentication", + "SSO", + "authorization", + "bitbucket", + "identity", + "idp", + "oauth", + "oauth1", + "single sign on", + "trello", + "tumblr", + "twitter" + ], + "support": { + "issues": "https://github.com/thephpleague/oauth1-client/issues", + "source": "https://github.com/thephpleague/oauth1-client/tree/v1.10.1" + }, + "time": "2022-04-15T14:02:14+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.3.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "9b5daeaffce5b926cac47923798bba91059e60e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/9b5daeaffce5b926cac47923798bba91059e60e2", + "reference": "9b5daeaffce5b926cac47923798bba91059e60e2", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2@dev", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^9.5.26", + "predis/predis": "^1.1 || ^2", + "ruflin/elastica": "^7", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.3.1" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2023-02-06T13:46:10+00:00" + }, + { + "name": "mtdowling/jmespath.php", + "version": "2.6.1", + "source": { + "type": "git", + "url": "https://github.com/jmespath/jmespath.php.git", + "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/9b87907a81b87bc76d19a7fb2d61e61486ee9edb", + "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.17" + }, + "require-dev": { + "composer/xdebug-handler": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^7.5.15" + }, + "bin": [ + "bin/jp.php" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "files": [ + "src/JmesPath.php" + ], + "psr-4": { + "JmesPath\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Declaratively specify how to extract elements from a JSON document", + "keywords": [ + "json", + "jsonpath" + ], + "support": { + "issues": "https://github.com/jmespath/jmespath.php/issues", + "source": "https://github.com/jmespath/jmespath.php/tree/2.6.1" + }, + "time": "2021-06-14T00:11:39+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.66.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "496712849902241f04902033b0441b269effe001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/496712849902241f04902033b0441b269effe001", + "reference": "496712849902241f04902033b0441b269effe001", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2023-01-29T18:53:47+00:00" + }, + { + "name": "nette/schema", + "version": "v1.2.3", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", + "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", + "shasum": "" + }, + "require": { + "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", + "php": ">=7.1 <8.3" + }, + "require-dev": { + "nette/tester": "^2.3 || ^2.4", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.2.3" + }, + "time": "2022-10-13T01:24:26+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.0", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "cacdbf5a91a657ede665c541eda28941d4b09c1e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/cacdbf5a91a657ede665c541eda28941d4b09c1e", + "reference": "cacdbf5a91a657ede665c541eda28941d4b09c1e", + "shasum": "" + }, + "require": { + "php": ">=8.0 <8.3" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.4", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", + "ext-xml": "to use Strings::length() etc. when mbstring is not available" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.0" + }, + "time": "2023-02-02T10:41:53+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.15.4", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" + }, + "time": "2023-03-05T19:49:14+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v1.15.1", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.0", + "symfony/console": "^5.3.0|^6.0.0" + }, + "require-dev": { + "ergebnis/phpstan-rules": "^1.0.", + "illuminate/console": "^8.0|^9.0", + "illuminate/support": "^8.0|^9.0", + "laravel/pint": "^1.0.0", + "pestphp/pest": "^1.21.0", + "pestphp/pest-plugin-mock": "^1.0", + "phpstan/phpstan": "^1.4.6", + "phpstan/phpstan-strict-rules": "^1.1.0", + "symfony/var-dumper": "^5.2.7|^6.0.0", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Its like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v1.15.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2023-02-08T01:06:31+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dd3a383e599f49777d8b628dadbb90cae435b87e", + "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2023-02-25T19:38:58+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/1.0.2" + }, + "time": "2023-04-10T20:12:12+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "e616d01114759c4c489f93b099585439f795fe35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + }, + "time": "2023-04-10T20:10:41+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.11.17", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "3dc5d4018dabd80bceb8fe1e3191ba8460569f0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/3dc5d4018dabd80bceb8fe1e3191ba8460569f0a", + "reference": "3dc5d4018dabd80bceb8fe1e3191ba8460569f0a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^4.0 || ^3.1", + "php": "^8.0 || ^7.0.8", + "symfony/console": "^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", + "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.11.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.11.17" + }, + "time": "2023-05-05T20:02:42+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.4", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "60a4c63ab724854332900504274f6150ff26d286" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/60a4c63ab724854332900504274f6150ff26d286", + "reference": "60a4c63ab724854332900504274f6150ff26d286", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.4" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2023-04-15T23:01:58+00:00" + }, + { + "name": "symfony/console", + "version": "v6.2.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "12288d9f4500f84a4d02254d4aa968b15488476f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/12288d9f4500f84a4d02254d4aa968b15488476f", + "reference": "12288d9f4500f84a4d02254d4aa968b15488476f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.4|^6.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/lock": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.2.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-04-28T13:37:43+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "aedf3cb0f5b929ec255d96bbb4909e9932c769e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/aedf3cb0f5b929ec255d96bbb4909e9932c769e0", + "reference": "aedf3cb0f5b929ec255d96bbb4909e9932c769e0", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-14T08:44:56+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", + "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.3-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-03-01T10:25:55+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v6.2.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "8b7e9f124640cb0611624a9383176c3e5f7d8cfb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/8b7e9f124640cb0611624a9383176c3e5f7d8cfb", + "reference": "8b7e9f124640cb0611624a9383176c3e5f7d8cfb", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^5.4|^6.0" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v6.2.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-04-18T13:46:08+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.2.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "04046f35fd7d72f9646e721fc2ecb8f9c67d3339" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/04046f35fd7d72f9646e721fc2ecb8f9c67d3339", + "reference": "04046f35fd7d72f9646e721fc2ecb8f9c67d3339", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^5.4|^6.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v6.2.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-03-20T16:06:02+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", + "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.3-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-03-01T10:32:47+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "20808dc6631aecafbe67c186af5dcb370be3a0eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/20808dc6631aecafbe67c186af5dcb370be3a0eb", + "reference": "20808dc6631aecafbe67c186af5dcb370be3a0eb", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-16T09:57:23+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.2.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "49adbb92bcb4e3c2943719d2756271e8b9602acc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/49adbb92bcb4e3c2943719d2756271e8b9602acc", + "reference": "49adbb92bcb4e3c2943719d2756271e8b9602acc", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.1" + }, + "conflict": { + "symfony/cache": "<6.2" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^5.4|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v6.2.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-04-18T13:46:08+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v6.2.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "81064a65a5496f17d2b6984f6519406f98864215" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/81064a65a5496f17d2b6984f6519406f98864215", + "reference": "81064a65a5496f17d2b6984f6519406f98864215", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/error-handler": "^6.1", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/http-foundation": "^5.4.21|^6.2.7", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.4", + "symfony/config": "<6.1", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<6.2", + "symfony/doctrine-bridge": "<5.4", + "symfony/form": "<5.4", + "symfony/http-client": "<5.4", + "symfony/mailer": "<5.4", + "symfony/messenger": "<5.4", + "symfony/translation": "<5.4", + "symfony/twig-bridge": "<5.4", + "symfony/validator": "<5.4", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/config": "^6.1", + "symfony/console": "^5.4|^6.0", + "symfony/css-selector": "^5.4|^6.0", + "symfony/dependency-injection": "^6.2", + "symfony/dom-crawler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/process": "^5.4|^6.0", + "symfony/routing": "^5.4|^6.0", + "symfony/stopwatch": "^5.4|^6.0", + "symfony/translation": "^5.4|^6.0", + "symfony/translation-contracts": "^1.1|^2|^3", + "symfony/uid": "^5.4|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v6.2.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-04-28T13:50:28+00:00" + }, + { + "name": "symfony/mailer", + "version": "v6.2.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "bfcfa015c67e19c6fdb7ca6fe70700af1e740a17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/bfcfa015c67e19c6fdb7ca6fe70700af1e740a17", + "reference": "bfcfa015c67e19c6fdb7ca6fe70700af1e740a17", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.1", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/mime": "^6.2", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "conflict": { + "symfony/http-kernel": "<5.4", + "symfony/messenger": "<6.2", + "symfony/mime": "<6.2", + "symfony/twig-bridge": "<6.2.1" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/messenger": "^6.2", + "symfony/twig-bridge": "^6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v6.2.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-03-14T15:00:05+00:00" + }, + { + "name": "symfony/mime", + "version": "v6.2.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "b6c137fc53a9f7c4c951cd3f362b3734c7a97723" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/b6c137fc53a9f7c4c951cd3f362b3734c7a97723", + "reference": "b6c137fc53a9f7c4c951cd3f362b3734c7a97723", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<5.4", + "symfony/serializer": "<6.2" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/property-access": "^5.4|^6.0", + "symfony/property-info": "^5.4|^6.0", + "symfony/serializer": "^6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v6.2.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-04-19T09:54:16+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "639084e360537a19f9ee352433b84ce831f3d2da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", + "reference": "639084e360537a19f9ee352433b84ce831f3d2da", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/f3cf1a645c2734236ed1e2e671e273eeb3586166", + "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/process", + "version": "v6.2.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "b34cdbc9c5e75d45a3703e63a48ad07aafa8bf2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/b34cdbc9c5e75d45a3703e63a48ad07aafa8bf2e", + "reference": "b34cdbc9c5e75d45a3703e63a48ad07aafa8bf2e", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.2.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-04-18T13:56:57+00:00" + }, + { + "name": "symfony/routing", + "version": "v6.2.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "69062e2823f03b82265d73a966999660f0e1e404" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/69062e2823f03b82265d73a966999660f0e1e404", + "reference": "69062e2823f03b82265d73a966999660f0e1e404", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<6.2", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.2", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" + }, + "suggest": { + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v6.2.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-03-14T15:00:05+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "a8c9cedf55f314f3a186041d19537303766df09a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a8c9cedf55f314f3a186041d19537303766df09a", + "reference": "a8c9cedf55f314f3a186041d19537303766df09a", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.3-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.2.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-03-01T10:32:47+00:00" + }, + { + "name": "symfony/string", + "version": "v6.2.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "193e83bbd6617d6b2151c37fff10fa7168ebddef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/193e83bbd6617d6b2151c37fff10fa7168ebddef", + "reference": "193e83bbd6617d6b2151c37fff10fa7168ebddef", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.0" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/intl": "^6.2", + "symfony/translation-contracts": "^2.0|^3.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.2.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-03-20T16:06:02+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.2.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "817535dbb1721df8b3a8f2489dc7e50bcd6209b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/817535dbb1721df8b3a8f2489dc7e50bcd6209b5", + "reference": "817535dbb1721df8b3a8f2489dc7e50bcd6209b5", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.3|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.13", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/intl": "^5.4|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0", + "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/yaml": "^5.4|^6.0" + }, + "suggest": { + "nikic/php-parser": "To use PhpAstExtractor", + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.2.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-03-31T09:14:44+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "dfec258b9dd17a6b24420d464c43bffe347441c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/dfec258b9dd17a6b24420d464c43bffe347441c8", + "reference": "dfec258b9dd17a6b24420d464c43bffe347441c8", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.3-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.2.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-03-01T10:32:47+00:00" + }, + { + "name": "symfony/uid", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "d30c72a63897cfa043e1de4d4dd2ffa9ecefcdc0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/d30c72a63897cfa043e1de4d4dd2ffa9ecefcdc0", + "reference": "d30c72a63897cfa043e1de4d4dd2ffa9ecefcdc0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-14T08:44:56+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.2.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "41a750a23412ca76fdbbf5096943b4134272c1ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/41a750a23412ca76fdbbf5096943b4134272c1ab", + "reference": "41a750a23412ca76fdbbf5096943b4134272c1ab", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/uid": "^5.4|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v6.2.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-04-18T13:46:08+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "2.2.6", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/c42125b83a4fa63b187fdf29f9c93cb7733da30c", + "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0 || ^8.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.6" + }, + "time": "2023-01-03T09:29:04+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.5.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.0.2", + "php": "^7.1.3 || ^8.0", + "phpoption/phpoption": "^1.8", + "symfony/polyfill-ctype": "^1.23", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-filter": "*", + "phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "5.5-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.5.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2022-10-16T01:01:54+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b56450eed252f6801410d810c8e1727224ae0743" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2022-03-08T17:03:00+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ + { + "name": "fakerphp/faker", + "version": "v1.21.0", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/92efad6a967f0b79c499705c69b662f738cc9e4d", + "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "v1.21-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.21.0" + }, + "time": "2022-12-13T13:54:32+00:00" + }, + { + "name": "filp/whoops", + "version": "2.15.2", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "aac9304c5ed61bf7b1b7a6064bf9806ab842ce73" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/aac9304c5ed61bf7b1b7a6064bf9806ab842ce73", + "reference": "aac9304c5ed61bf7b1b7a6064bf9806ab842ce73", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^0.9 || ^1.0", + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.15.2" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2023-04-12T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.10.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "c7a01fa9bdd79819e7a2f1ba63ac1b02e6692dbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/c7a01fa9bdd79819e7a2f1ba63ac1b02e6692dbc", + "reference": "c7a01fa9bdd79819e7a2f1ba63ac1b02e6692dbc", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.16.0", + "illuminate/view": "^10.5.1", + "laravel-zero/framework": "^10.0.2", + "mockery/mockery": "^1.5.1", + "nunomaduro/larastan": "^2.5.1", + "nunomaduro/termwind": "^1.15.1", + "pestphp/pest": "^2.4.0" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2023-04-25T14:52:30+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.22.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "923e1e112b6a8598664dbb0ee79dd3137f1c9d56" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/923e1e112b6a8598664dbb0ee79dd3137f1c9d56", + "reference": "923e1e112b6a8598664dbb0ee79dd3137f1c9d56", + "shasum": "" + }, + "require": { + "illuminate/console": "^8.0|^9.0|^10.0", + "illuminate/contracts": "^8.0|^9.0|^10.0", + "illuminate/support": "^8.0|^9.0|^10.0", + "php": "^8.0", + "symfony/yaml": "^6.0" + }, + "require-dev": { + "orchestra/testbench": "^6.0|^7.0|^8.0", + "phpstan/phpstan": "^1.10" + }, + "bin": [ + "bin/sail" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Docker files for running a basic Laravel application.", + "keywords": [ + "docker", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" + }, + "time": "2023-05-04T14:52:56+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "e92dcc83d5a51851baf5f5591d32cb2b16e3684e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/e92dcc83d5a51851baf5f5591d32cb2b16e3684e", + "reference": "e92dcc83d5a51851baf5f5591d32cb2b16e3684e", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": "^7.3 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Mockery": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "http://davedevelopment.co.uk" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "issues": "https://github.com/mockery/mockery/issues", + "source": "https://github.com/mockery/mockery/tree/1.5.1" + }, + "time": "2022-09-07T15:32:08+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2023-03-08T13:26:56+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v7.5.2", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "76b3cabda0aabda455fc3b9db6c3615f5a87c7ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/76b3cabda0aabda455fc3b9db6c3615f5a87c7ff", + "reference": "76b3cabda0aabda455fc3b9db6c3615f5a87c7ff", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.15.2", + "nunomaduro/termwind": "^1.15.1", + "php": "^8.1.0", + "symfony/console": "^6.2.8" + }, + "conflict": { + "phpunit/phpunit": "<10.1.2" + }, + "require-dev": { + "brianium/paratest": "^7.1.3", + "laravel/framework": "^10.8.0", + "laravel/pint": "^1.9.0", + "laravel/sail": "^1.21.4", + "laravel/sanctum": "^3.2.1", + "laravel/tinker": "^2.8.1", + "nunomaduro/larastan": "^2.6.0", + "orchestra/testbench-core": "^8.5.0", + "pestphp/pest": "^2.5.2", + "phpunit/phpunit": "^10.1.1", + "sebastian/environment": "^6.0.1", + "spatie/laravel-ignition": "^2.1.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2023-04-22T22:12:40+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, + "time": "2021-07-20T11:28:43+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "10.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "884a0da7f9f46f28b2cb69134217fd810b793974" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/884a0da7f9f46f28b2cb69134217fd810b793974", + "reference": "884a0da7f9f46f28b2cb69134217fd810b793974", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.15", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-text-template": "^3.0", + "sebastian/code-unit-reverse-lookup": "^3.0", + "sebastian/complexity": "^3.0", + "sebastian/environment": "^6.0", + "sebastian/lines-of-code": "^2.0", + "sebastian/version": "^4.0", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-04-17T12:15:40+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "5647d65443818959172645e7ed999217360654b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/5647d65443818959172645e7ed999217360654b6", + "reference": "5647d65443818959172645e7ed999217360654b6", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-05-07T09:13:23+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:56:09+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/9f3d3709577a527025f55bcf0f7ab8052c8bb37d", + "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:56:46+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:57:52+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "10.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "2379ebafc1737e71cdc84f402acb6b7f04198b9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2379ebafc1737e71cdc84f402acb6b7f04198b9d", + "reference": "2379ebafc1737e71cdc84f402acb6b7f04198b9d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-invoker": "^4.0", + "phpunit/php-text-template": "^3.0", + "phpunit/php-timer": "^6.0", + "sebastian/cli-parser": "^2.0", + "sebastian/code-unit": "^2.0", + "sebastian/comparator": "^5.0", + "sebastian/diff": "^5.0", + "sebastian/environment": "^6.0", + "sebastian/exporter": "^5.0", + "sebastian/global-state": "^6.0", + "sebastian/object-enumerator": "^5.0", + "sebastian/recursion-context": "^5.0", + "sebastian/type": "^4.0", + "sebastian/version": "^4.0" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.1-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.1.3" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2023-05-11T05:16:22+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae", + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:15+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:43+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:59:15+00:00" + }, + { + "name": "sebastian/comparator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/72f01e6586e0caf6af81297897bd112eb7e9627c", + "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:07:16+00:00" + }, + { + "name": "sebastian/complexity", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/e67d240970c9dc7ea7b2123a6d520e334dd61dc6", + "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.10", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:59:47+00:00" + }, + { + "name": "sebastian/diff", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/912dc2fbe3e3c1e7873313cc801b100b6c68c87b", + "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-05-01T07:48:21+00:00" + }, + { + "name": "sebastian/environment", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951", + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-04-11T05:39:26+00:00" + }, + { + "name": "sebastian/exporter", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", + "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:06:49+00:00" + }, + { + "name": "sebastian/global-state", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "aab257c712de87b90194febd52e4d184551c2d44" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/aab257c712de87b90194febd52e4d184551c2d44", + "reference": "aab257c712de87b90194febd52e4d184551c2d44", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:07:38+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/17c4d940ecafb3d15d2cf916f4108f664e28b130", + "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.10", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:08:02+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:08:32+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:06:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:05:40+00:00" + }, + { + "name": "sebastian/type", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:10:45+00:00" + }, + { + "name": "sebastian/version", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-07T11:34:05+00:00" + }, + { + "name": "spatie/backtrace", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "ec4dd16476b802dbdc6b4467f84032837e316b8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/ec4dd16476b802dbdc6b4467f84032837e316b8c", + "reference": "ec4dd16476b802dbdc6b4467f84032837e316b8c", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "ext-json": "*", + "phpunit/phpunit": "^9.3", + "spatie/phpunit-snapshot-assertions": "^4.2", + "symfony/var-dumper": "^5.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backtrace\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", + "keywords": [ + "Backtrace", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/backtrace/tree/1.4.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2023-03-04T08:57:24+00:00" + }, + { + "name": "spatie/flare-client-php", + "version": "1.3.6", + "source": { + "type": "git", + "url": "https://github.com/spatie/flare-client-php.git", + "reference": "530ac81255af79f114344286e4275f8869c671e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/530ac81255af79f114344286e4275f8869c671e2", + "reference": "530ac81255af79f114344286e4275f8869c671e2", + "shasum": "" + }, + "require": { + "illuminate/pipeline": "^8.0|^9.0|^10.0", + "php": "^8.0", + "spatie/backtrace": "^1.2", + "symfony/http-foundation": "^5.0|^6.0", + "symfony/mime": "^5.2|^6.0", + "symfony/process": "^5.2|^6.0", + "symfony/var-dumper": "^5.2|^6.0" + }, + "require-dev": { + "dms/phpunit-arraysubset-asserts": "^0.3.0", + "pestphp/pest": "^1.20", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "spatie/phpunit-snapshot-assertions": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.1.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\FlareClient\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Send PHP errors to Flare", + "homepage": "https://github.com/spatie/flare-client-php", + "keywords": [ + "exception", + "flare", + "reporting", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/flare-client-php/issues", + "source": "https://github.com/spatie/flare-client-php/tree/1.3.6" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2023-04-12T07:57:12+00:00" + }, + { + "name": "spatie/ignition", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/ignition.git", + "reference": "f747d83c6d7cb6229b462f3ddbb3a82dc0db0f78" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ignition/zipball/f747d83c6d7cb6229b462f3ddbb3a82dc0db0f78", + "reference": "f747d83c6d7cb6229b462f3ddbb3a82dc0db0f78", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "spatie/backtrace": "^1.4", + "spatie/flare-client-php": "^1.1", + "symfony/console": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "require-dev": { + "illuminate/cache": "^9.52", + "mockery/mockery": "^1.4", + "pestphp/pest": "^1.20", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "psr/simple-cache-implementation": "*", + "symfony/cache": "^6.2", + "symfony/process": "^5.4|^6.0", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "simple-cache-implementation": "To cache solutions from OpenAI" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spatie\\Ignition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for PHP applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/ignition/issues", + "source": "https://github.com/spatie/ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2023-05-04T13:20:26+00:00" + }, + { + "name": "spatie/laravel-ignition", + "version": "2.1.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ignition.git", + "reference": "2f99fa6b732a6049e78ed34e4608ce589605ae54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/2f99fa6b732a6049e78ed34e4608ce589605ae54", + "reference": "2f99fa6b732a6049e78ed34e4608ce589605ae54", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/support": "^10.0", + "php": "^8.1", + "spatie/flare-client-php": "^1.3.5", + "spatie/ignition": "^1.5.0", + "symfony/console": "^6.2.3", + "symfony/var-dumper": "^6.2.3" + }, + "require-dev": { + "livewire/livewire": "^2.11", + "mockery/mockery": "^1.5.1", + "openai-php/client": "^0.3.4", + "orchestra/testbench": "^8.0", + "pestphp/pest": "^1.22.3", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan-deprecation-rules": "^1.1.1", + "phpstan/phpstan-phpunit": "^1.3.3", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "psr/simple-cache-implementation": "Needed to cache solutions from OpenAI" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\LaravelIgnition\\IgnitionServiceProvider" + ], + "aliases": { + "Flare": "Spatie\\LaravelIgnition\\Facades\\Flare" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\LaravelIgnition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for Laravel applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/laravel-ignition/issues", + "source": "https://github.com/spatie/laravel-ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2023-05-09T07:19:31+00:00" + }, + { + "name": "symfony/yaml", + "version": "v6.2.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "61916f3861b1e9705b18cfde723921a71dd1559d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/61916f3861b1e9705b18cfde723921a71dd1559d", + "reference": "61916f3861b1e9705b18cfde723921a71dd1559d", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v6.2.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-04-28T13:25:36+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2021-07-28T10:34:58+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.1", + "ext-dom": "*", + "ext-libxml": "*" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/backend-server/config/app.php b/backend-server/config/app.php new file mode 100644 index 00000000..6cdd9f5b --- /dev/null +++ b/backend-server/config/app.php @@ -0,0 +1,189 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => (bool) env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | your application so that it is used when running Artisan tasks. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + 'asset_url' => env('ASSET_URL'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. We have gone + | ahead and set this to a sensible default for you out of the box. + | + */ + + 'timezone' => 'UTC', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by the translation service provider. You are free to set this value + | to any of the locales which will be supported by the application. + | + */ + + 'locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Application Fallback Locale + |-------------------------------------------------------------------------- + | + | The fallback locale determines the locale to use when the current one + | is not available. You may change the value to correspond to any of + | the language folders that are provided through your application. + | + */ + + 'fallback_locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Faker Locale + |-------------------------------------------------------------------------- + | + | This locale will be used by the Faker PHP library when generating fake + | data for your database seeds. For example, this will be used to get + | localized telephone numbers, street address information and more. + | + */ + + 'faker_locale' => 'en_US', + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is used by the Illuminate encrypter service and should be set + | to a random, 32 character string, otherwise these encrypted strings + | will not be safe. Please do this before deploying an application! + | + */ + + 'key' => env('APP_KEY'), + + 'cipher' => 'AES-256-CBC', + + /* + |-------------------------------------------------------------------------- + | Maintenance Mode Driver + |-------------------------------------------------------------------------- + | + | These configuration options determine the driver used to determine and + | manage Laravel's "maintenance mode" status. The "cache" driver will + | allow maintenance mode to be controlled across multiple machines. + | + | Supported drivers: "file", "cache" + | + */ + + 'maintenance' => [ + 'driver' => 'file', + // 'store' => 'redis', + ], + + /* + |-------------------------------------------------------------------------- + | Autoloaded Service Providers + |-------------------------------------------------------------------------- + | + | The service providers listed here will be automatically loaded on the + | request to your application. Feel free to add your own services to + | this array to grant expanded functionality to your applications. + | + */ + + 'providers' => ServiceProvider::defaultProviders()->merge([ + /* + * Package Service Providers... + */ + + /* + * Application Service Providers... + */ + App\Providers\AppServiceProvider::class, + App\Providers\AuthServiceProvider::class, + // App\Providers\BroadcastServiceProvider::class, + App\Providers\EventServiceProvider::class, + App\Providers\RouteServiceProvider::class, + Laravel\Telescope\TelescopeServiceProvider::class, + ])->toArray(), + + /* + |-------------------------------------------------------------------------- + | Class Aliases + |-------------------------------------------------------------------------- + | + | This array of class aliases will be registered when this application + | is started. However, feel free to register as many as you wish as + | the aliases are "lazy" loaded so they don't hinder performance. + | + */ + + 'aliases' => Facade::defaultAliases()->merge([ + // 'Example' => App\Facades\Example::class, + ])->toArray(), + +]; diff --git a/backend-server/config/auth.php b/backend-server/config/auth.php new file mode 100644 index 00000000..9548c15d --- /dev/null +++ b/backend-server/config/auth.php @@ -0,0 +1,115 @@ + [ + 'guard' => 'web', + 'passwords' => 'users', + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | here which uses session storage and the Eloquent user provider. + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | Supported: "session" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | If you have multiple user tables or models you may configure multiple + | sources which represent each model / table. These sources may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => App\Models\User::class, + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | You may specify multiple password reset configurations if you have more + | than one user table or model in the application and you want to have + | separate password reset settings based on the specific user types. + | + | The expiry time is the number of minutes that each reset token will be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + | The throttle setting is the number of seconds a user must wait before + | generating more password reset tokens. This prevents the user from + | quickly generating a very large amount of password reset tokens. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => 'password_reset_tokens', + 'expire' => 60, + 'throttle' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the amount of seconds before a password confirmation + | times out and the user is prompted to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => 10800, + +]; diff --git a/backend-server/config/broadcasting.php b/backend-server/config/broadcasting.php new file mode 100644 index 00000000..9e4d4aa4 --- /dev/null +++ b/backend-server/config/broadcasting.php @@ -0,0 +1,70 @@ + env('BROADCAST_DRIVER', 'null'), + + /* + |-------------------------------------------------------------------------- + | Broadcast Connections + |-------------------------------------------------------------------------- + | + | Here you may define all of the broadcast connections that will be used + | to broadcast events to other systems or over websockets. Samples of + | each available type of connection are provided inside this array. + | + */ + + 'connections' => [ + + 'pusher' => [ + 'driver' => 'pusher', + 'key' => env('PUSHER_APP_KEY'), + 'secret' => env('PUSHER_APP_SECRET'), + 'app_id' => env('PUSHER_APP_ID'), + 'options' => [ + 'host' => env('PUSHER_HOST') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com', + 'port' => env('PUSHER_PORT', 443), + 'scheme' => env('PUSHER_SCHEME', 'https'), + 'encrypted' => true, + 'useTLS' => env('PUSHER_SCHEME', 'https') === 'https', + ], + 'client_options' => [ + // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html + ], + ], + + 'ably' => [ + 'driver' => 'ably', + 'key' => env('ABLY_KEY'), + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + ], + + 'log' => [ + 'driver' => 'log', + ], + + 'null' => [ + 'driver' => 'null', + ], + + ], + +]; diff --git a/backend-server/config/cache.php b/backend-server/config/cache.php new file mode 100644 index 00000000..33bb2954 --- /dev/null +++ b/backend-server/config/cache.php @@ -0,0 +1,110 @@ + env('CACHE_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "apc", "array", "database", "file", + | "memcached", "redis", "dynamodb", "octane", "null" + | + */ + + 'stores' => [ + + 'apc' => [ + 'driver' => 'apc', + ], + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'cache', + 'connection' => null, + 'lock_connection' => null, + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'cache', + 'lock_connection' => 'default', + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + 'octane' => [ + 'driver' => 'octane', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing the APC, database, memcached, Redis, or DynamoDB cache + | stores there might be other applications using the same cache. For + | that reason, you may prefix every cache key to avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'), + +]; diff --git a/backend-server/config/cors.php b/backend-server/config/cors.php new file mode 100644 index 00000000..8a39e6da --- /dev/null +++ b/backend-server/config/cors.php @@ -0,0 +1,34 @@ + ['api/*', 'sanctum/csrf-cookie'], + + 'allowed_methods' => ['*'], + + 'allowed_origins' => ['*'], + + 'allowed_origins_patterns' => [], + + 'allowed_headers' => ['*'], + + 'exposed_headers' => [], + + 'max_age' => 0, + + 'supports_credentials' => false, + +]; diff --git a/backend-server/config/database.php b/backend-server/config/database.php new file mode 100644 index 00000000..137ad18c --- /dev/null +++ b/backend-server/config/database.php @@ -0,0 +1,151 @@ + env('DB_CONNECTION', 'mysql'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Here are each of the database connections setup for your application. + | Of course, examples of configuring each database platform that is + | supported by Laravel is shown below to make development simple. + | + | + | All database work in Laravel is done through the PHP PDO facilities + | so make sure you have the driver for your particular database of + | choice installed on your machine before you begin development. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DATABASE_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => 'prefer', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run in the database. + | + */ + + 'migrations' => 'migrations', + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as APC or Memcached. Laravel makes it easy to dig right in. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + ], + + ], + +]; diff --git a/backend-server/config/filesystems.php b/backend-server/config/filesystems.php new file mode 100644 index 00000000..45ec2f18 --- /dev/null +++ b/backend-server/config/filesystems.php @@ -0,0 +1,67 @@ + env('FILESYSTEM_DISK', 'local'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Here you may configure as many filesystem "disks" as you wish, and you + | may even configure multiple disks of the same driver. Defaults have + | been set up for each driver as an example of the required values. + | + | Supported Drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app'), + 'throw' => false, + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => env('APP_URL').'/storage', + 'visibility' => 'public', + 'throw' => false, + ], + + 'shared_volume' => [ + 'driver' => 'local', + 'root' => '/app/shared_data', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/backend-server/config/hashing.php b/backend-server/config/hashing.php new file mode 100644 index 00000000..bcd3be4c --- /dev/null +++ b/backend-server/config/hashing.php @@ -0,0 +1,52 @@ + 'bcrypt', + + /* + |-------------------------------------------------------------------------- + | Bcrypt Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Bcrypt algorithm. This will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'bcrypt' => [ + 'rounds' => env('BCRYPT_ROUNDS', 10), + ], + + /* + |-------------------------------------------------------------------------- + | Argon Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Argon algorithm. These will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'argon' => [ + 'memory' => 65536, + 'threads' => 1, + 'time' => 4, + ], + +]; diff --git a/backend-server/config/logging.php b/backend-server/config/logging.php new file mode 100644 index 00000000..c44d2763 --- /dev/null +++ b/backend-server/config/logging.php @@ -0,0 +1,131 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Deprecations Log Channel + |-------------------------------------------------------------------------- + | + | This option controls the log channel that should be used to log warnings + | regarding deprecated PHP and library features. This allows you to get + | your application ready for upcoming major versions of dependencies. + | + */ + + 'deprecations' => [ + 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), + 'trace' => false, + ], + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Out of + | the box, Laravel uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", + | "custom", "stack" + | + */ + + 'channels' => [ + 'stack' => [ + 'driver' => 'stack', + 'channels' => ['single'], + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => 14, + 'replace_placeholders' => true, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => 'Laravel Log', + 'emoji' => ':boom:', + 'level' => env('LOG_LEVEL', 'critical'), + 'replace_placeholders' => true, + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'with' => [ + 'stream' => 'php://stderr', + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + 'facility' => LOG_USER, + 'replace_placeholders' => true, + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + ], + +]; diff --git a/backend-server/config/mail.php b/backend-server/config/mail.php new file mode 100644 index 00000000..e652bd02 --- /dev/null +++ b/backend-server/config/mail.php @@ -0,0 +1,125 @@ + env('MAIL_MAILER', 'smtp'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers to be used while + | sending an e-mail. You will specify which one you are using for your + | mailers below. You are free to add additional mailers as required. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", + | "postmark", "log", "array", "failover" + | + */ + + 'mailers' => [ + 'smtp' => [ + 'transport' => 'smtp', + 'url' => env('MAIL_URL'), + 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), + 'port' => env('MAIL_PORT', 587), + 'encryption' => env('MAIL_ENCRYPTION', 'tls'), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN'), + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'mailgun' => [ + 'transport' => 'mailgun', + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'postmark' => [ + 'transport' => 'postmark', + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + ], + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all e-mails sent by your application to be sent from + | the same address. Here, you may specify a name and address that is + | used globally for all e-mails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + + /* + |-------------------------------------------------------------------------- + | Markdown Mail Settings + |-------------------------------------------------------------------------- + | + | If you are using Markdown based email rendering, you may configure your + | theme and component paths here, allowing you to customize the design + | of the emails. Or, you may simply stick with the Laravel defaults! + | + */ + + 'markdown' => [ + 'theme' => 'default', + + 'paths' => [ + resource_path('views/vendor/mail'), + ], + ], + +]; diff --git a/backend-server/config/queue.php b/backend-server/config/queue.php new file mode 100644 index 00000000..01c6b054 --- /dev/null +++ b/backend-server/config/queue.php @@ -0,0 +1,109 @@ + env('QUEUE_CONNECTION', 'sync'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection information for each server that + | is used by your application. A default configuration has been added + | for each back-end shipped with Laravel. You are free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'jobs', + 'queue' => 'default', + 'retry_after' => 90, + 'after_commit' => false, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => 'localhost', + 'queue' => 'default', + 'retry_after' => 90, + 'block_for' => 0, + 'after_commit' => false, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => 90, + 'block_for' => null, + 'after_commit' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Job Batching + |-------------------------------------------------------------------------- + | + | The following options configure the database and table that store job + | batching information. These options can be updated to any database + | connection and table which has been defined by your application. + | + */ + + 'batching' => [ + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'job_batches', + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control which database and table are used to store the jobs that + | have failed. You may change them to any database / table you wish. + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/backend-server/config/sanctum.php b/backend-server/config/sanctum.php new file mode 100644 index 00000000..529cfdc9 --- /dev/null +++ b/backend-server/config/sanctum.php @@ -0,0 +1,67 @@ + explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( + '%s%s', + 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', + Sanctum::currentApplicationUrlWithPort() + ))), + + /* + |-------------------------------------------------------------------------- + | Sanctum Guards + |-------------------------------------------------------------------------- + | + | This array contains the authentication guards that will be checked when + | Sanctum is trying to authenticate a request. If none of these guards + | are able to authenticate the request, Sanctum will use the bearer + | token that's present on an incoming request for authentication. + | + */ + + 'guard' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Expiration Minutes + |-------------------------------------------------------------------------- + | + | This value controls the number of minutes until an issued token will be + | considered expired. If this value is null, personal access tokens do + | not expire. This won't tweak the lifetime of first-party sessions. + | + */ + + 'expiration' => null, + + /* + |-------------------------------------------------------------------------- + | Sanctum Middleware + |-------------------------------------------------------------------------- + | + | When authenticating your first-party SPA with Sanctum you may need to + | customize some of the middleware Sanctum uses while processing the + | request. You may change the middleware listed below as required. + | + */ + + 'middleware' => [ + 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class, + 'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class, + ], + +]; diff --git a/backend-server/config/services.php b/backend-server/config/services.php new file mode 100644 index 00000000..0ace530e --- /dev/null +++ b/backend-server/config/services.php @@ -0,0 +1,34 @@ + [ + 'domain' => env('MAILGUN_DOMAIN'), + 'secret' => env('MAILGUN_SECRET'), + 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), + 'scheme' => 'https', + ], + + 'postmark' => [ + 'token' => env('POSTMARK_TOKEN'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + +]; diff --git a/backend-server/config/session.php b/backend-server/config/session.php new file mode 100644 index 00000000..8fed97c0 --- /dev/null +++ b/backend-server/config/session.php @@ -0,0 +1,201 @@ + env('SESSION_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to immediately expire on the browser closing, set that option. + | + */ + + 'lifetime' => env('SESSION_LIFETIME', 120), + + 'expire_on_close' => false, + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it is stored. All encryption will be run + | automatically by Laravel and you can use the Session like normal. + | + */ + + 'encrypt' => false, + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When using the native session driver, we need a location where session + | files may be stored. A default has been set for you but a different + | location may be specified. This is only needed for file sessions. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION'), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table we + | should use to manage the sessions. Of course, a sensible default is + | provided for you; however, you are free to change this as needed. + | + */ + + 'table' => 'sessions', + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | While using one of the framework's cache driven session backends you may + | list a cache store that should be used for these sessions. This value + | must match with one of the application's configured cache "stores". + | + | Affects: "apc", "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE'), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the cookie used to identify a session + | instance by ID. The name specified here will get used every time a + | new session cookie is created by the framework for every driver. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug(env('APP_NAME', 'laravel'), '_').'_session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application but you are free to change this when necessary. + | + */ + + 'path' => '/', + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | Here you may change the domain of the cookie used to identify a session + | in your application. This will determine which domains the cookie is + | available to in your application. A sensible default has been set. + | + */ + + 'domain' => env('SESSION_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you when it can't be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE'), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. You are free to modify this option if needed. + | + */ + + 'http_only' => true, + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" since this is a secure default value. + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => 'lax', + +]; diff --git a/backend-server/config/view.php b/backend-server/config/view.php new file mode 100644 index 00000000..22b8a18d --- /dev/null +++ b/backend-server/config/view.php @@ -0,0 +1,36 @@ + [ + resource_path('views'), + ], + + /* + |-------------------------------------------------------------------------- + | Compiled View Path + |-------------------------------------------------------------------------- + | + | This option determines where all the compiled Blade templates will be + | stored for your application. Typically, this is within the storage + | directory. However, as usual, you are free to change this value. + | + */ + + 'compiled' => env( + 'VIEW_COMPILED_PATH', + realpath(storage_path('framework/views')) + ), + +]; diff --git a/backend-server/database/.gitignore b/backend-server/database/.gitignore new file mode 100644 index 00000000..9b19b93c --- /dev/null +++ b/backend-server/database/.gitignore @@ -0,0 +1 @@ +*.sqlite* diff --git a/backend-server/database/factories/UserFactory.php b/backend-server/database/factories/UserFactory.php new file mode 100644 index 00000000..a6ecc0af --- /dev/null +++ b/backend-server/database/factories/UserFactory.php @@ -0,0 +1,38 @@ + + */ +class UserFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + 'email' => fake()->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password + 'remember_token' => Str::random(10), + ]; + } + + /** + * Indicate that the model's email address should be unverified. + */ + public function unverified(): static + { + return $this->state(fn (array $attributes) => [ + 'email_verified_at' => null, + ]); + } +} diff --git a/backend-server/database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php b/backend-server/database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php new file mode 100644 index 00000000..81a7229b --- /dev/null +++ b/backend-server/database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php @@ -0,0 +1,28 @@ +string('email')->primary(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('password_reset_tokens'); + } +}; diff --git a/backend-server/database/migrations/2019_08_19_000000_create_failed_jobs_table.php b/backend-server/database/migrations/2019_08_19_000000_create_failed_jobs_table.php new file mode 100644 index 00000000..249da817 --- /dev/null +++ b/backend-server/database/migrations/2019_08_19_000000_create_failed_jobs_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('uuid')->unique(); + $table->text('connection'); + $table->text('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('failed_jobs'); + } +}; diff --git a/backend-server/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php b/backend-server/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php new file mode 100644 index 00000000..e828ad81 --- /dev/null +++ b/backend-server/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php @@ -0,0 +1,33 @@ +id(); + $table->morphs('tokenable'); + $table->string('name'); + $table->string('token', 64)->unique(); + $table->text('abilities')->nullable(); + $table->timestamp('last_used_at')->nullable(); + $table->timestamp('expires_at')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('personal_access_tokens'); + } +}; diff --git a/backend-server/database/migrations/2023_05_12_110303_create_chatbots_table.php b/backend-server/database/migrations/2023_05_12_110303_create_chatbots_table.php new file mode 100644 index 00000000..ecb8e331 --- /dev/null +++ b/backend-server/database/migrations/2023_05_12_110303_create_chatbots_table.php @@ -0,0 +1,35 @@ +uuid('id'); + $table->string('name'); + $table->string('token'); + $table->string('website')->nullable(); + $table->string('status')->default('draft'); + $table->text('prompt_message'); + $table->boolean('enhanced_privacy')->default(false); + $table->boolean('smart_sync')->default(false); + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('chatbots'); + } +}; diff --git a/backend-server/database/migrations/2023_05_12_110323_create_chat_histories_table.php b/backend-server/database/migrations/2023_05_12_110323_create_chat_histories_table.php new file mode 100644 index 00000000..60d8e5cc --- /dev/null +++ b/backend-server/database/migrations/2023_05_12_110323_create_chat_histories_table.php @@ -0,0 +1,30 @@ +uuid('id'); + $table->uuid('chatbot_id'); + $table->string('from'); // user or bot + $table->text('message'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('chat_histories'); + } +}; diff --git a/backend-server/database/migrations/2023_05_12_110357_create_chatbot_settings_table.php b/backend-server/database/migrations/2023_05_12_110357_create_chatbot_settings_table.php new file mode 100644 index 00000000..069892e0 --- /dev/null +++ b/backend-server/database/migrations/2023_05_12_110357_create_chatbot_settings_table.php @@ -0,0 +1,30 @@ +uuid('id'); + $table->uuid('chatbot_id'); + $table->string('name'); + $table->string('value'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('chatbot_settings'); + } +}; diff --git a/backend-server/database/migrations/2023_05_12_110416_create_onboarding_steps_table.php b/backend-server/database/migrations/2023_05_12_110416_create_onboarding_steps_table.php new file mode 100644 index 00000000..4d94ad29 --- /dev/null +++ b/backend-server/database/migrations/2023_05_12_110416_create_onboarding_steps_table.php @@ -0,0 +1,30 @@ +uuid('id'); + $table->uuid('chatbot_id'); + $table->string('name'); + $table->boolean('finished')->default(false); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('onboarding_steps'); + } +}; diff --git a/backend-server/database/migrations/2023_05_12_161106_create_website_data_sources_table.php b/backend-server/database/migrations/2023_05_12_161106_create_website_data_sources_table.php new file mode 100644 index 00000000..be49f8dc --- /dev/null +++ b/backend-server/database/migrations/2023_05_12_161106_create_website_data_sources_table.php @@ -0,0 +1,33 @@ +uuid('id'); + $table->uuid('chatbot_id'); + $table->string('root_url'); + $table->string('icon')->nullable(); + $table->datetime('vector_databased_last_ingested_at')->nullable(); + $table->string('crawling_status')->default('pending'); + $table->float('crawling_progress')->default(0.0); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('website_data_sources'); + } +}; diff --git a/backend-server/database/migrations/2023_05_12_214227_create_jobs_table.php b/backend-server/database/migrations/2023_05_12_214227_create_jobs_table.php new file mode 100644 index 00000000..6098d9b1 --- /dev/null +++ b/backend-server/database/migrations/2023_05_12_214227_create_jobs_table.php @@ -0,0 +1,32 @@ +bigIncrements('id'); + $table->string('queue')->index(); + $table->longText('payload'); + $table->unsignedTinyInteger('attempts'); + $table->unsignedInteger('reserved_at')->nullable(); + $table->unsignedInteger('available_at'); + $table->unsignedInteger('created_at'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('jobs'); + } +}; diff --git a/backend-server/database/migrations/2023_05_14_114015_create_crawled_pages_table.php b/backend-server/database/migrations/2023_05_14_114015_create_crawled_pages_table.php new file mode 100644 index 00000000..3dd1be5f --- /dev/null +++ b/backend-server/database/migrations/2023_05_14_114015_create_crawled_pages_table.php @@ -0,0 +1,35 @@ +uuid('id')->primary(); + $table->uuid('chatbot_id'); + $table->uuid('website_data_source_id'); + $table->string('url'); + $table->string('title')->nullable(); + $table->string('status_code')->nullable(); + $table->longText('content')->nullable(); + $table->longText('normalized_content')->nullable(); + $table->text('aws_url')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('crawled_pages'); + } +}; diff --git a/backend-server/database/migrations/2023_05_14_222511_create_text_data_sources_table.php b/backend-server/database/migrations/2023_05_14_222511_create_text_data_sources_table.php new file mode 100644 index 00000000..7278f807 --- /dev/null +++ b/backend-server/database/migrations/2023_05_14_222511_create_text_data_sources_table.php @@ -0,0 +1,27 @@ +id(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('text_data_sources'); + } +}; diff --git a/backend-server/database/migrations/2023_05_14_222525_create_pdf_data_sources_table.php b/backend-server/database/migrations/2023_05_14_222525_create_pdf_data_sources_table.php new file mode 100644 index 00000000..40ba39d6 --- /dev/null +++ b/backend-server/database/migrations/2023_05_14_222525_create_pdf_data_sources_table.php @@ -0,0 +1,30 @@ +uuid('id')->primary(); + $table->uuid('chatbot_id'); + $table->json('files'); + $table->string('folder_name')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('pdf_data_sources'); + } +}; diff --git a/backend-server/database/migrations/2023_05_14_222537_create_notion_data_sources_table.php b/backend-server/database/migrations/2023_05_14_222537_create_notion_data_sources_table.php new file mode 100644 index 00000000..9ec290b4 --- /dev/null +++ b/backend-server/database/migrations/2023_05_14_222537_create_notion_data_sources_table.php @@ -0,0 +1,27 @@ +id(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('notion_data_sources'); + } +}; diff --git a/backend-server/database/seeders/DatabaseSeeder.php b/backend-server/database/seeders/DatabaseSeeder.php new file mode 100644 index 00000000..a9f4519f --- /dev/null +++ b/backend-server/database/seeders/DatabaseSeeder.php @@ -0,0 +1,22 @@ +create(); + + // \App\Models\User::factory()->create([ + // 'name' => 'Test User', + // 'email' => 'test@example.com', + // ]); + } +} diff --git a/backend-server/nginx.conf b/backend-server/nginx.conf new file mode 100644 index 00000000..948adbce --- /dev/null +++ b/backend-server/nginx.conf @@ -0,0 +1,22 @@ +server { + listen 80; + server_name localhost; + root /var/www/html/public; + + index index.php index.html; + + location / { + try_files $uri $uri/ /index.php?$query_string; + } + + location ~ \.php$ { + fastcgi_pass php-fpm:9000; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + } + + location ~ /\.ht { + deny all; + } +} diff --git a/backend-server/package.json b/backend-server/package.json new file mode 100644 index 00000000..e543e0d1 --- /dev/null +++ b/backend-server/package.json @@ -0,0 +1,13 @@ +{ + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build" + }, + "devDependencies": { + "axios": "^1.1.2", + "laravel-vite-plugin": "^0.7.5", + "vite": "^4.0.0" + } +} diff --git a/backend-server/phpunit.xml b/backend-server/phpunit.xml new file mode 100644 index 00000000..e9f533da --- /dev/null +++ b/backend-server/phpunit.xml @@ -0,0 +1,31 @@ + + + + + ./tests/Unit + + + ./tests/Feature + + + + + ./app + + + + + + + + + + + + + + diff --git a/backend-server/public/.DS_Store b/backend-server/public/.DS_Store new file mode 100644 index 00000000..fc8018a5 Binary files /dev/null and b/backend-server/public/.DS_Store differ diff --git a/backend-server/public/.htaccess b/backend-server/public/.htaccess new file mode 100644 index 00000000..3aec5e27 --- /dev/null +++ b/backend-server/public/.htaccess @@ -0,0 +1,21 @@ + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Send Requests To Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/backend-server/public/chat.css b/backend-server/public/chat.css new file mode 100644 index 00000000..4bbdeac4 --- /dev/null +++ b/backend-server/public/chat.css @@ -0,0 +1 @@ +.closed,.open{transition:opacity .1s ease-in-out}#chat-container{position:fixed;bottom:20px;right:20px;z-index:9999}.open{opacity:1;visibility:visible}.closed{opacity:0;visibility:hidden}#chat-bubble{display:flex;align-items:center;justify-content:center;color:#fff;border-radius:50%;cursor:pointer;width:60px;height:60px;font-family:Arial,sans-serif;background:linear-gradient(135deg,#2a27da,#0cf);box-shadow:rgba(0,77,255,.5) 0 4px 24px;transition:background .3s ease-in-out}#chat-bubble:hover{background:linear-gradient(135deg,#da2792,#0cf)}#chat-box{position:absolute;bottom:72px;right:0;width:450px;height:600px;background-color:#fff;overflow:auto;text-align:right;border-radius:20px;box-shadow:rgba(149,157,165,.2) 0 8px 24px;border:1px solid #d2d2d2}@media (max-width:767px){#chat-box{width:calc(100% - -300px)!important}} diff --git a/backend-server/public/chat.js b/backend-server/public/chat.js new file mode 100644 index 00000000..64ab145a --- /dev/null +++ b/backend-server/public/chat.js @@ -0,0 +1,23 @@ +function toggleChat() { + var e = document.getElementById("chat-box"); + e.classList.contains("open") ? (e.classList.remove("open"), e.classList.add("closed")) : (e.classList.remove("closed"), e.classList.add("open")) +} + +function initializeChatWidget(e) { + var t = document.createElement("div"); + t.id = "chat-container"; + var a = document.createElement("div"); + a.id = "chat-bubble", a.onclick = toggleChat, a.innerHTML = ''; + var i = document.createElement("div"); + i.id = "chat-box", i.classList.add("closed"); + var d = "https://openchat.so/chat/" + e.token; + i.innerHTML = '', t.appendChild(a), t.appendChild(i), document.body.appendChild(t) +} + +function loadCSS() { + var e = document.createElement("link"); + e.rel = "stylesheet", e.href = "https://openchat.so/chat.css", document.head.appendChild(e) +} + +loadCSS(); + diff --git a/backend-server/public/dashboard/css/additional-styles/flatpickr.css b/backend-server/public/dashboard/css/additional-styles/flatpickr.css new file mode 100644 index 00000000..d099c6db --- /dev/null +++ b/backend-server/public/dashboard/css/additional-styles/flatpickr.css @@ -0,0 +1,229 @@ +/* Customise flatpickr */ +* { + --calendarPadding: 24px; + --daySize: 36px; + --daysWidth: calc(var(--daySize)*7); +} + +@keyframes fpFadeInDown { + from { + opacity: 0; + transform: translate3d(0, -8px, 0); + } + to { + opacity: 1; + transform: translate3d(0, 0, 0); + } +} + +.flatpickr-calendar { + border: inherit; + @apply rounded shadow-lg border border-slate-200 left-1/2; + margin-left: calc(calc(var(--daysWidth) + calc(var(--calendarPadding)*2))*0.5*-1); + padding: var(--calendarPadding); + width: calc(var(--daysWidth) + calc(var(--calendarPadding)*2)); +} + +@screen lg { + .flatpickr-calendar { + @apply left-0 right-auto; + margin-left: 0; + } +} + +.flatpickr-right.flatpickr-calendar { + @apply right-0 left-auto; + margin-left: 0; +} + +.flatpickr-calendar.animate.open { + animation: fpFadeInDown 200ms ease-out; +} + +.flatpickr-calendar.static { + position: absolute; + top: calc(100% + 4px); +} + +.flatpickr-calendar.static.open { + z-index: 20; +} + +.flatpickr-days { + width: var(--daysWidth); +} + +.dayContainer { + width: var(--daysWidth); + min-width: var(--daysWidth); + max-width: var(--daysWidth); +} + +.flatpickr-day { + @apply bg-slate-50 text-sm font-medium text-slate-600; + max-width: var(--daySize); + height: var(--daySize); + line-height: var(--daySize); +} + +.flatpickr-day, +.flatpickr-day.prevMonthDay, +.flatpickr-day.nextMonthDay { + border: none; +} + +.flatpickr-day, +.flatpickr-day.prevMonthDay, +.flatpickr-day.nextMonthDay, +.flatpickr-day.selected.startRange, +.flatpickr-day.startRange.startRange, +.flatpickr-day.endRange.startRange, +.flatpickr-day.selected.endRange, +.flatpickr-day.startRange.endRange, +.flatpickr-day.endRange.endRange, +.flatpickr-day.selected.startRange.endRange, +.flatpickr-day.startRange.startRange.endRange, +.flatpickr-day.endRange.startRange.endRange { + border-radius: 0; +} + +.flatpickr-day.flatpickr-disabled, +.flatpickr-day.flatpickr-disabled:hover, +.flatpickr-day.prevMonthDay, +.flatpickr-day.nextMonthDay, +.flatpickr-day.notAllowed, +.flatpickr-day.notAllowed.prevMonthDay, +.flatpickr-day.notAllowed.nextMonthDay { + @apply text-slate-400; +} + +.rangeMode .flatpickr-day { + margin: 0; +} + +.flatpickr-day.selected, +.flatpickr-day.startRange, +.flatpickr-day.endRange, +.flatpickr-day.selected.inRange, +.flatpickr-day.startRange.inRange, +.flatpickr-day.endRange.inRange, +.flatpickr-day.selected:focus, +.flatpickr-day.startRange:focus, +.flatpickr-day.endRange:focus, +.flatpickr-day.selected:hover, +.flatpickr-day.startRange:hover, +.flatpickr-day.endRange:hover, +.flatpickr-day.selected.prevMonthDay, +.flatpickr-day.startRange.prevMonthDay, +.flatpickr-day.endRange.prevMonthDay, +.flatpickr-day.selected.nextMonthDay, +.flatpickr-day.startRange.nextMonthDay, +.flatpickr-day.endRange.nextMonthDay { + @apply bg-indigo-500 text-indigo-50; +} + +.flatpickr-day.inRange, +.flatpickr-day.prevMonthDay.inRange, +.flatpickr-day.nextMonthDay.inRange, +.flatpickr-day.today.inRange, +.flatpickr-day.prevMonthDay.today.inRange, +.flatpickr-day.nextMonthDay.today.inRange, +.flatpickr-day:hover, +.flatpickr-day.prevMonthDay:hover, +.flatpickr-day.nextMonthDay:hover, +.flatpickr-day:focus, +.flatpickr-day.prevMonthDay:focus, +.flatpickr-day.nextMonthDay:focus, +.flatpickr-day.today:hover, +.flatpickr-day.today:focus { + @apply bg-indigo-400 text-indigo-50; +} + +.flatpickr-day.inRange, +.flatpickr-day.selected.startRange + .endRange:not(:nth-child(7n+1)), +.flatpickr-day.startRange.startRange + .endRange:not(:nth-child(7n+1)), +.flatpickr-day.endRange.startRange + .endRange:not(:nth-child(7n+1)) { + box-shadow: none; +} + +.flatpickr-months { + align-items: center; + margin-top: -8px; + margin-bottom: 6px; +} + +.flatpickr-months .flatpickr-prev-month, +.flatpickr-months .flatpickr-next-month { + position: static; + height: auto; + @apply text-slate-600; +} + +.flatpickr-months .flatpickr-prev-month svg, +.flatpickr-months .flatpickr-next-month svg { + width: 7px; + height: 11px; +} + +.flatpickr-months .flatpickr-prev-month:hover, +.flatpickr-months .flatpickr-next-month:hover, +.flatpickr-months .flatpickr-prev-month:hover svg, +.flatpickr-months .flatpickr-next-month:hover svg { + fill: inherit; + @apply text-slate-400; +} + +.flatpickr-months .flatpickr-prev-month { + margin-left: -10px; +} + +.flatpickr-months .flatpickr-next-month { + margin-right: -10px; +} + +.flatpickr-months .flatpickr-month { + @apply text-slate-800; + height: auto; + line-height: inherit; +} + +.flatpickr-current-month { + @apply text-sm font-medium; + position: static; + height: auto; + width: auto; + left: auto; + padding: 0; +} + +.flatpickr-current-month span.cur-month { + @apply font-medium m-0; +} + +.flatpickr-current-month span.cur-month:hover { + background: none; +} + +.flatpickr-current-month input.cur-year { + font-weight: inherit; + box-shadow: none !important; +} + +.numInputWrapper:hover { + background: none; +} + +.numInputWrapper span { + display: none; +} + +span.flatpickr-weekday { + @apply text-slate-400 font-medium text-xs; +} + +.flatpickr-calendar.arrowTop::before, +.flatpickr-calendar.arrowTop::after, +.flatpickr-calendar.arrowBottom::before, +.flatpickr-calendar.arrowBottom::after { + display: none; +} \ No newline at end of file diff --git a/backend-server/public/dashboard/css/additional-styles/range-slider.css b/backend-server/public/dashboard/css/additional-styles/range-slider.css new file mode 100644 index 00000000..8d19a09e --- /dev/null +++ b/backend-server/public/dashboard/css/additional-styles/range-slider.css @@ -0,0 +1,57 @@ +/* Range slider */ +:root { + --range-thumb-size: 36px; +} + +input[type=range] { + appearance: none; + background: #ccc; + border-radius: 3px; + height: 6px; + margin-top: (--range-thumb-size - 6px) * 0.5; + margin-bottom: (--range-thumb-size - 6px) * 0.5; + --thumb-size: #{--range-thumb-size}; +} + +input[type=range]::-webkit-slider-thumb { + appearance: none; + -webkit-appearance: none; + background-color: #000; + background-image: url("data:image/svg+xml,%3Csvg width='12' height='8' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8 .5v7L12 4zM0 4l4 3.5v-7z' fill='%23FFF' fill-rule='nonzero'/%3E%3C/svg%3E"); + background-position: center; + background-repeat: no-repeat; + border: 0; + border-radius: 50%; + cursor: pointer; + height: --range-thumb-size; + width: --range-thumb-size; +} + +input[type=range]::-moz-range-thumb { + background-color: #000; + background-image: url("data:image/svg+xml,%3Csvg width='12' height='8' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8 .5v7L12 4zM0 4l4 3.5v-7z' fill='%23FFF' fill-rule='nonzero'/%3E%3C/svg%3E"); + background-position: center; + background-repeat: no-repeat; + border: 0; + border: none; + border-radius: 50%; + cursor: pointer; + height: --range-thumb-size; + width: --range-thumb-size; +} + +input[type=range]::-ms-thumb { + background-color: #000; + background-image: url("data:image/svg+xml,%3Csvg width='12' height='8' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8 .5v7L12 4zM0 4l4 3.5v-7z' fill='%23FFF' fill-rule='nonzero'/%3E%3C/svg%3E"); + background-position: center; + background-repeat: no-repeat; + border: 0; + border-radius: 50%; + cursor: pointer; + height: --range-thumb-size; + width: --range-thumb-size; +} + +input[type=range]::-moz-focus-outer { + border: 0; +} \ No newline at end of file diff --git a/backend-server/public/dashboard/css/additional-styles/theme.css b/backend-server/public/dashboard/css/additional-styles/theme.css new file mode 100644 index 00000000..0b69cb3b --- /dev/null +++ b/backend-server/public/dashboard/css/additional-styles/theme.css @@ -0,0 +1,8 @@ +.form-input:focus, +.form-textarea:focus, +.form-multiselect:focus, +.form-select:focus, +.form-checkbox:focus, +.form-radio:focus { + @apply ring-0; +} diff --git a/backend-server/public/dashboard/css/additional-styles/toggle-switch.css b/backend-server/public/dashboard/css/additional-styles/toggle-switch.css new file mode 100644 index 00000000..857fef40 --- /dev/null +++ b/backend-server/public/dashboard/css/additional-styles/toggle-switch.css @@ -0,0 +1,35 @@ +/* Switch element */ +.form-switch { + @apply relative select-none; + width: 44px; +} + +.form-switch label { + @apply block overflow-hidden cursor-pointer h-6 rounded-full; +} + +.form-switch label > span:first-child { + @apply absolute block rounded-full; + width: 20px; + height: 20px; + top: 2px; + left: 2px; + right: 50%; + transition: all .15s ease-out; +} + +.form-switch input[type="checkbox"]:checked + label { + @apply bg-indigo-500; +} + +.form-switch input[type="checkbox"]:checked + label > span:first-child { + left: 22px; +} + +.form-switch input[type="checkbox"]:disabled + label { + @apply cursor-not-allowed bg-slate-100 border border-slate-200; +} + +.form-switch input[type="checkbox"]:disabled + label > span:first-child { + @apply bg-slate-400; +} \ No newline at end of file diff --git a/backend-server/public/dashboard/css/additional-styles/utility-patterns.css b/backend-server/public/dashboard/css/additional-styles/utility-patterns.css new file mode 100644 index 00000000..e5b321fe --- /dev/null +++ b/backend-server/public/dashboard/css/additional-styles/utility-patterns.css @@ -0,0 +1,106 @@ +/* Typography */ +.h1 { + @apply text-4xl font-extrabold tracking-tighter; +} + +.h2 { + @apply text-3xl font-extrabold tracking-tighter; +} + +.h3 { + @apply text-3xl font-extrabold; +} + +.h4 { + @apply text-2xl font-extrabold tracking-tight; +} + +@screen md { + .h1 { + @apply text-5xl; + } + + .h2 { + @apply text-4xl; + } +} + +/* Buttons */ +.btn, +.btn-lg, +.btn-sm, +.btn-xs { + @apply font-medium text-sm inline-flex items-center justify-center border border-transparent rounded leading-5 shadow-sm transition duration-150 ease-in-out; +} + +.btn { + @apply px-3 py-2; +} + +.btn-lg { + @apply px-4 py-3; +} + +.btn-sm { + @apply px-2 py-1; +} + +.btn-xs { + @apply px-2 py-0.5; +} + +/* Forms */ +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-results-button, +input[type="search"]::-webkit-search-results-decoration { + -webkit-appearance: none; +} + +.form-input, +.form-textarea, +.form-multiselect, +.form-select, +.form-checkbox, +.form-radio { + @apply text-sm text-slate-800 bg-white border; +} + +.form-input, +.form-textarea, +.form-multiselect, +.form-select, +.form-checkbox { + @apply rounded; +} + +.form-input, +.form-textarea, +.form-multiselect, +.form-select { + @apply leading-5 py-2 px-3 border-slate-200 hover:border-slate-300 focus:border-indigo-300 shadow-sm; +} + +.form-input, +.form-textarea { + @apply placeholder-slate-400; +} + +.form-select { + @apply pr-10; +} + +.form-checkbox, +.form-radio { + @apply text-indigo-500 border border-slate-300; +} + +/* Chrome, Safari and Opera */ +.no-scrollbar::-webkit-scrollbar { + display: none; +} + +.no-scrollbar { + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ +} \ No newline at end of file diff --git a/backend-server/public/dashboard/css/style.css b/backend-server/public/dashboard/css/style.css new file mode 100644 index 00000000..73a0ed9d --- /dev/null +++ b/backend-server/public/dashboard/css/style.css @@ -0,0 +1,22 @@ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=fallback'); + +@import 'tailwindcss/base'; +@import 'tailwindcss/components'; + +/* Additional styles */ +@import 'additional-styles/utility-patterns.css'; +@import 'additional-styles/range-slider.css'; +@import 'additional-styles/toggle-switch.css'; +@import 'additional-styles/flatpickr.css'; +@import 'additional-styles/theme.css'; + +@import 'tailwindcss/utilities'; + +/* See Alpine.js: https://github.com/alpinejs/alpine#x-cloak */ +[x-cloak=""] { + display: none; +} + +@media screen and (max-width: theme('screens.lg')) { + [x-cloak="lg"] { display: none; } +} \ No newline at end of file diff --git a/backend-server/public/dashboard/css/vendors/flatpickr.min.css b/backend-server/public/dashboard/css/vendors/flatpickr.min.css new file mode 100644 index 00000000..a10acc62 --- /dev/null +++ b/backend-server/public/dashboard/css/vendors/flatpickr.min.css @@ -0,0 +1,13 @@ +.flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08);box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08)}.flatpickr-calendar.open,.flatpickr-calendar.inline{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1);animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none !important;box-shadow:none !important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-calendar .hasWeeks .dayContainer,.flatpickr-calendar .hasTime .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:before,.flatpickr-calendar:after{position:absolute;display:block;pointer-events:none;border:solid transparent;content:'';height:0;width:0;left:22px}.flatpickr-calendar.rightMost:before,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.arrowRight:after{left:auto;right:22px}.flatpickr-calendar.arrowCenter:before,.flatpickr-calendar.arrowCenter:after{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:before,.flatpickr-calendar.arrowTop:after{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:before,.flatpickr-calendar.arrowBottom:after{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:transparent;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9);height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-prev-month,.flatpickr-months .flatpickr-next-month{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9)}.flatpickr-months .flatpickr-prev-month.flatpickr-disabled,.flatpickr-months .flatpickr-next-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-prev-month i,.flatpickr-months .flatpickr-next-month i{position:relative}.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,.flatpickr-months .flatpickr-next-month.flatpickr-prev-month{/* + /*rtl:begin:ignore*/left:0/* + /*rtl:end:ignore*/}/* + /*rtl:begin:ignore*/ +/* + /*rtl:end:ignore*/ +.flatpickr-months .flatpickr-prev-month.flatpickr-next-month,.flatpickr-months .flatpickr-next-month.flatpickr-next-month{/* + /*rtl:begin:ignore*/right:0/* + /*rtl:end:ignore*/}/* + /*rtl:begin:ignore*/ +/* + /*rtl:end:ignore*/ +.flatpickr-months .flatpickr-prev-month:hover,.flatpickr-months .flatpickr-next-month:hover{color:#959ea9}.flatpickr-months .flatpickr-prev-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-prev-month svg,.flatpickr-months .flatpickr-next-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-outer-spin-button,.numInputWrapper input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,0.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:rgba(0,0,0,0.1)}.numInputWrapper span:active{background:rgba(0,0,0,0.2)}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,0.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,0.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:rgba(0,0,0,0.5)}.numInputWrapper:hover{background:rgba(0,0,0,0.05)}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch\0;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:rgba(0,0,0,0.9)}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:rgba(0,0,0,0.9)}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:rgba(0,0,0,0.5);background:transparent;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:transparent;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0 0;outline:none;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:focus,.flatpickr-current-month .flatpickr-monthDropdown-months:active{outline:none}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:none;padding:0}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:rgba(0,0,0,0.54);line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.dayContainer + .dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.today.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day:hover,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.nextMonthDay:hover,.flatpickr-day:focus,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.nextMonthDay:focus{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:hover,.flatpickr-day.today:focus{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.selected.startRange + .endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange + .endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange + .endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 0 #569ff7}.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange,.flatpickr-day.endRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.prevMonthDay,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.notAllowed.nextMonthDay{color:rgba(57,57,57,0.3);background:transparent;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:rgba(57,57,57,0.1)}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:rgba(57,57,57,0.3);background:transparent;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:bold}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-time-separator,.flatpickr-time .flatpickr-am-pm{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:bold;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time input:hover,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time .flatpickr-am-pm:focus{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}} \ No newline at end of file diff --git a/backend-server/public/dashboard/images/404-illustration.svg b/backend-server/public/dashboard/images/404-illustration.svg new file mode 100644 index 00000000..66e4268a --- /dev/null +++ b/backend-server/public/dashboard/images/404-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/announcement-icon.svg b/backend-server/public/dashboard/images/announcement-icon.svg new file mode 100644 index 00000000..6f6d57eb --- /dev/null +++ b/backend-server/public/dashboard/images/announcement-icon.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/applications-image-01.jpg b/backend-server/public/dashboard/images/applications-image-01.jpg new file mode 100644 index 00000000..3e814c40 Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-01.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-02.jpg b/backend-server/public/dashboard/images/applications-image-02.jpg new file mode 100644 index 00000000..9bc8c13d Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-02.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-03.jpg b/backend-server/public/dashboard/images/applications-image-03.jpg new file mode 100644 index 00000000..6eb7f412 Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-03.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-04.jpg b/backend-server/public/dashboard/images/applications-image-04.jpg new file mode 100644 index 00000000..66bc168f Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-04.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-05.jpg b/backend-server/public/dashboard/images/applications-image-05.jpg new file mode 100644 index 00000000..a343f4bf Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-05.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-06.jpg b/backend-server/public/dashboard/images/applications-image-06.jpg new file mode 100644 index 00000000..e21e1d17 Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-06.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-07.jpg b/backend-server/public/dashboard/images/applications-image-07.jpg new file mode 100644 index 00000000..555acfbc Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-07.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-08.jpg b/backend-server/public/dashboard/images/applications-image-08.jpg new file mode 100644 index 00000000..57499846 Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-08.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-09.jpg b/backend-server/public/dashboard/images/applications-image-09.jpg new file mode 100644 index 00000000..7fbc0667 Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-09.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-10.jpg b/backend-server/public/dashboard/images/applications-image-10.jpg new file mode 100644 index 00000000..0434fcb2 Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-10.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-11.jpg b/backend-server/public/dashboard/images/applications-image-11.jpg new file mode 100644 index 00000000..0d0c593c Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-11.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-12.jpg b/backend-server/public/dashboard/images/applications-image-12.jpg new file mode 100644 index 00000000..74f25025 Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-12.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-13.jpg b/backend-server/public/dashboard/images/applications-image-13.jpg new file mode 100644 index 00000000..512f7e8c Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-13.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-14.jpg b/backend-server/public/dashboard/images/applications-image-14.jpg new file mode 100644 index 00000000..2c1cfeb7 Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-14.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-15.jpg b/backend-server/public/dashboard/images/applications-image-15.jpg new file mode 100644 index 00000000..38f59ef0 Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-15.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-16.jpg b/backend-server/public/dashboard/images/applications-image-16.jpg new file mode 100644 index 00000000..5c3ab394 Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-16.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-17.jpg b/backend-server/public/dashboard/images/applications-image-17.jpg new file mode 100644 index 00000000..ca671860 Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-17.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-18.jpg b/backend-server/public/dashboard/images/applications-image-18.jpg new file mode 100644 index 00000000..e6be03c3 Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-18.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-19.jpg b/backend-server/public/dashboard/images/applications-image-19.jpg new file mode 100644 index 00000000..46a1443d Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-19.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-20.jpg b/backend-server/public/dashboard/images/applications-image-20.jpg new file mode 100644 index 00000000..f5a7c89d Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-20.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-21.jpg b/backend-server/public/dashboard/images/applications-image-21.jpg new file mode 100644 index 00000000..bd411fde Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-21.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-22.jpg b/backend-server/public/dashboard/images/applications-image-22.jpg new file mode 100644 index 00000000..78e31787 Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-22.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-23.jpg b/backend-server/public/dashboard/images/applications-image-23.jpg new file mode 100644 index 00000000..de69d957 Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-23.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-24.jpg b/backend-server/public/dashboard/images/applications-image-24.jpg new file mode 100644 index 00000000..54e5ac37 Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-24.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-25.jpg b/backend-server/public/dashboard/images/applications-image-25.jpg new file mode 100644 index 00000000..c5fcbe60 Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-25.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-26.jpg b/backend-server/public/dashboard/images/applications-image-26.jpg new file mode 100644 index 00000000..d2b3a252 Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-26.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-27.jpg b/backend-server/public/dashboard/images/applications-image-27.jpg new file mode 100644 index 00000000..c0b01644 Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-27.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-28.jpg b/backend-server/public/dashboard/images/applications-image-28.jpg new file mode 100644 index 00000000..2b86504f Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-28.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-29.jpg b/backend-server/public/dashboard/images/applications-image-29.jpg new file mode 100644 index 00000000..01db30e6 Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-29.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-30.jpg b/backend-server/public/dashboard/images/applications-image-30.jpg new file mode 100644 index 00000000..ca4f521b Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-30.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-31.jpg b/backend-server/public/dashboard/images/applications-image-31.jpg new file mode 100644 index 00000000..434ee87c Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-31.jpg differ diff --git a/backend-server/public/dashboard/images/applications-image-32.jpg b/backend-server/public/dashboard/images/applications-image-32.jpg new file mode 100644 index 00000000..19f6bc12 Binary files /dev/null and b/backend-server/public/dashboard/images/applications-image-32.jpg differ diff --git a/backend-server/public/dashboard/images/auth-decoration.png b/backend-server/public/dashboard/images/auth-decoration.png new file mode 100644 index 00000000..880f52c9 Binary files /dev/null and b/backend-server/public/dashboard/images/auth-decoration.png differ diff --git a/backend-server/public/dashboard/images/auth-image.jpg b/backend-server/public/dashboard/images/auth-image.jpg new file mode 100644 index 00000000..dfc5a903 Binary files /dev/null and b/backend-server/public/dashboard/images/auth-image.jpg differ diff --git a/backend-server/public/dashboard/images/avatar-01.jpg b/backend-server/public/dashboard/images/avatar-01.jpg new file mode 100644 index 00000000..729c3530 Binary files /dev/null and b/backend-server/public/dashboard/images/avatar-01.jpg differ diff --git a/backend-server/public/dashboard/images/avatar-02.jpg b/backend-server/public/dashboard/images/avatar-02.jpg new file mode 100644 index 00000000..b7a6aab6 Binary files /dev/null and b/backend-server/public/dashboard/images/avatar-02.jpg differ diff --git a/backend-server/public/dashboard/images/avatar-03.jpg b/backend-server/public/dashboard/images/avatar-03.jpg new file mode 100644 index 00000000..14915adf Binary files /dev/null and b/backend-server/public/dashboard/images/avatar-03.jpg differ diff --git a/backend-server/public/dashboard/images/avatar-04.jpg b/backend-server/public/dashboard/images/avatar-04.jpg new file mode 100644 index 00000000..8aeb28ea Binary files /dev/null and b/backend-server/public/dashboard/images/avatar-04.jpg differ diff --git a/backend-server/public/dashboard/images/avatar-05.jpg b/backend-server/public/dashboard/images/avatar-05.jpg new file mode 100644 index 00000000..7f517ede Binary files /dev/null and b/backend-server/public/dashboard/images/avatar-05.jpg differ diff --git a/backend-server/public/dashboard/images/avatar-06.jpg b/backend-server/public/dashboard/images/avatar-06.jpg new file mode 100644 index 00000000..6897a869 Binary files /dev/null and b/backend-server/public/dashboard/images/avatar-06.jpg differ diff --git a/backend-server/public/dashboard/images/channel-01.png b/backend-server/public/dashboard/images/channel-01.png new file mode 100644 index 00000000..ed22eff9 Binary files /dev/null and b/backend-server/public/dashboard/images/channel-01.png differ diff --git a/backend-server/public/dashboard/images/channel-02.png b/backend-server/public/dashboard/images/channel-02.png new file mode 100644 index 00000000..8b7afef1 Binary files /dev/null and b/backend-server/public/dashboard/images/channel-02.png differ diff --git a/backend-server/public/dashboard/images/channel-03.png b/backend-server/public/dashboard/images/channel-03.png new file mode 100644 index 00000000..7d9449ad Binary files /dev/null and b/backend-server/public/dashboard/images/channel-03.png differ diff --git a/backend-server/public/dashboard/images/chat-image.jpg b/backend-server/public/dashboard/images/chat-image.jpg new file mode 100644 index 00000000..96e256dd Binary files /dev/null and b/backend-server/public/dashboard/images/chat-image.jpg differ diff --git a/backend-server/public/dashboard/images/company-bg.jpg b/backend-server/public/dashboard/images/company-bg.jpg new file mode 100644 index 00000000..94ab00fa Binary files /dev/null and b/backend-server/public/dashboard/images/company-bg.jpg differ diff --git a/backend-server/public/dashboard/images/company-icon-01.svg b/backend-server/public/dashboard/images/company-icon-01.svg new file mode 100644 index 00000000..3dd5113b --- /dev/null +++ b/backend-server/public/dashboard/images/company-icon-01.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/company-icon-02.svg b/backend-server/public/dashboard/images/company-icon-02.svg new file mode 100644 index 00000000..1eb7c652 --- /dev/null +++ b/backend-server/public/dashboard/images/company-icon-02.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/company-icon-03.svg b/backend-server/public/dashboard/images/company-icon-03.svg new file mode 100644 index 00000000..31f2c453 --- /dev/null +++ b/backend-server/public/dashboard/images/company-icon-03.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/company-icon-04.svg b/backend-server/public/dashboard/images/company-icon-04.svg new file mode 100644 index 00000000..8fd06d1a --- /dev/null +++ b/backend-server/public/dashboard/images/company-icon-04.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/company-icon-05.svg b/backend-server/public/dashboard/images/company-icon-05.svg new file mode 100644 index 00000000..c1881ced --- /dev/null +++ b/backend-server/public/dashboard/images/company-icon-05.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/company-icon-06.svg b/backend-server/public/dashboard/images/company-icon-06.svg new file mode 100644 index 00000000..82e02946 --- /dev/null +++ b/backend-server/public/dashboard/images/company-icon-06.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/company-icon-07.svg b/backend-server/public/dashboard/images/company-icon-07.svg new file mode 100644 index 00000000..b44e94fd --- /dev/null +++ b/backend-server/public/dashboard/images/company-icon-07.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/company-icon-08.svg b/backend-server/public/dashboard/images/company-icon-08.svg new file mode 100644 index 00000000..95a6e6f9 --- /dev/null +++ b/backend-server/public/dashboard/images/company-icon-08.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/favicon.png b/backend-server/public/dashboard/images/favicon.png new file mode 100644 index 00000000..22e4d2ae Binary files /dev/null and b/backend-server/public/dashboard/images/favicon.png differ diff --git a/backend-server/public/dashboard/images/feed-image-01.jpg b/backend-server/public/dashboard/images/feed-image-01.jpg new file mode 100644 index 00000000..600cb081 Binary files /dev/null and b/backend-server/public/dashboard/images/feed-image-01.jpg differ diff --git a/backend-server/public/dashboard/images/feed-image-02.jpg b/backend-server/public/dashboard/images/feed-image-02.jpg new file mode 100644 index 00000000..5c885a16 Binary files /dev/null and b/backend-server/public/dashboard/images/feed-image-02.jpg differ diff --git a/backend-server/public/dashboard/images/group-avatar-01.png b/backend-server/public/dashboard/images/group-avatar-01.png new file mode 100644 index 00000000..4437d28e Binary files /dev/null and b/backend-server/public/dashboard/images/group-avatar-01.png differ diff --git a/backend-server/public/dashboard/images/group-avatar-02.png b/backend-server/public/dashboard/images/group-avatar-02.png new file mode 100644 index 00000000..7e0d1894 Binary files /dev/null and b/backend-server/public/dashboard/images/group-avatar-02.png differ diff --git a/backend-server/public/dashboard/images/group-avatar-03.png b/backend-server/public/dashboard/images/group-avatar-03.png new file mode 100644 index 00000000..e23926fd Binary files /dev/null and b/backend-server/public/dashboard/images/group-avatar-03.png differ diff --git a/backend-server/public/dashboard/images/group-avatar-04.png b/backend-server/public/dashboard/images/group-avatar-04.png new file mode 100644 index 00000000..042f1a9f Binary files /dev/null and b/backend-server/public/dashboard/images/group-avatar-04.png differ diff --git a/backend-server/public/dashboard/images/icon-01.svg b/backend-server/public/dashboard/images/icon-01.svg new file mode 100644 index 00000000..cc717a6a --- /dev/null +++ b/backend-server/public/dashboard/images/icon-01.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/icon-02.svg b/backend-server/public/dashboard/images/icon-02.svg new file mode 100644 index 00000000..4c83198a --- /dev/null +++ b/backend-server/public/dashboard/images/icon-02.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/icon-03.svg b/backend-server/public/dashboard/images/icon-03.svg new file mode 100644 index 00000000..f2dd0da4 --- /dev/null +++ b/backend-server/public/dashboard/images/icon-03.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/inbox-image.jpg b/backend-server/public/dashboard/images/inbox-image.jpg new file mode 100644 index 00000000..cc2524ce Binary files /dev/null and b/backend-server/public/dashboard/images/inbox-image.jpg differ diff --git a/backend-server/public/dashboard/images/mastercard-circle.png b/backend-server/public/dashboard/images/mastercard-circle.png new file mode 100644 index 00000000..b97cccbe Binary files /dev/null and b/backend-server/public/dashboard/images/mastercard-circle.png differ diff --git a/backend-server/public/dashboard/images/meetup-image.jpg b/backend-server/public/dashboard/images/meetup-image.jpg new file mode 100644 index 00000000..b5616cc0 Binary files /dev/null and b/backend-server/public/dashboard/images/meetup-image.jpg differ diff --git a/backend-server/public/dashboard/images/meetup-photo-01.jpg b/backend-server/public/dashboard/images/meetup-photo-01.jpg new file mode 100644 index 00000000..2c338aa9 Binary files /dev/null and b/backend-server/public/dashboard/images/meetup-photo-01.jpg differ diff --git a/backend-server/public/dashboard/images/meetup-photo-02.jpg b/backend-server/public/dashboard/images/meetup-photo-02.jpg new file mode 100644 index 00000000..d5d4820c Binary files /dev/null and b/backend-server/public/dashboard/images/meetup-photo-02.jpg differ diff --git a/backend-server/public/dashboard/images/meetup-photo-03.jpg b/backend-server/public/dashboard/images/meetup-photo-03.jpg new file mode 100644 index 00000000..35d4a8dd Binary files /dev/null and b/backend-server/public/dashboard/images/meetup-photo-03.jpg differ diff --git a/backend-server/public/dashboard/images/meetups-thumb-01.jpg b/backend-server/public/dashboard/images/meetups-thumb-01.jpg new file mode 100644 index 00000000..41bf5c6e Binary files /dev/null and b/backend-server/public/dashboard/images/meetups-thumb-01.jpg differ diff --git a/backend-server/public/dashboard/images/meetups-thumb-02.jpg b/backend-server/public/dashboard/images/meetups-thumb-02.jpg new file mode 100644 index 00000000..78bd903e Binary files /dev/null and b/backend-server/public/dashboard/images/meetups-thumb-02.jpg differ diff --git a/backend-server/public/dashboard/images/meetups-thumb-03.jpg b/backend-server/public/dashboard/images/meetups-thumb-03.jpg new file mode 100644 index 00000000..3d89ac6a Binary files /dev/null and b/backend-server/public/dashboard/images/meetups-thumb-03.jpg differ diff --git a/backend-server/public/dashboard/images/meetups-thumb-04.jpg b/backend-server/public/dashboard/images/meetups-thumb-04.jpg new file mode 100644 index 00000000..77c8ff6a Binary files /dev/null and b/backend-server/public/dashboard/images/meetups-thumb-04.jpg differ diff --git a/backend-server/public/dashboard/images/meetups-thumb-05.jpg b/backend-server/public/dashboard/images/meetups-thumb-05.jpg new file mode 100644 index 00000000..02e20b88 Binary files /dev/null and b/backend-server/public/dashboard/images/meetups-thumb-05.jpg differ diff --git a/backend-server/public/dashboard/images/meetups-thumb-06.jpg b/backend-server/public/dashboard/images/meetups-thumb-06.jpg new file mode 100644 index 00000000..f244fb28 Binary files /dev/null and b/backend-server/public/dashboard/images/meetups-thumb-06.jpg differ diff --git a/backend-server/public/dashboard/images/meetups-thumb-07.jpg b/backend-server/public/dashboard/images/meetups-thumb-07.jpg new file mode 100644 index 00000000..f9c0cf6b Binary files /dev/null and b/backend-server/public/dashboard/images/meetups-thumb-07.jpg differ diff --git a/backend-server/public/dashboard/images/meetups-thumb-08.jpg b/backend-server/public/dashboard/images/meetups-thumb-08.jpg new file mode 100644 index 00000000..b972154b Binary files /dev/null and b/backend-server/public/dashboard/images/meetups-thumb-08.jpg differ diff --git a/backend-server/public/dashboard/images/modal-image.jpg b/backend-server/public/dashboard/images/modal-image.jpg new file mode 100644 index 00000000..5d10630d Binary files /dev/null and b/backend-server/public/dashboard/images/modal-image.jpg differ diff --git a/backend-server/public/dashboard/images/onboarding-image.jpg b/backend-server/public/dashboard/images/onboarding-image.jpg new file mode 100644 index 00000000..1a78f92b Binary files /dev/null and b/backend-server/public/dashboard/images/onboarding-image.jpg differ diff --git a/backend-server/public/dashboard/images/pay-bg.jpg b/backend-server/public/dashboard/images/pay-bg.jpg new file mode 100644 index 00000000..bd5162f3 Binary files /dev/null and b/backend-server/public/dashboard/images/pay-bg.jpg differ diff --git a/backend-server/public/dashboard/images/product-image.jpg b/backend-server/public/dashboard/images/product-image.jpg new file mode 100644 index 00000000..2930d739 Binary files /dev/null and b/backend-server/public/dashboard/images/product-image.jpg differ diff --git a/backend-server/public/dashboard/images/profile-bg.jpg b/backend-server/public/dashboard/images/profile-bg.jpg new file mode 100644 index 00000000..f6ea7814 Binary files /dev/null and b/backend-server/public/dashboard/images/profile-bg.jpg differ diff --git a/backend-server/public/dashboard/images/related-product-01.jpg b/backend-server/public/dashboard/images/related-product-01.jpg new file mode 100644 index 00000000..eb6a5a16 Binary files /dev/null and b/backend-server/public/dashboard/images/related-product-01.jpg differ diff --git a/backend-server/public/dashboard/images/related-product-02.jpg b/backend-server/public/dashboard/images/related-product-02.jpg new file mode 100644 index 00000000..49308388 Binary files /dev/null and b/backend-server/public/dashboard/images/related-product-02.jpg differ diff --git a/backend-server/public/dashboard/images/related-product-03.jpg b/backend-server/public/dashboard/images/related-product-03.jpg new file mode 100644 index 00000000..8f9c6ca0 Binary files /dev/null and b/backend-server/public/dashboard/images/related-product-03.jpg differ diff --git a/backend-server/public/dashboard/images/task-image-01.jpg b/backend-server/public/dashboard/images/task-image-01.jpg new file mode 100644 index 00000000..154e1e15 Binary files /dev/null and b/backend-server/public/dashboard/images/task-image-01.jpg differ diff --git a/backend-server/public/dashboard/images/task-image-02.jpg b/backend-server/public/dashboard/images/task-image-02.jpg new file mode 100644 index 00000000..a5a4e6ac Binary files /dev/null and b/backend-server/public/dashboard/images/task-image-02.jpg differ diff --git a/backend-server/public/dashboard/images/transactions-image-01.svg b/backend-server/public/dashboard/images/transactions-image-01.svg new file mode 100644 index 00000000..5b0ea858 --- /dev/null +++ b/backend-server/public/dashboard/images/transactions-image-01.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/transactions-image-02.svg b/backend-server/public/dashboard/images/transactions-image-02.svg new file mode 100644 index 00000000..9b9b0d44 --- /dev/null +++ b/backend-server/public/dashboard/images/transactions-image-02.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/transactions-image-03.svg b/backend-server/public/dashboard/images/transactions-image-03.svg new file mode 100644 index 00000000..7e12b480 --- /dev/null +++ b/backend-server/public/dashboard/images/transactions-image-03.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/transactions-image-04.svg b/backend-server/public/dashboard/images/transactions-image-04.svg new file mode 100644 index 00000000..add36482 --- /dev/null +++ b/backend-server/public/dashboard/images/transactions-image-04.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/transactions-image-05.svg b/backend-server/public/dashboard/images/transactions-image-05.svg new file mode 100644 index 00000000..86b711da --- /dev/null +++ b/backend-server/public/dashboard/images/transactions-image-05.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/transactions-image-06.svg b/backend-server/public/dashboard/images/transactions-image-06.svg new file mode 100644 index 00000000..624911fb --- /dev/null +++ b/backend-server/public/dashboard/images/transactions-image-06.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/transactions-image-07.svg b/backend-server/public/dashboard/images/transactions-image-07.svg new file mode 100644 index 00000000..c38f3242 --- /dev/null +++ b/backend-server/public/dashboard/images/transactions-image-07.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/transactions-image-08.svg b/backend-server/public/dashboard/images/transactions-image-08.svg new file mode 100644 index 00000000..e09ef7c6 --- /dev/null +++ b/backend-server/public/dashboard/images/transactions-image-08.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/backend-server/public/dashboard/images/user-128-01.jpg b/backend-server/public/dashboard/images/user-128-01.jpg new file mode 100644 index 00000000..dcb0564d Binary files /dev/null and b/backend-server/public/dashboard/images/user-128-01.jpg differ diff --git a/backend-server/public/dashboard/images/user-28-01.jpg b/backend-server/public/dashboard/images/user-28-01.jpg new file mode 100644 index 00000000..c3bce12d Binary files /dev/null and b/backend-server/public/dashboard/images/user-28-01.jpg differ diff --git a/backend-server/public/dashboard/images/user-28-02.jpg b/backend-server/public/dashboard/images/user-28-02.jpg new file mode 100644 index 00000000..9e24d473 Binary files /dev/null and b/backend-server/public/dashboard/images/user-28-02.jpg differ diff --git a/backend-server/public/dashboard/images/user-28-03.jpg b/backend-server/public/dashboard/images/user-28-03.jpg new file mode 100644 index 00000000..8d7ea058 Binary files /dev/null and b/backend-server/public/dashboard/images/user-28-03.jpg differ diff --git a/backend-server/public/dashboard/images/user-28-04.jpg b/backend-server/public/dashboard/images/user-28-04.jpg new file mode 100644 index 00000000..782217fd Binary files /dev/null and b/backend-server/public/dashboard/images/user-28-04.jpg differ diff --git a/backend-server/public/dashboard/images/user-28-05.jpg b/backend-server/public/dashboard/images/user-28-05.jpg new file mode 100644 index 00000000..85cfeb96 Binary files /dev/null and b/backend-server/public/dashboard/images/user-28-05.jpg differ diff --git a/backend-server/public/dashboard/images/user-28-06.jpg b/backend-server/public/dashboard/images/user-28-06.jpg new file mode 100644 index 00000000..7c939cc4 Binary files /dev/null and b/backend-server/public/dashboard/images/user-28-06.jpg differ diff --git a/backend-server/public/dashboard/images/user-28-07.jpg b/backend-server/public/dashboard/images/user-28-07.jpg new file mode 100644 index 00000000..e3c2c4bf Binary files /dev/null and b/backend-server/public/dashboard/images/user-28-07.jpg differ diff --git a/backend-server/public/dashboard/images/user-28-08.jpg b/backend-server/public/dashboard/images/user-28-08.jpg new file mode 100644 index 00000000..81268868 Binary files /dev/null and b/backend-server/public/dashboard/images/user-28-08.jpg differ diff --git a/backend-server/public/dashboard/images/user-28-09.jpg b/backend-server/public/dashboard/images/user-28-09.jpg new file mode 100644 index 00000000..0be6ecfc Binary files /dev/null and b/backend-server/public/dashboard/images/user-28-09.jpg differ diff --git a/backend-server/public/dashboard/images/user-28-10.jpg b/backend-server/public/dashboard/images/user-28-10.jpg new file mode 100644 index 00000000..5bc703df Binary files /dev/null and b/backend-server/public/dashboard/images/user-28-10.jpg differ diff --git a/backend-server/public/dashboard/images/user-28-11.jpg b/backend-server/public/dashboard/images/user-28-11.jpg new file mode 100644 index 00000000..17fd70f4 Binary files /dev/null and b/backend-server/public/dashboard/images/user-28-11.jpg differ diff --git a/backend-server/public/dashboard/images/user-28-12.jpg b/backend-server/public/dashboard/images/user-28-12.jpg new file mode 100644 index 00000000..e0ad966a Binary files /dev/null and b/backend-server/public/dashboard/images/user-28-12.jpg differ diff --git a/backend-server/public/dashboard/images/user-32-01.jpg b/backend-server/public/dashboard/images/user-32-01.jpg new file mode 100644 index 00000000..b8527606 Binary files /dev/null and b/backend-server/public/dashboard/images/user-32-01.jpg differ diff --git a/backend-server/public/dashboard/images/user-32-02.jpg b/backend-server/public/dashboard/images/user-32-02.jpg new file mode 100644 index 00000000..a25622f4 Binary files /dev/null and b/backend-server/public/dashboard/images/user-32-02.jpg differ diff --git a/backend-server/public/dashboard/images/user-32-03.jpg b/backend-server/public/dashboard/images/user-32-03.jpg new file mode 100644 index 00000000..db123b75 Binary files /dev/null and b/backend-server/public/dashboard/images/user-32-03.jpg differ diff --git a/backend-server/public/dashboard/images/user-32-04.jpg b/backend-server/public/dashboard/images/user-32-04.jpg new file mode 100644 index 00000000..ed0baa24 Binary files /dev/null and b/backend-server/public/dashboard/images/user-32-04.jpg differ diff --git a/backend-server/public/dashboard/images/user-32-05.jpg b/backend-server/public/dashboard/images/user-32-05.jpg new file mode 100644 index 00000000..2c9a6172 Binary files /dev/null and b/backend-server/public/dashboard/images/user-32-05.jpg differ diff --git a/backend-server/public/dashboard/images/user-32-06.jpg b/backend-server/public/dashboard/images/user-32-06.jpg new file mode 100644 index 00000000..3855cbee Binary files /dev/null and b/backend-server/public/dashboard/images/user-32-06.jpg differ diff --git a/backend-server/public/dashboard/images/user-32-07.jpg b/backend-server/public/dashboard/images/user-32-07.jpg new file mode 100644 index 00000000..6d667cb8 Binary files /dev/null and b/backend-server/public/dashboard/images/user-32-07.jpg differ diff --git a/backend-server/public/dashboard/images/user-32-08.jpg b/backend-server/public/dashboard/images/user-32-08.jpg new file mode 100644 index 00000000..d7785f5c Binary files /dev/null and b/backend-server/public/dashboard/images/user-32-08.jpg differ diff --git a/backend-server/public/dashboard/images/user-36-01.jpg b/backend-server/public/dashboard/images/user-36-01.jpg new file mode 100644 index 00000000..41a27bfc Binary files /dev/null and b/backend-server/public/dashboard/images/user-36-01.jpg differ diff --git a/backend-server/public/dashboard/images/user-36-02.jpg b/backend-server/public/dashboard/images/user-36-02.jpg new file mode 100644 index 00000000..6d0080fd Binary files /dev/null and b/backend-server/public/dashboard/images/user-36-02.jpg differ diff --git a/backend-server/public/dashboard/images/user-36-03.jpg b/backend-server/public/dashboard/images/user-36-03.jpg new file mode 100644 index 00000000..7d9b4836 Binary files /dev/null and b/backend-server/public/dashboard/images/user-36-03.jpg differ diff --git a/backend-server/public/dashboard/images/user-36-04.jpg b/backend-server/public/dashboard/images/user-36-04.jpg new file mode 100644 index 00000000..04a7e2ec Binary files /dev/null and b/backend-server/public/dashboard/images/user-36-04.jpg differ diff --git a/backend-server/public/dashboard/images/user-36-05.jpg b/backend-server/public/dashboard/images/user-36-05.jpg new file mode 100644 index 00000000..0c9c8e38 Binary files /dev/null and b/backend-server/public/dashboard/images/user-36-05.jpg differ diff --git a/backend-server/public/dashboard/images/user-40-01.jpg b/backend-server/public/dashboard/images/user-40-01.jpg new file mode 100644 index 00000000..e6c9218e Binary files /dev/null and b/backend-server/public/dashboard/images/user-40-01.jpg differ diff --git a/backend-server/public/dashboard/images/user-40-02.jpg b/backend-server/public/dashboard/images/user-40-02.jpg new file mode 100644 index 00000000..b9f97bf6 Binary files /dev/null and b/backend-server/public/dashboard/images/user-40-02.jpg differ diff --git a/backend-server/public/dashboard/images/user-40-03.jpg b/backend-server/public/dashboard/images/user-40-03.jpg new file mode 100644 index 00000000..6670f817 Binary files /dev/null and b/backend-server/public/dashboard/images/user-40-03.jpg differ diff --git a/backend-server/public/dashboard/images/user-40-04.jpg b/backend-server/public/dashboard/images/user-40-04.jpg new file mode 100644 index 00000000..385e5ce8 Binary files /dev/null and b/backend-server/public/dashboard/images/user-40-04.jpg differ diff --git a/backend-server/public/dashboard/images/user-40-05.jpg b/backend-server/public/dashboard/images/user-40-05.jpg new file mode 100644 index 00000000..e3c7e721 Binary files /dev/null and b/backend-server/public/dashboard/images/user-40-05.jpg differ diff --git a/backend-server/public/dashboard/images/user-40-06.jpg b/backend-server/public/dashboard/images/user-40-06.jpg new file mode 100644 index 00000000..eb82036a Binary files /dev/null and b/backend-server/public/dashboard/images/user-40-06.jpg differ diff --git a/backend-server/public/dashboard/images/user-40-07.jpg b/backend-server/public/dashboard/images/user-40-07.jpg new file mode 100644 index 00000000..0c889f23 Binary files /dev/null and b/backend-server/public/dashboard/images/user-40-07.jpg differ diff --git a/backend-server/public/dashboard/images/user-40-08.jpg b/backend-server/public/dashboard/images/user-40-08.jpg new file mode 100644 index 00000000..4fd52b77 Binary files /dev/null and b/backend-server/public/dashboard/images/user-40-08.jpg differ diff --git a/backend-server/public/dashboard/images/user-40-09.jpg b/backend-server/public/dashboard/images/user-40-09.jpg new file mode 100644 index 00000000..035bed8c Binary files /dev/null and b/backend-server/public/dashboard/images/user-40-09.jpg differ diff --git a/backend-server/public/dashboard/images/user-40-10.jpg b/backend-server/public/dashboard/images/user-40-10.jpg new file mode 100644 index 00000000..dda71db3 Binary files /dev/null and b/backend-server/public/dashboard/images/user-40-10.jpg differ diff --git a/backend-server/public/dashboard/images/user-40-11.jpg b/backend-server/public/dashboard/images/user-40-11.jpg new file mode 100644 index 00000000..0ea90cea Binary files /dev/null and b/backend-server/public/dashboard/images/user-40-11.jpg differ diff --git a/backend-server/public/dashboard/images/user-40-12.jpg b/backend-server/public/dashboard/images/user-40-12.jpg new file mode 100644 index 00000000..886a1f9c Binary files /dev/null and b/backend-server/public/dashboard/images/user-40-12.jpg differ diff --git a/backend-server/public/dashboard/images/user-64-01.jpg b/backend-server/public/dashboard/images/user-64-01.jpg new file mode 100644 index 00000000..fd8abce9 Binary files /dev/null and b/backend-server/public/dashboard/images/user-64-01.jpg differ diff --git a/backend-server/public/dashboard/images/user-64-02.jpg b/backend-server/public/dashboard/images/user-64-02.jpg new file mode 100644 index 00000000..59e3a43f Binary files /dev/null and b/backend-server/public/dashboard/images/user-64-02.jpg differ diff --git a/backend-server/public/dashboard/images/user-64-03.jpg b/backend-server/public/dashboard/images/user-64-03.jpg new file mode 100644 index 00000000..c82d3d06 Binary files /dev/null and b/backend-server/public/dashboard/images/user-64-03.jpg differ diff --git a/backend-server/public/dashboard/images/user-64-04.jpg b/backend-server/public/dashboard/images/user-64-04.jpg new file mode 100644 index 00000000..0dbd2db4 Binary files /dev/null and b/backend-server/public/dashboard/images/user-64-04.jpg differ diff --git a/backend-server/public/dashboard/images/user-64-05.jpg b/backend-server/public/dashboard/images/user-64-05.jpg new file mode 100644 index 00000000..2f2aca5b Binary files /dev/null and b/backend-server/public/dashboard/images/user-64-05.jpg differ diff --git a/backend-server/public/dashboard/images/user-64-06.jpg b/backend-server/public/dashboard/images/user-64-06.jpg new file mode 100644 index 00000000..0f71eace Binary files /dev/null and b/backend-server/public/dashboard/images/user-64-06.jpg differ diff --git a/backend-server/public/dashboard/images/user-64-07.jpg b/backend-server/public/dashboard/images/user-64-07.jpg new file mode 100644 index 00000000..35ef2915 Binary files /dev/null and b/backend-server/public/dashboard/images/user-64-07.jpg differ diff --git a/backend-server/public/dashboard/images/user-64-08.jpg b/backend-server/public/dashboard/images/user-64-08.jpg new file mode 100644 index 00000000..5e6d6ff3 Binary files /dev/null and b/backend-server/public/dashboard/images/user-64-08.jpg differ diff --git a/backend-server/public/dashboard/images/user-64-09.jpg b/backend-server/public/dashboard/images/user-64-09.jpg new file mode 100644 index 00000000..f95adf47 Binary files /dev/null and b/backend-server/public/dashboard/images/user-64-09.jpg differ diff --git a/backend-server/public/dashboard/images/user-64-10.jpg b/backend-server/public/dashboard/images/user-64-10.jpg new file mode 100644 index 00000000..27b052ba Binary files /dev/null and b/backend-server/public/dashboard/images/user-64-10.jpg differ diff --git a/backend-server/public/dashboard/images/user-64-11.jpg b/backend-server/public/dashboard/images/user-64-11.jpg new file mode 100644 index 00000000..bc8817fa Binary files /dev/null and b/backend-server/public/dashboard/images/user-64-11.jpg differ diff --git a/backend-server/public/dashboard/images/user-64-12.jpg b/backend-server/public/dashboard/images/user-64-12.jpg new file mode 100644 index 00000000..6a5db9df Binary files /dev/null and b/backend-server/public/dashboard/images/user-64-12.jpg differ diff --git a/backend-server/public/dashboard/images/user-64-13.jpg b/backend-server/public/dashboard/images/user-64-13.jpg new file mode 100644 index 00000000..b48aedd0 Binary files /dev/null and b/backend-server/public/dashboard/images/user-64-13.jpg differ diff --git a/backend-server/public/dashboard/images/user-64-14.jpg b/backend-server/public/dashboard/images/user-64-14.jpg new file mode 100644 index 00000000..adcedc62 Binary files /dev/null and b/backend-server/public/dashboard/images/user-64-14.jpg differ diff --git a/backend-server/public/dashboard/images/user-avatar-32.png b/backend-server/public/dashboard/images/user-avatar-32.png new file mode 100644 index 00000000..540e23b3 Binary files /dev/null and b/backend-server/public/dashboard/images/user-avatar-32.png differ diff --git a/backend-server/public/dashboard/images/user-avatar-80.png b/backend-server/public/dashboard/images/user-avatar-80.png new file mode 100644 index 00000000..b1417b86 Binary files /dev/null and b/backend-server/public/dashboard/images/user-avatar-80.png differ diff --git a/backend-server/public/dashboard/images/visa-cricle.png b/backend-server/public/dashboard/images/visa-cricle.png new file mode 100644 index 00000000..207a02f8 Binary files /dev/null and b/backend-server/public/dashboard/images/visa-cricle.png differ diff --git a/backend-server/public/dashboard/js/analytics-charts.js b/backend-server/public/dashboard/js/analytics-charts.js new file mode 100644 index 00000000..7160762d --- /dev/null +++ b/backend-server/public/dashboard/js/analytics-charts.js @@ -0,0 +1,896 @@ +// Utility functions +const hexToRGB = (h) => { + let r = 0; + let g = 0; + let b = 0; + if (h.length === 4) { + r = `0x${h[1]}${h[1]}`; + g = `0x${h[2]}${h[2]}`; + b = `0x${h[3]}${h[3]}`; + } else if (h.length === 7) { + r = `0x${h[1]}${h[2]}`; + g = `0x${h[3]}${h[4]}`; + b = `0x${h[5]}${h[6]}`; + } + return `${+r},${+g},${+b}`; +}; + +const formatThousands = (value) => Intl.NumberFormat('en-US', { + maximumSignificantDigits: 3, + notation: 'compact', +}).format(value); + +// Define Chart.js default settings +Chart.defaults.font.family = '"Inter", sans-serif'; +Chart.defaults.font.weight = '500'; +Chart.defaults.color = '#94a3b8'; +Chart.defaults.scale.grid.color = '#f1f5f9'; +Chart.defaults.plugins.tooltip.titleColor = '#1e293b'; +Chart.defaults.plugins.tooltip.bodyColor = '#1e293b'; +Chart.defaults.plugins.tooltip.backgroundColor = '#ffffff'; +Chart.defaults.plugins.tooltip.borderWidth = 1; +Chart.defaults.plugins.tooltip.borderColor = '#e2e8f0'; +Chart.defaults.plugins.tooltip.displayColors = false; +Chart.defaults.plugins.tooltip.mode = 'nearest'; +Chart.defaults.plugins.tooltip.intersect = false; +Chart.defaults.plugins.tooltip.position = 'nearest'; +Chart.defaults.plugins.tooltip.caretSize = 0; +Chart.defaults.plugins.tooltip.caretPadding = 20; +Chart.defaults.plugins.tooltip.cornerRadius = 4; +Chart.defaults.plugins.tooltip.padding = 8; + +// Register Chart.js plugin to add a bg option for chart area +Chart.register({ + id: 'chartAreaPlugin', + // eslint-disable-next-line object-shorthand + beforeDraw: (chart) => { + if (chart.config.options.chartArea && chart.config.options.chartArea.backgroundColor) { + const ctx = chart.canvas.getContext('2d'); + const { chartArea } = chart; + ctx.save(); + ctx.fillStyle = chart.config.options.chartArea.backgroundColor; + // eslint-disable-next-line max-len + ctx.fillRect(chartArea.left, chartArea.top, chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); + ctx.restore(); + } + }, +}); + +// Init #analytics-01 chart +const analyticsCard01 = () => { + const ctx = document.getElementById('analytics-card-01'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'line', + data: { + labels: [ + '12-01-2020', '01-01-2021', '02-01-2021', + '03-01-2021', '04-01-2021', '05-01-2021', + '06-01-2021', '07-01-2021', '08-01-2021', + '09-01-2021', '10-01-2021', '11-01-2021', + '12-01-2021', '01-01-2022', '02-01-2022', + '03-01-2022', '04-01-2022', '05-01-2022', + '06-01-2022', '07-01-2022', '08-01-2022', + '09-01-2022', '10-01-2022', '11-01-2022', + '12-01-2022', '01-01-2023', + ], + datasets: [ + // Indigo line + { + label: 'Current', + data: [ + 5000, 8700, 7500, 12000, 11000, 9500, 10500, + 10000, 15000, 9000, 10000, 7000, 22000, 7200, + 9800, 9000, 10000, 8000, 15000, 12000, 11000, + 13000, 11000, 15000, 17000, 18000, + ], + fill: true, + backgroundColor: `rgba(${hexToRGB('#3b82f6')}, 0.08)`, + borderColor: '#6366f1', + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#6366f1', + clip: 20, + }, + // Gray line + { + label: 'Previous', + data: [ + 8000, 5000, 6500, 5000, 6500, 12000, 8000, + 9000, 8000, 8000, 12500, 10000, 10000, 12000, + 11000, 16000, 12000, 10000, 10000, 14000, 9000, + 10000, 15000, 12500, 14000, 11000, + ], + borderColor: '#cbd5e1', + fill: false, + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#cbd5e1', + clip: 20, + }, + ], + }, + options: { + layout: { + padding: 20, + }, + scales: { + y: { + beginAtZero: true, + grid: { + drawBorder: false, + }, + ticks: { + callback: (value) => formatThousands(value), + }, + }, + x: { + type: 'time', + time: { + parser: 'MM-DD-YYYY', + unit: 'month', + displayFormats: { + month: 'MMM YY', + }, + }, + grid: { + display: false, + drawBorder: false, + }, + ticks: { + autoSkipPadding: 48, + maxRotation: 0, + }, + }, + }, + plugins: { + legend: { + display: false, + }, + tooltip: { + callbacks: { + title: () => false, // Disable tooltip title + label: (context) => formatThousands(context.parsed.y), + }, + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + maintainAspectRatio: false, + }, + }); +}; +analyticsCard01(); + +// Init #analytics-02 chart +const analyticsCard02 = () => { + const ctx = document.getElementById('analytics-card-02'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'line', + data: { + labels: [ + '12-01-2020', '01-01-2021', '02-01-2021', + '03-01-2021', '04-01-2021', '05-01-2021', + '06-01-2021', '07-01-2021', '08-01-2021', + '09-01-2021', '10-01-2021', '11-01-2021', + '12-01-2021', '01-01-2022', '02-01-2022', + '03-01-2022', '04-01-2022', '05-01-2022', + '06-01-2022', '07-01-2022', '08-01-2022', + '09-01-2022', '10-01-2022', '11-01-2022', + '12-01-2022', '01-01-2023', + ], + datasets: [ + // Indigo line + { + data: [ + 732, 610, 610, 504, 504, 504, 349, + 349, 504, 342, 504, 610, 391, 192, + 154, 273, 191, 191, 126, 263, 349, + 252, 423, 622, 470, 532, + ], + fill: true, + backgroundColor: `rgba(${hexToRGB('#3b82f6')}, 0.08)`, + borderColor: '#6366f1', + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#6366f1', + clip: 20, + }, + ], + }, + options: { + chartArea: { + backgroundColor: '#f8fafc', + }, + layout: { + padding: { + left: 20, + right: 20, + }, + }, + scales: { + y: { + display: false, + beginAtZero: true, + }, + x: { + type: 'time', + time: { + parser: 'MM-DD-YYYY', + unit: 'month', + }, + display: false, + }, + }, + plugins: { + tooltip: { + callbacks: { + title: () => false, // Disable tooltip title + label: (context) => formatThousands(context.parsed.y), + }, + }, + legend: { + display: false, + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + maintainAspectRatio: false, + }, + }); +}; +analyticsCard02(); + +// Init #analytics-03 chart +const analyticsCard03 = () => { + const ctx = document.getElementById('analytics-card-03'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'bar', + data: { + labels: [ + '12-01-2020', '01-01-2021', '02-01-2021', + '03-01-2021', '04-01-2021', '05-01-2021', + ], + datasets: [ + // Stack + { + label: 'Direct', + data: [ + 5000, 4000, 4000, 3800, 5200, 5100, + ], + backgroundColor: '#4338ca', + hoverBackgroundColor: '#3730a3', + barPercentage: 0.66, + categoryPercentage: 0.66, + }, + // Stack + { + label: 'Referral', + data: [ + 2500, 2600, 4000, 4000, 4800, 3500, + ], + backgroundColor: '#6366f1', + hoverBackgroundColor: '#4f46e5', + barPercentage: 0.66, + categoryPercentage: 0.66, + }, + // Stack + { + label: 'Organic Search', + data: [ + 2300, 2000, 3100, 2700, 1300, 2600, + ], + backgroundColor: '#a5b4fc', + hoverBackgroundColor: '#818cf8', + barPercentage: 0.66, + categoryPercentage: 0.66, + }, + // Stack + { + label: 'Social', + data: [ + 4800, 4200, 4800, 1800, 3300, 3500, + ], + backgroundColor: '#e0e7ff', + hoverBackgroundColor: '#c7d2fe', + barPercentage: 0.66, + categoryPercentage: 0.66, + }, + ], + }, + options: { + layout: { + padding: { + top: 12, + bottom: 16, + left: 20, + right: 20, + }, + }, + scales: { + y: { + stacked: true, + grid: { + drawBorder: false, + }, + beginAtZero: true, + ticks: { + maxTicksLimit: 5, + callback: (value) => formatThousands(value), + }, + }, + x: { + stacked: true, + type: 'time', + time: { + parser: 'MM-DD-YYYY', + unit: 'month', + displayFormats: { + month: 'MMM', + }, + }, + grid: { + display: false, + drawBorder: false, + }, + ticks: { + autoSkipPadding: 48, + maxRotation: 0, + }, + }, + }, + plugins: { + legend: { + display: false, + }, + htmlLegend: { + // ID of the container to put the legend in + containerID: 'analytics-card-03-legend', + }, + tooltip: { + callbacks: { + title: () => false, // Disable tooltip title + label: (context) => formatThousands(context.parsed.y), + }, + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + animation: { + duration: 200, + }, + maintainAspectRatio: false, + }, + plugins: [{ + id: 'htmlLegend', + afterUpdate(c, args, options) { + const legendContainer = document.getElementById(options.containerID); + const ul = legendContainer.querySelector('ul'); + if (!ul) return; + // Remove old legend items + while (ul.firstChild) { + ul.firstChild.remove(); + } + // Reuse the built-in legendItems generator + const items = c.options.plugins.legend.labels.generateLabels(c); + items.forEach((item) => { + const li = document.createElement('li'); + li.style.marginRight = '12px'; + // Button element + const button = document.createElement('button'); + button.style.display = 'inline-flex'; + button.style.alignItems = 'center'; + button.style.opacity = item.hidden ? '.3' : ''; + button.onclick = () => { + c.setDatasetVisibility(item.datasetIndex, !c.isDatasetVisible(item.datasetIndex)); + c.update(); + }; + // Color box + const box = document.createElement('span'); + box.style.display = 'block'; + box.style.width = '12px'; + box.style.height = '12px'; + box.style.borderRadius = '9999px'; + box.style.marginRight = '8px'; + box.style.borderWidth = '3px'; + box.style.borderColor = item.fillStyle; + box.style.pointerEvents = 'none'; + // Label + const label = document.createElement('span'); + label.style.color = '#64748b'; + label.style.fontSize = '0.875rem'; + label.style.lineHeight = '1.5715'; + const labelText = document.createTextNode(item.text); + label.appendChild(labelText); + li.appendChild(button); + button.appendChild(box); + button.appendChild(label); + ul.appendChild(li); + }); + }, + }], + }); +}; +analyticsCard03(); + +// Init #analytics-04 chart +const analyticsCard04 = () => { + const ctx = document.getElementById('analytics-card-04'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'bar', + data: { + labels: [ + '02-01-2021', '03-01-2021', '04-01-2021', '05-01-2021', + ], + datasets: [ + // Blue bars + { + label: 'New Visitors', + data: [ + 8000, 3800, 5350, 7800, + ], + backgroundColor: '#6366f1', + hoverBackgroundColor: '#4f46e5', + categoryPercentage: 0.66, + }, + // Light blue bars + { + label: 'Returning Visitors', + data: [ + 4000, 6500, 2200, 5800, + ], + backgroundColor: '#38bdf8', + hoverBackgroundColor: '#0ea5e9', + categoryPercentage: 0.66, + }, + ], + }, + options: { + indexAxis: 'y', + layout: { + padding: { + top: 12, + bottom: 16, + left: 20, + right: 20, + }, + }, + scales: { + y: { + type: 'time', + time: { + parser: 'MM-DD-YYYY', + unit: 'month', + displayFormats: { + month: 'MMM', + }, + }, + grid: { + display: false, + drawBorder: false, + }, + }, + x: { + grid: { + drawBorder: false, + }, + ticks: { + maxTicksLimit: 3, + align: 'end', + callback: (value) => formatThousands(value), + }, + }, + }, + plugins: { + legend: { + display: false, + }, + htmlLegend: { + // ID of the container to put the legend in + containerID: 'analytics-card-04-legend', + }, + tooltip: { + callbacks: { + title: () => false, // Disable tooltip title + label: (context) => formatThousands(context.parsed.x), + }, + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + animation: { + duration: 200, + }, + maintainAspectRatio: false, + }, + plugins: [{ + id: 'htmlLegend', + afterUpdate(c, args, options) { + const legendContainer = document.getElementById(options.containerID); + const ul = legendContainer.querySelector('ul'); + if (!ul) return; + // Remove old legend items + while (ul.firstChild) { + ul.firstChild.remove(); + } + // Reuse the built-in legendItems generator + const items = c.options.plugins.legend.labels.generateLabels(c); + items.forEach((item) => { + const li = document.createElement('li'); + li.style.marginRight = '16px'; + // Button element + const button = document.createElement('button'); + button.style.display = 'inline-flex'; + button.style.alignItems = 'center'; + button.style.opacity = item.hidden ? '.3' : ''; + button.onclick = () => { + c.setDatasetVisibility(item.datasetIndex, !c.isDatasetVisible(item.datasetIndex)); + c.update(); + }; + // Color box + const box = document.createElement('span'); + box.style.display = 'block'; + box.style.width = '12px'; + box.style.height = '12px'; + box.style.borderRadius = '9999px'; + box.style.marginRight = '8px'; + box.style.borderWidth = '3px'; + box.style.borderColor = item.fillStyle; + box.style.pointerEvents = 'none'; + // Label + const label = document.createElement('span'); + label.style.color = '#64748b'; + label.style.fontSize = '0.875rem'; + label.style.lineHeight = '1.5715'; + const labelText = document.createTextNode(item.text); + label.appendChild(labelText); + li.appendChild(button); + button.appendChild(box); + button.appendChild(label); + ul.appendChild(li); + }); + }, + }], + }); +}; +analyticsCard04(); + +// Init #analytics-08 chart +const analyticsCard08 = () => { + const ctx = document.getElementById('analytics-card-08'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'doughnut', + data: { + labels: ['Desktop', 'Mobile', 'Tablet'], + datasets: [ + { + label: 'Sessions By Device', + data: [ + 12, 50, 38, + ], + backgroundColor: [ + '#6366f1', + '#38bdf8', + '#3730a3', + ], + hoverBackgroundColor: [ + '#4f46e5', + '#0ea5e9', + '#312e81', + ], + hoverBorderColor: '#ffffff', + }, + ], + }, + options: { + cutout: '80%', + layout: { + padding: 24, + }, + plugins: { + legend: { + display: false, + }, + htmlLegend: { + // ID of the container to put the legend in + containerID: 'analytics-card-08-legend', + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + animation: { + duration: 200, + }, + maintainAspectRatio: false, + }, + plugins: [{ + id: 'htmlLegend', + afterUpdate(c, args, options) { + const legendContainer = document.getElementById(options.containerID); + const ul = legendContainer.querySelector('ul'); + if (!ul) return; + // Remove old legend items + while (ul.firstChild) { + ul.firstChild.remove(); + } + // Reuse the built-in legendItems generator + const items = c.options.plugins.legend.labels.generateLabels(c); + items.forEach((item) => { + const li = document.createElement('li'); + li.style.margin = '4px'; + // Button element + const button = document.createElement('button'); + button.classList.add('btn-xs'); + button.style.backgroundColor = '#ffffff'; + button.style.borderWidth = '1px'; + button.style.borderColor = '#e2e8f0'; + button.style.color = '#64748b'; + button.style.boxShadow = '0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -1px rgba(0, 0, 0, 0.02)'; + button.style.opacity = item.hidden ? '.3' : ''; + button.onclick = () => { + c.toggleDataVisibility(item.index, !item.index); + c.update(); + }; + // Color box + const box = document.createElement('span'); + box.style.display = 'block'; + box.style.width = '8px'; + box.style.height = '8px'; + box.style.backgroundColor = item.fillStyle; + box.style.borderRadius = '2px'; + box.style.marginRight = '4px'; + box.style.pointerEvents = 'none'; + // Label + const label = document.createElement('span'); + label.style.display = 'flex'; + label.style.alignItems = 'center'; + const labelText = document.createTextNode(item.text); + label.appendChild(labelText); + li.appendChild(button); + button.appendChild(box); + button.appendChild(label); + ul.appendChild(li); + }); + }, + }], + }); +}; +analyticsCard08(); + +// Init #analytics-09 chart +const analyticsCard09 = () => { + const ctx = document.getElementById('analytics-card-09'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'doughnut', + data: { + labels: ['<18', '18-24', '24-36', '>35'], + datasets: [ + { + label: 'Visit By Age Category', + data: [ + 30, 50, 5, 15, + ], + backgroundColor: [ + '#6366f1', + '#38bdf8', + '#f43f5e', + '#10b981', + ], + hoverBackgroundColor: [ + '#4f46e5', + '#0ea5e9', + '#e11d48', + '#059669', + ], + hoverBorderColor: '#ffffff', + }, + ], + }, + options: { + cutout: '80%', + layout: { + padding: 24, + }, + plugins: { + legend: { + display: false, + }, + htmlLegend: { + // ID of the container to put the legend in + containerID: 'analytics-card-09-legend', + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + animation: { + duration: 200, + }, + maintainAspectRatio: false, + }, + plugins: [{ + id: 'htmlLegend', + afterUpdate(c, args, options) { + const legendContainer = document.getElementById(options.containerID); + const ul = legendContainer.querySelector('ul'); + if (!ul) return; + // Remove old legend items + while (ul.firstChild) { + ul.firstChild.remove(); + } + // Reuse the built-in legendItems generator + const items = c.options.plugins.legend.labels.generateLabels(c); + items.forEach((item) => { + const li = document.createElement('li'); + li.style.margin = '4px'; + // Button element + const button = document.createElement('button'); + button.classList.add('btn-xs'); + button.style.backgroundColor = '#ffffff'; + button.style.borderWidth = '1px'; + button.style.borderColor = '#e2e8f0'; + button.style.color = '#64748b'; + button.style.boxShadow = '0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -1px rgba(0, 0, 0, 0.02)'; + button.style.opacity = item.hidden ? '.3' : ''; + button.onclick = () => { + c.toggleDataVisibility(item.index, !item.index); + c.update(); + }; + // Color box + const box = document.createElement('span'); + box.style.display = 'block'; + box.style.width = '8px'; + box.style.height = '8px'; + box.style.backgroundColor = item.fillStyle; + box.style.borderRadius = '2px'; + box.style.marginRight = '4px'; + box.style.pointerEvents = 'none'; + // Label + const label = document.createElement('span'); + label.style.display = 'flex'; + label.style.alignItems = 'center'; + const labelText = document.createTextNode(item.text); + label.appendChild(labelText); + li.appendChild(button); + button.appendChild(box); + button.appendChild(label); + ul.appendChild(li); + }); + }, + }], + }); +}; +analyticsCard09(); + +// Init #analytics-10 chart +const analyticsCard10 = () => { + const ctx = document.getElementById('analytics-card-10'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'polarArea', + data: { + labels: ['Males', 'Females', 'Unknown'], + datasets: [ + { + label: 'Sessions By Gender', + data: [ + 500, 326, 242, + ], + backgroundColor: [ + `rgba(${hexToRGB('#6366f1')}, 0.8)`, + `rgba(${hexToRGB('#38bdf8')}, 0.8)`, + `rgba(${hexToRGB('#10b981')}, 0.8)`, + ], + hoverBackgroundColor: [ + `rgba(${hexToRGB('#4f46e5')}, 0.8)`, + `rgba(${hexToRGB('#0ea5e9')}, 0.8)`, + `rgba(${hexToRGB('#059669')}, 0.8)`, + ], + hoverBorderColor: '#ffffff', + }, + ], + }, + options: { + layout: { + padding: 24, + }, + plugins: { + legend: { + display: false, + }, + htmlLegend: { + // ID of the container to put the legend in + containerID: 'analytics-card-10-legend', + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + animation: { + duration: 200, + }, + maintainAspectRatio: false, + }, + plugins: [{ + id: 'htmlLegend', + afterUpdate(c, args, options) { + const legendContainer = document.getElementById(options.containerID); + const ul = legendContainer.querySelector('ul'); + if (!ul) return; + // Remove old legend items + while (ul.firstChild) { + ul.firstChild.remove(); + } + // Reuse the built-in legendItems generator + const items = c.options.plugins.legend.labels.generateLabels(c); + items.forEach((item) => { + const li = document.createElement('li'); + li.style.margin = '4px'; + // Button element + const button = document.createElement('button'); + button.classList.add('btn-xs'); + button.style.backgroundColor = '#ffffff'; + button.style.borderWidth = '1px'; + button.style.borderColor = '#e2e8f0'; + button.style.color = '#64748b'; + button.style.boxShadow = '0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -1px rgba(0, 0, 0, 0.02)'; + button.style.opacity = item.hidden ? '.3' : ''; + button.onclick = () => { + c.toggleDataVisibility(item.index, !item.index); + c.update(); + }; + // Color box + const box = document.createElement('span'); + box.style.display = 'block'; + box.style.width = '8px'; + box.style.height = '8px'; + box.style.backgroundColor = item.fillStyle; + box.style.borderRadius = '2px'; + box.style.marginRight = '4px'; + box.style.pointerEvents = 'none'; + // Label + const label = document.createElement('span'); + label.style.display = 'flex'; + label.style.alignItems = 'center'; + const labelText = document.createTextNode(item.text); + label.appendChild(labelText); + li.appendChild(button); + button.appendChild(box); + button.appendChild(label); + ul.appendChild(li); + }); + }, + }], + }); +}; +analyticsCard10(); \ No newline at end of file diff --git a/backend-server/public/dashboard/js/dashboard-charts.js b/backend-server/public/dashboard/js/dashboard-charts.js new file mode 100644 index 00000000..ca1b0476 --- /dev/null +++ b/backend-server/public/dashboard/js/dashboard-charts.js @@ -0,0 +1,889 @@ +// Utility functions +const hexToRGB = (h) => { + let r = 0; + let g = 0; + let b = 0; + if (h.length === 4) { + r = `0x${h[1]}${h[1]}`; + g = `0x${h[2]}${h[2]}`; + b = `0x${h[3]}${h[3]}`; + } else if (h.length === 7) { + r = `0x${h[1]}${h[2]}`; + g = `0x${h[3]}${h[4]}`; + b = `0x${h[5]}${h[6]}`; + } + return `${+r},${+g},${+b}`; +}; + +const formatValue = (value) => Intl.NumberFormat('en-US', { + style: 'currency', + currency: 'USD', + maximumSignificantDigits: 3, + notation: 'compact', +}).format(value); + +// Define Chart.js default settings +Chart.defaults.font.family = '"Inter", sans-serif'; +Chart.defaults.font.weight = '500'; +Chart.defaults.color = '#94a3b8'; +Chart.defaults.scale.grid.color = '#f1f5f9'; +Chart.defaults.plugins.tooltip.titleColor = '#1e293b'; +Chart.defaults.plugins.tooltip.bodyColor = '#1e293b'; +Chart.defaults.plugins.tooltip.backgroundColor = '#ffffff'; +Chart.defaults.plugins.tooltip.borderWidth = 1; +Chart.defaults.plugins.tooltip.borderColor = '#e2e8f0'; +Chart.defaults.plugins.tooltip.displayColors = false; +Chart.defaults.plugins.tooltip.mode = 'nearest'; +Chart.defaults.plugins.tooltip.intersect = false; +Chart.defaults.plugins.tooltip.position = 'nearest'; +Chart.defaults.plugins.tooltip.caretSize = 0; +Chart.defaults.plugins.tooltip.caretPadding = 20; +Chart.defaults.plugins.tooltip.cornerRadius = 4; +Chart.defaults.plugins.tooltip.padding = 8; + +// Register Chart.js plugin to add a bg option for chart area +Chart.register({ + id: 'chartAreaPlugin', + // eslint-disable-next-line object-shorthand + beforeDraw: (chart) => { + if (chart.config.options.chartArea && chart.config.options.chartArea.backgroundColor) { + const ctx = chart.canvas.getContext('2d'); + const { chartArea } = chart; + ctx.save(); + ctx.fillStyle = chart.config.options.chartArea.backgroundColor; + // eslint-disable-next-line max-len + ctx.fillRect(chartArea.left, chartArea.top, chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); + ctx.restore(); + } + }, +}); + +// Init #dashboard-01 chart +const dashboardCard01 = () => { + const ctx = document.getElementById('dashboard-card-01'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'line', + data: { + labels: [ + '12-01-2020', '01-01-2021', '02-01-2021', + '03-01-2021', '04-01-2021', '05-01-2021', + '06-01-2021', '07-01-2021', '08-01-2021', + '09-01-2021', '10-01-2021', '11-01-2021', + '12-01-2021', '01-01-2022', '02-01-2022', + '03-01-2022', '04-01-2022', '05-01-2022', + '06-01-2022', '07-01-2022', '08-01-2022', + '09-01-2022', '10-01-2022', '11-01-2022', + '12-01-2022', '01-01-2023', + ], + datasets: [ + // Indigo line + { + data: [ + 732, 610, 610, 504, 504, 504, 349, + 349, 504, 342, 504, 610, 391, 192, + 154, 273, 191, 191, 126, 263, 349, + 252, 423, 622, 470, 532, + ], + fill: true, + backgroundColor: `rgba(${hexToRGB('#3b82f6')}, 0.08)`, + borderColor: '#6366f1', + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#6366f1', + clip: 20, + }, + // Gray line + { + data: [ + 532, 532, 532, 404, 404, 314, 314, + 314, 314, 314, 234, 314, 234, 234, + 314, 314, 314, 388, 314, 202, 202, + 202, 202, 314, 720, 642, + ], + borderColor: '#cbd5e1', + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#cbd5e1', + clip: 20, + }, + ], + }, + options: { + chartArea: { + backgroundColor: '#f8fafc', + }, + layout: { + padding: 20, + }, + scales: { + y: { + display: true, + beginAtZero: true, + }, + x: { + type: 'time', + time: { + parser: 'MM-DD-YYYY', + unit: 'month', + }, + display: true, + }, + }, + plugins: { + tooltip: { + callbacks: { + title: () => false, // Disable tooltip title + label: (context) => formatValue(context.parsed.y), + }, + }, + legend: { + display: false, + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + maintainAspectRatio: false, + }, + }); +}; +dashboardCard01(); + +// Init #dashboard-02 chart +const dashboardCard02 = () => { + const ctx = document.getElementById('dashboard-card-02'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'line', + data: { + labels: [ + '12-01-2020', '01-01-2021', '02-01-2021', + '03-01-2021', '04-01-2021', '05-01-2021', + '06-01-2021', '07-01-2021', '08-01-2021', + '09-01-2021', '10-01-2021', '11-01-2021', + '12-01-2021', '01-01-2022', '02-01-2022', + '03-01-2022', '04-01-2022', '05-01-2022', + '06-01-2022', '07-01-2022', '08-01-2022', + '09-01-2022', '10-01-2022', '11-01-2022', + '12-01-2022', '01-01-2023', + ], + datasets: [ + // Indigo line + { + data: [ + 622, 622, 426, 471, 365, 365, 238, + 324, 288, 206, 324, 324, 500, 409, + 409, 273, 232, 273, 500, 570, 767, + 808, 685, 767, 685, 685, + ], + fill: true, + backgroundColor: `rgba(${hexToRGB('#3b82f6')}, 0.08)`, + borderColor: '#6366f1', + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#6366f1', + clip: 20, + }, + // Gray line + { + data: [ + 732, 610, 610, 504, 504, 504, 349, + 349, 504, 342, 504, 610, 391, 192, + 154, 273, 191, 191, 126, 263, 349, + 252, 423, 622, 470, 532, + ], + borderColor: '#cbd5e1', + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#cbd5e1', + clip: 20, + }, + ], + }, + options: { + chartArea: { + backgroundColor: '#f8fafc', + }, + layout: { + padding: 20, + }, + scales: { + y: { + display: false, + beginAtZero: true, + }, + x: { + type: 'time', + time: { + parser: 'MM-DD-YYYY', + unit: 'month', + }, + display: false, + }, + }, + plugins: { + tooltip: { + callbacks: { + title: () => false, // Disable tooltip title + label: (context) => formatValue(context.parsed.y), + }, + }, + legend: { + display: false, + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + maintainAspectRatio: false, + }, + }); +}; +dashboardCard02(); + +// Init #dashboard-03 chart +const dashboardCard03 = () => { + const ctx = document.getElementById('dashboard-card-03'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'line', + data: { + labels: [ + '12-01-2020', '01-01-2021', '02-01-2021', + '03-01-2021', '04-01-2021', '05-01-2021', + '06-01-2021', '07-01-2021', '08-01-2021', + '09-01-2021', '10-01-2021', '11-01-2021', + '12-01-2021', '01-01-2022', '02-01-2022', + '03-01-2022', '04-01-2022', '05-01-2022', + '06-01-2022', '07-01-2022', '08-01-2022', + '09-01-2022', '10-01-2022', '11-01-2022', + '12-01-2022', '01-01-2023', + ], + datasets: [ + // Indigo line + { + data: [ + 540, 466, 540, 466, 385, 432, 334, + 334, 289, 289, 200, 289, 222, 289, + 289, 403, 554, 304, 289, 270, 134, + 270, 829, 344, 388, 364, + ], + fill: true, + backgroundColor: `rgba(${hexToRGB('#3b82f6')}, 0.08)`, + borderColor: '#6366f1', + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#6366f1', + clip: 20, + }, + // Gray line + { + data: [ + 689, 562, 477, 477, 477, 477, 458, + 314, 430, 378, 430, 498, 642, 350, + 145, 145, 354, 260, 188, 188, 300, + 300, 282, 364, 660, 554, + ], + borderColor: '#cbd5e1', + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#cbd5e1', + clip: 20, + }, + ], + }, + options: { + chartArea: { + backgroundColor: '#f8fafc', + }, + layout: { + padding: 20, + }, + scales: { + y: { + display: false, + beginAtZero: true, + }, + x: { + type: 'time', + time: { + parser: 'MM-DD-YYYY', + unit: 'month', + }, + display: false, + }, + }, + plugins: { + tooltip: { + callbacks: { + title: () => false, // Disable tooltip title + label: (context) => formatValue(context.parsed.y), + }, + }, + legend: { + display: false, + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + maintainAspectRatio: false, + }, + }); +}; +dashboardCard03(); + +// Init #dashboard-05 chart +const dashboardCard05 = () => { + const ctx = document.getElementById('dashboard-card-05'); + if (!ctx) return; + // Fake real-time data + const data = [ + 57.81, 57.75, 55.48, 54.28, 53.14, 52.25, 51.04, 52.49, 55.49, 56.87, + 53.73, 56.42, 58.06, 55.62, 58.16, 55.22, 58.67, 60.18, 61.31, 63.25, + 65.91, 64.44, 65.97, 62.27, 60.96, 59.34, 55.07, 59.85, 53.79, 51.92, + 50.95, 49.65, 48.09, 49.81, 47.85, 49.52, 50.21, 52.22, 54.42, 53.42, + 50.91, 58.52, 53.37, 57.58, 59.09, 59.36, 58.71, 59.42, 55.93, 57.71, + 50.62, 56.28, 57.37, 53.08, 55.94, 55.82, 53.94, 52.65, 50.25, + ]; + // Fake real-time labels + const generateDates = () => { + const now = new Date(); + const dates = []; + data.forEach((v, i) => { + dates.push(new Date(now - 2000 - i * 2000)); + }); + return dates; + }; + const labels = generateDates(); + let range = 35; + let increment = 0; + const slicedData = data.slice(0, range); + const slicedLabels = labels.slice(0, range).reverse(); + + const chart = new Chart(ctx, { + type: 'line', + data: { + labels: slicedLabels, + datasets: [ + // Indigo line + { + data: slicedData, + fill: true, + backgroundColor: `rgba(${hexToRGB('#3b82f6')}, 0.08)`, + borderColor: '#6366f1', + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#6366f1', + clip: 20, + }, + ], + }, + options: { + layout: { + padding: 20, + }, + scales: { + y: { + grid: { + drawBorder: false, + }, + suggestedMin: 30, + suggestedMax: 80, + ticks: { + maxTicksLimit: 5, + callback: (value) => formatValue(value), + }, + }, + x: { + type: 'time', + time: { + parser: 'hh:mm:ss', + unit: 'second', + tooltipFormat: 'MMM DD, H:mm:ss a', + displayFormats: { + second: 'H:mm:ss', + }, + }, + grid: { + display: false, + drawBorder: false, + }, + ticks: { + autoSkipPadding: 48, + maxRotation: 0, + }, + }, + }, + plugins: { + legend: { + display: false, + }, + tooltip: { + titleFont: { + weight: '600', + }, + callbacks: { + label: (context) => formatValue(context.parsed.y), + }, + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + animation: false, + maintainAspectRatio: false, + }, + }); + + // Fake real-time + // For demo purposes only! + const chartValue = document.getElementById('dashboard-card-05-value'); + const chartDeviation = document.getElementById('dashboard-card-05-deviation'); + + const adddata = (value = NaN, prev) => { + const { datasets } = chart.data; + chart.data.labels.shift(); + chart.data.labels.push(new Date()); + datasets[0].data.shift(); + datasets[0].data.push(value); + chart.update(0); + if (!chartValue) return; + const diff = ((value - prev) / prev) * 100; + chartValue.innerHTML = value; + if (!chartDeviation) return; + if (diff < 0) { + chartDeviation.style.backgroundColor = '#f59e0b'; + } else { + chartDeviation.style.backgroundColor = '#10b981'; + } + chartDeviation.innerHTML = `${diff > 0 ? '+' : ''}${diff.toFixed(2)}%`; + }; + + const reload = () => { + increment += 1; + if (increment + range - 1 < data.length) { + adddata(data[increment + range - 1], data[increment + range - 2]); + } else { + increment = 0; + range = 1; + adddata(data[increment + range - 1], data[data.length - 1]); + } + setTimeout(reload, 2000); + }; + reload(); +}; +dashboardCard05(); + +// Init #dashboard-06 chart +const dashboardCard06 = () => { + const ctx = document.getElementById('dashboard-card-06'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'doughnut', + data: { + labels: ['United States', 'Italy', 'Other'], + datasets: [ + { + label: 'Top Countries', + data: [ + 35, 30, 35, + ], + backgroundColor: [ + '#6366f1', + '#60a5fa', + '#3730a3', + ], + hoverBackgroundColor: [ + '#4f46e5', + '#3b82f6', + '#312e81', + ], + hoverBorderColor: '#ffffff', + }, + ], + }, + options: { + cutout: '80%', + layout: { + padding: 24, + }, + plugins: { + legend: { + display: false, + }, + htmlLegend: { + // ID of the container to put the legend in + containerID: 'dashboard-card-06-legend', + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + animation: { + duration: 200, + }, + maintainAspectRatio: false, + }, + plugins: [{ + id: 'htmlLegend', + afterUpdate(c, args, options) { + const legendContainer = document.getElementById(options.containerID); + const ul = legendContainer.querySelector('ul'); + if (!ul) return; + // Remove old legend items + while (ul.firstChild) { + ul.firstChild.remove(); + } + // Reuse the built-in legendItems generator + const items = c.options.plugins.legend.labels.generateLabels(c); + items.forEach((item) => { + const li = document.createElement('li'); + li.style.margin = '4px'; + // Button element + const button = document.createElement('button'); + button.classList.add('btn-xs'); + button.style.backgroundColor = '#ffffff'; + button.style.borderWidth = '1px'; + button.style.borderColor = '#e2e8f0'; + button.style.color = '#64748b'; + button.style.boxShadow = '0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -1px rgba(0, 0, 0, 0.02)'; + button.style.opacity = item.hidden ? '.3' : ''; + button.onclick = () => { + c.toggleDataVisibility(item.index, !item.index); + c.update(); + }; + // Color box + const box = document.createElement('span'); + box.style.display = 'block'; + box.style.width = '8px'; + box.style.height = '8px'; + box.style.backgroundColor = item.fillStyle; + box.style.borderRadius = '2px'; + box.style.marginRight = '4px'; + box.style.pointerEvents = 'none'; + // Label + const label = document.createElement('span'); + label.style.display = 'flex'; + label.style.alignItems = 'center'; + const labelText = document.createTextNode(item.text); + label.appendChild(labelText); + li.appendChild(button); + button.appendChild(box); + button.appendChild(label); + ul.appendChild(li); + }); + }, + }], + }); +}; +dashboardCard06(); + +// Init #dashboard-08 chart +const dashboardCard08 = () => { + const ctx = document.getElementById('dashboard-card-08'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'line', + data: { + labels: [ + '12-01-2020', '01-01-2021', '02-01-2021', + '03-01-2021', '04-01-2021', '05-01-2021', + '06-01-2021', '07-01-2021', '08-01-2021', + '09-01-2021', '10-01-2021', '11-01-2021', + '12-01-2021', '01-01-2022', '02-01-2022', + '03-01-2022', '04-01-2022', '05-01-2022', + '06-01-2022', '07-01-2022', '08-01-2022', + '09-01-2022', '10-01-2022', '11-01-2022', + '12-01-2022', '01-01-2023', + ], + datasets: [ + // Indigo line + { + label: 'Current', + data: [ + 73, 64, 73, 69, 104, 104, 164, + 164, 120, 120, 120, 148, 142, 104, + 122, 110, 104, 152, 166, 233, 268, + 252, 284, 284, 333, 323, + ], + borderColor: '#6366f1', + fill: false, + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#6366f1', + clip: 20, + }, + // Blue line + { + label: 'Previous', + data: [ + 184, 86, 42, 378, 42, 243, 38, + 120, 0, 0, 42, 0, 84, 0, + 276, 0, 124, 42, 124, 88, 88, + 215, 156, 88, 124, 64, + ], + borderColor: '#60a5fa', + fill: false, + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#60a5fa', + clip: 20, + }, + // emerald line + { + label: 'Average', + data: [ + 122, 170, 192, 86, 102, 124, 115, + 115, 56, 104, 0, 72, 208, 186, + 223, 188, 114, 162, 200, 150, 118, + 118, 76, 122, 230, 268, + ], + borderColor: '#10b981', + fill: false, + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#10b981', + clip: 20, + }, + ], + }, + options: { + layout: { + padding: 20, + }, + scales: { + y: { + beginAtZero: true, + grid: { + drawBorder: false, + }, + ticks: { + maxTicksLimit: 5, + callback: (value) => formatValue(value), + }, + }, + x: { + type: 'time', + time: { + parser: 'MM-DD-YYYY', + unit: 'month', + displayFormats: { + month: 'MMM YY', + }, + }, + grid: { + display: false, + drawBorder: false, + }, + ticks: { + autoSkipPadding: 48, + maxRotation: 0, + }, + }, + }, + plugins: { + legend: { + display: false, + }, + htmlLegend: { + // ID of the container to put the legend in + containerID: 'dashboard-card-08-legend', + }, + tooltip: { + callbacks: { + title: () => false, // Disable tooltip title + label: (context) => formatValue(context.parsed.y), + }, + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + maintainAspectRatio: false, + }, + plugins: [{ + id: 'htmlLegend', + afterUpdate(c, args, options) { + const legendContainer = document.getElementById(options.containerID); + const ul = legendContainer.querySelector('ul'); + if (!ul) return; + // Remove old legend items + while (ul.firstChild) { + ul.firstChild.remove(); + } + // Reuse the built-in legendItems generator + const items = c.options.plugins.legend.labels.generateLabels(c); + items.slice(0, 2).forEach((item) => { + const li = document.createElement('li'); + li.style.marginLeft = '12px'; + // Button element + const button = document.createElement('button'); + button.style.display = 'inline-flex'; + button.style.alignItems = 'center'; + button.style.opacity = item.hidden ? '.3' : ''; + button.onclick = () => { + c.setDatasetVisibility(item.datasetIndex, !c.isDatasetVisible(item.datasetIndex)); + c.update(); + }; + // Color box + const box = document.createElement('span'); + box.style.display = 'block'; + box.style.width = '12px'; + box.style.height = '12px'; + box.style.borderRadius = '9999px'; + box.style.marginRight = '8px'; + box.style.borderWidth = '3px'; + box.style.borderColor = c.data.datasets[item.datasetIndex].borderColor; + box.style.pointerEvents = 'none'; + // Label + const label = document.createElement('span'); + label.style.color = '#64748b'; + label.style.fontSize = '0.875rem'; + label.style.lineHeight = '1.5715'; + const labelText = document.createTextNode(item.text); + label.appendChild(labelText); + li.appendChild(button); + button.appendChild(box); + button.appendChild(label); + ul.appendChild(li); + }); + }, + }], + }); +}; +dashboardCard08(); + +// Init #dashboard-09 chart +const dashboardCard09 = () => { + const ctx = document.getElementById('dashboard-card-09'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'bar', + data: { + labels: [ + '12-01-2020', '01-01-2021', '02-01-2021', + '03-01-2021', '04-01-2021', '05-01-2021', + ], + datasets: [ + // Light blue bars + { + label: 'Stack 1', + data: [ + 6200, 9200, 6600, 8800, 5200, 9200, + ], + backgroundColor: '#6366f1', + hoverBackgroundColor: '#4f46e5', + barPercentage: 0.66, + categoryPercentage: 0.66, + }, + // Blue bars + { + label: 'Stack 2', + data: [ + -4000, -2600, -5350, -4000, -7500, -2000, + ], + backgroundColor: '#c7d2fe', + hoverBackgroundColor: '#a5b4fc', + barPercentage: 0.66, + categoryPercentage: 0.66, + }, + ], + }, + options: { + layout: { + padding: { + top: 12, + bottom: 16, + left: 20, + right: 20, + }, + }, + scales: { + y: { + stacked: true, + grid: { + drawBorder: false, + }, + beginAtZero: true, + ticks: { + maxTicksLimit: 5, + callback: (value) => formatValue(value), + }, + }, + x: { + stacked: true, + type: 'time', + time: { + parser: 'MM-DD-YYYY', + unit: 'month', + displayFormats: { + month: 'MMM YY', + }, + }, + grid: { + display: false, + drawBorder: false, + }, + ticks: { + autoSkipPadding: 48, + maxRotation: 0, + }, + }, + }, + plugins: { + legend: { + display: false, + }, + tooltip: { + callbacks: { + title: () => false, // Disable tooltip title + label: (context) => formatValue(context.parsed.y), + }, + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + animation: { + duration: 200, + }, + maintainAspectRatio: false, + }, + }); +}; +dashboardCard09(); diff --git a/backend-server/public/dashboard/js/fintech-charts.js b/backend-server/public/dashboard/js/fintech-charts.js new file mode 100644 index 00000000..3f222f3c --- /dev/null +++ b/backend-server/public/dashboard/js/fintech-charts.js @@ -0,0 +1,1357 @@ +// Utility functions +const hexToRGB = (h) => { + let r = 0; + let g = 0; + let b = 0; + if (h.length === 4) { + r = `0x${h[1]}${h[1]}`; + g = `0x${h[2]}${h[2]}`; + b = `0x${h[3]}${h[3]}`; + } else if (h.length === 7) { + r = `0x${h[1]}${h[2]}`; + g = `0x${h[3]}${h[4]}`; + b = `0x${h[5]}${h[6]}`; + } + return `${+r},${+g},${+b}`; +}; + +const formatValue = (value) => Intl.NumberFormat('en-US', { + style: 'currency', + currency: 'USD', + maximumSignificantDigits: 3, + notation: 'compact', +}).format(value); + +// Define Chart.js default settings +Chart.defaults.font.family = '"Inter", sans-serif'; +Chart.defaults.font.weight = '500'; +Chart.defaults.color = '#94a3b8'; +Chart.defaults.scale.grid.color = '#f1f5f9'; +Chart.defaults.plugins.tooltip.titleColor = '#1e293b'; +Chart.defaults.plugins.tooltip.bodyColor = '#1e293b'; +Chart.defaults.plugins.tooltip.backgroundColor = '#ffffff'; +Chart.defaults.plugins.tooltip.borderWidth = 1; +Chart.defaults.plugins.tooltip.borderColor = '#e2e8f0'; +Chart.defaults.plugins.tooltip.displayColors = false; +Chart.defaults.plugins.tooltip.mode = 'nearest'; +Chart.defaults.plugins.tooltip.intersect = false; +Chart.defaults.plugins.tooltip.position = 'nearest'; +Chart.defaults.plugins.tooltip.caretSize = 0; +Chart.defaults.plugins.tooltip.caretPadding = 20; +Chart.defaults.plugins.tooltip.cornerRadius = 4; +Chart.defaults.plugins.tooltip.padding = 8; + +// Init #fintech-01 chart +const fintechCard01 = () => { + const ctx = document.getElementById('fintech-card-01'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'line', + data: { + labels: [ + '12-01-2020', '01-01-2021', '02-01-2021', + '03-01-2021', '04-01-2021', '05-01-2021', + '06-01-2021', '07-01-2021', '08-01-2021', + '09-01-2021', '10-01-2021', '11-01-2021', + '12-01-2021', '01-01-2022', '02-01-2022', + '03-01-2022', '04-01-2022', '05-01-2022', + '06-01-2022', '07-01-2022', '08-01-2022', + '09-01-2022', '10-01-2022', '11-01-2022', + '12-01-2022', '01-01-2023', '02-01-2023', + '03-01-2023', '04-01-2023', '05-01-2023', + '06-01-2023', '07-01-2023', '08-01-2023', + '09-01-2023', '10-01-2023', '11-01-2023', + '12-01-2023', '01-01-2024', '02-01-2024', + '03-01-2024', '04-01-2024', + ], + datasets: [ + // Indigo line + { + label: 'Mosaic Portfolio', + data: [ + 0, 2.5, 2.5, 4, 2.5, 3.8, 5, 9, 7.5, 11, + 14, 15, 17, 15, 14, 9, 15, 26, 16, 18, + 15, 20, 18, 19, 19, 24, 29, 26, 39, 27, + 35, 32, 29, 35, 36, 34, 39, 36, 41, 41, + 48, + ], + borderColor: '#6366f1', + fill: true, + backgroundColor: `rgba(${hexToRGB('#3b82f6')}, 0.08)`, + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#6366f1', + clip: 20, + }, + // Yellow line + { + label: 'Expected Return', + data: [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, + ], + borderColor: '#fbbf24', + borderDash: [4, 4], + fill: false, + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#fbbf24', + clip: 20, + }, + // gray line + { + label: 'Competitors', + data: [ + 0.7, 3.5, 4.5, 3.5, 4.2, 4.6, 6, 7, 6, 6, + 11, 13, 14, 18, 17, 15, 13, 16, 20, 21, + 24, 22, 20, 22, 25, 18, 21, 23, 24, 32, + 28, 29, 35, 37, 42, 32, 32, 33, 33, 37, + 32, + ], + borderColor: '#cbd5e1', + fill: false, + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#cbd5e1', + clip: 20, + }, + ], + }, + options: { + layout: { + padding: 20, + }, + scales: { + y: { + beginAtZero: true, + grid: { + drawBorder: false, + }, + ticks: { + maxTicksLimit: 7, + callback: (value) => `${value}%`, + }, + }, + x: { + type: 'time', + time: { + parser: 'MM-DD-YYYY', + unit: 'month', + displayFormats: { + month: 'MMM YY', + }, + }, + grid: { + display: false, + drawBorder: false, + }, + ticks: { + autoSkipPadding: 48, + maxRotation: 0, + }, + }, + }, + plugins: { + legend: { + display: false, + }, + htmlLegend: { + // ID of the container to put the legend in + containerID: 'fintech-card-01-legend', + }, + tooltip: { + callbacks: { + title: () => false, // Disable tooltip title + label: (context) => `${context.parsed.y}%`, + }, + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + maintainAspectRatio: false, + }, + plugins: [{ + id: 'htmlLegend', + afterUpdate(c, args, options) { + const legendContainer = document.getElementById(options.containerID); + const ul = legendContainer.querySelector('ul'); + if (!ul) return; + // Remove old legend items + while (ul.firstChild) { + ul.firstChild.remove(); + } + // Reuse the built-in legendItems generator + const items = c.options.plugins.legend.labels.generateLabels(c); + items.forEach((item) => { + const li = document.createElement('li'); + li.style.marginLeft = '12px'; + // Button element + const button = document.createElement('button'); + button.style.display = 'inline-flex'; + button.style.alignItems = 'center'; + button.style.opacity = item.hidden ? '.3' : ''; + button.onclick = () => { + c.setDatasetVisibility(item.datasetIndex, !c.isDatasetVisible(item.datasetIndex)); + c.update(); + }; + // Color box + const box = document.createElement('span'); + box.style.display = 'block'; + box.style.width = '12px'; + box.style.height = '12px'; + box.style.borderRadius = '9999px'; + box.style.marginRight = '8px'; + box.style.borderWidth = '3px'; + box.style.borderColor = c.data.datasets[item.datasetIndex].borderColor; + box.style.pointerEvents = 'none'; + // Label + const label = document.createElement('span'); + label.style.color = '#64748b'; + label.style.fontSize = '0.875rem'; + label.style.lineHeight = '1.5715'; + const labelText = document.createTextNode(item.text); + label.appendChild(labelText); + li.appendChild(button); + button.appendChild(box); + button.appendChild(label); + ul.appendChild(li); + }); + }, + }], + }); +}; +fintechCard01(); + +// Init #fintech-03 chart +const fintechCard03 = () => { + const ctx = document.getElementById('fintech-card-03'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'bar', + data: { + labels: [ + '12-01-2020', '01-01-2021', '02-01-2021', + '03-01-2021', '04-01-2021', '05-01-2021', + ], + datasets: [ + // Indigo bars + { + label: 'Inflow', + data: [ + 800, 2600, 4000, 1200, 3200, 1700, + ], + backgroundColor: '#6366f1', + hoverBackgroundColor: '#4f46e5', + barPercentage: 0.66, + categoryPercentage: 0.66, + }, + // Grey bars + { + label: 'Outflow', + data: [ + 2800, 1700, 900, 2900, 1950, 3100, + ], + backgroundColor: '#cbd5e1', + hoverBackgroundColor: '#94a3b8', + barPercentage: 0.66, + categoryPercentage: 0.66, + }, + ], + }, + options: { + layout: { + padding: { + top: 12, + bottom: 16, + left: 20, + right: 20, + }, + }, + scales: { + y: { + grid: { + drawBorder: false, + }, + ticks: { + maxTicksLimit: 5, + callback: (value) => formatValue(value), + }, + }, + x: { + type: 'time', + time: { + parser: 'MM-DD-YYYY', + unit: 'month', + displayFormats: { + month: 'MMM YY', + }, + }, + grid: { + display: false, + drawBorder: false, + }, + }, + }, + plugins: { + legend: { + display: false, + }, + htmlLegend: { + // ID of the container to put the legend in + containerID: 'fintech-card-03-legend', + }, + tooltip: { + callbacks: { + title: () => false, // Disable tooltip title + label: (context) => formatValue(context.parsed.y), + }, + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + animation: { + duration: 200, + }, + maintainAspectRatio: false, + }, + plugins: [{ + id: 'htmlLegend', + afterUpdate(c, args, options) { + const legendContainer = document.getElementById(options.containerID); + const ul = legendContainer.querySelector('ul'); + if (!ul) return; + // Remove old legend items + while (ul.firstChild) { + ul.firstChild.remove(); + } + // Reuse the built-in legendItems generator + const items = c.options.plugins.legend.labels.generateLabels(c); + items.forEach((item) => { + const li = document.createElement('li'); + li.style.marginRight = '16px'; + // Button element + const button = document.createElement('button'); + button.style.display = 'inline-flex'; + button.style.alignItems = 'center'; + button.style.opacity = item.hidden ? '.3' : ''; + button.onclick = () => { + c.setDatasetVisibility(item.datasetIndex, !c.isDatasetVisible(item.datasetIndex)); + c.update(); + }; + // Color box + const box = document.createElement('span'); + box.style.display = 'block'; + box.style.width = '12px'; + box.style.height = '12px'; + box.style.borderRadius = '9999px'; + box.style.marginRight = '8px'; + box.style.borderWidth = '3px'; + box.style.borderColor = item.fillStyle; + box.style.pointerEvents = 'none'; + // Label + const label = document.createElement('span'); + label.style.color = '#64748b'; + label.style.fontSize = '0.875rem'; + label.style.lineHeight = '1.5715'; + const labelText = document.createTextNode(item.text); + label.appendChild(labelText); + li.appendChild(button); + button.appendChild(box); + button.appendChild(label); + ul.appendChild(li); + }); + }, + }], + }); +}; +fintechCard03(); + +// Init #fintech-04 chart +const images = [ + './images/company-icon-01.svg', // Revolut + './images/company-icon-02.svg', // HSBC + './images/company-icon-03.svg', // Qonto + './images/company-icon-04.svg' // N26 +]; + +const fintechCard04 = () => { + const ctx = document.getElementById('fintech-card-04'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'bar', + data: { + labels: [ + '02-01-2021', '03-01-2021', '04-01-2021', '05-01-2021', + ], + datasets: [ + // Indigo bars + { + label: 'Inflow', + data: [ + 4100, 1900, 2700, 3900, + ], + backgroundColor: '#6366f1', + hoverBackgroundColor: '#4f46e5', + categoryPercentage: 0.66, + }, + // Gray bars + { + label: 'Outflow', + data: [ + 2000, 1000, 1100, 2600, + ], + backgroundColor: '#cbd5e1', + hoverBackgroundColor: '#94a3b8', + categoryPercentage: 0.66, + }, + ], + }, + options: { + indexAxis: 'y', + layout: { + padding: { + top: 12, + bottom: 16, + left: 72, + right: 20, + }, + }, + scales: { + y: { + grid: { + display: false, + drawBorder: false, + drawTicks: false, + }, + ticks: { + display: false, + }, + }, + x: { + grid: { + drawBorder: false, + }, + ticks: { + maxTicksLimit: 3, + align: 'end', + callback: (value) => formatValue(value), + }, + }, + }, + plugins: { + legend: { + display: false, + }, + htmlLegend: { + // ID of the container to put the legend in + containerID: 'fintech-card-04-legend', + }, + tooltip: { + callbacks: { + title: () => false, // Disable tooltip title + label: (context) => formatValue(context.parsed.x), + }, + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + animation: { + duration: 200, + }, + maintainAspectRatio: false, + }, + plugins: [{ + id: 'htmlLegend', + afterUpdate(c, args, options) { + const legendContainer = document.getElementById(options.containerID); + const ul = legendContainer.querySelector('ul'); + if (!ul) return; + // Remove old legend items + while (ul.firstChild) { + ul.firstChild.remove(); + } + // Reuse the built-in legendItems generator + const items = c.options.plugins.legend.labels.generateLabels(c); + items.forEach((item) => { + const li = document.createElement('li'); + li.style.marginRight = '16px'; + // Button element + const button = document.createElement('button'); + button.style.display = 'inline-flex'; + button.style.alignItems = 'center'; + button.style.opacity = item.hidden ? '.3' : ''; + button.onclick = () => { + c.setDatasetVisibility(item.datasetIndex, !c.isDatasetVisible(item.datasetIndex)); + c.update(); + }; + // Color box + const box = document.createElement('span'); + box.style.display = 'block'; + box.style.width = '12px'; + box.style.height = '12px'; + box.style.borderRadius = '9999px'; + box.style.marginRight = '8px'; + box.style.borderWidth = '3px'; + box.style.borderColor = item.fillStyle; + box.style.pointerEvents = 'none'; + // Label + const label = document.createElement('span'); + label.style.color = '#64748b'; + label.style.fontSize = '0.875rem'; + label.style.lineHeight = '1.5715'; + const labelText = document.createTextNode(item.text); + label.appendChild(labelText); + li.appendChild(button); + button.appendChild(box); + button.appendChild(label); + ul.appendChild(li); + }); + }, + afterDraw(c) { + const xAxis = c.scales.x; + const yAxis = c.scales.y; + yAxis.ticks.forEach((value, index) => { + const y = yAxis.getPixelForTick(index); + const image = new Image(); + image.src = images[index]; + c.ctx.drawImage(image, xAxis.left - 52, y - 18); + }); + }, + }], + }); +}; +fintechCard04(); + +// Init #fintech-07 chart +const fintechCard07 = () => { + const ctx = document.getElementById('fintech-card-07'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'line', + data: { + labels: [ + '09-01-2021', '10-01-2021', '11-01-2021', + '12-01-2021', '01-01-2022', '02-01-2022', + '03-01-2022', '04-01-2022', '05-01-2022', + '06-01-2022', '07-01-2022', '08-01-2022', + '09-01-2022', '10-01-2022', '11-01-2022', + '12-01-2022', '01-01-2023', '02-01-2023', + '03-01-2023', '04-01-2023', + ], + datasets: [ + // Indigo line + { + label: 'Mosaic Portfolio', + data: [ + 1500, 2000, 1800, 1900, 1900, 2400, 2900, 2600, 3900, 2700, + 3500, 3200, 2900, 3500, 3600, 3400, 3900, 3600, 4100, 4100, + ], + borderColor: '#6366f1', + fill: true, + backgroundColor: `rgba(${hexToRGB('#3b82f6')}, 0.08)`, + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#6366f1', + clip: 20, + }, + // Gray line + { + label: 'Expected Return', + data: [ + 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, + 3000, 3100, 3200, 3300, 3400, 3500, 3600, 3700, 3800, 3900, + ], + borderColor: '#cbd5e1', + fill: false, + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#cbd5e1', + clip: 20, + }, + ], + }, + options: { + layout: { + padding: { + top: 12, + bottom: 16, + left: 20, + right: 20, + }, + }, + scales: { + y: { + beginAtZero: true, + grid: { + drawBorder: false, + }, + ticks: { + maxTicksLimit: 7, + callback: (value) => formatValue(value), + }, + }, + x: { + type: 'time', + time: { + parser: 'MM-DD-YYYY', + unit: 'month', + displayFormats: { + month: 'MMM YY', + }, + }, + grid: { + display: false, + drawBorder: false, + }, + ticks: { + autoSkipPadding: 48, + maxRotation: 0, + }, + }, + }, + plugins: { + tooltip: { + callbacks: { + title: () => false, // Disable tooltip title + label: (context) => formatValue(context.parsed.y), + }, + }, + legend: { + display: false, + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + maintainAspectRatio: false, + }, + }); +}; +fintechCard07(); + +// Init #fintech-08 chart +const fintechCard08 = () => { + const ctx = document.getElementById('fintech-card-08'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'line', + data: { + labels: [ + '2010', 'Age 65', + ], + datasets: [ + // Dark green line + { + label: 'Growth 1', + data: [ + 0, 3500000, + ], + borderColor: '#10b981', + fill: true, + backgroundColor: `rgba(${hexToRGB('#10b981')}, 0.08)`, + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#10b981', + clip: 20, + }, + // Light green line + { + label: 'Growth 2', + data: [ + 0, 2000000, + ], + borderColor: '#a7f3d0', + fill: false, + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#a7f3d0', + clip: 20, + }, + ], + }, + options: { + layout: { + padding: { + top: 12, + bottom: 16, + left: 20, + right: 20, + }, + }, + scales: { + y: { + beginAtZero: true, + grid: { + drawBorder: false, + }, + ticks: { + maxTicksLimit: 7, + callback: (value) => formatValue(value), + }, + }, + x: { + grid: { + display: false, + drawBorder: false, + }, + ticks: { + autoSkipPadding: 48, + maxRotation: 0, + align: 'end', + }, + }, + }, + plugins: { + tooltip: { + callbacks: { + title: () => false, // Disable tooltip title + label: (context) => formatValue(context.parsed.y), + }, + }, + legend: { + display: false, + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + maintainAspectRatio: false, + }, + }); +}; +fintechCard08(); + +// Init #fintech-09 chart +const fintechCard09 = () => { + const ctx = document.getElementById('fintech-card-09'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'pie', + data: { + labels: ['Cash', 'Commodities', 'Bonds', 'Stock'], + datasets: [ + { + label: 'Sessions By Device', + data: [ + 12, 13, 10, 65, + ], + backgroundColor: [ + '#34d399', + '#fbbf24', + '#38bdf8', + '#6366f1', + ], + hoverBackgroundColor: [ + '#10b981', + '#f59e0b', + '#0ea5e9', + '#4f46e5', + ], + borderWidth: 0, + }, + ], + }, + options: { + layout: { + padding: { + top: 4, + bottom: 4, + left: 24, + right: 24, + }, + }, + plugins: { + legend: { + display: false, + }, + htmlLegend: { + // ID of the container to put the legend in + containerID: 'fintech-card-09-legend', + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + animation: { + duration: 200, + }, + maintainAspectRatio: false, + }, + plugins: [{ + id: 'htmlLegend', + afterUpdate(c, args, options) { + const legendContainer = document.getElementById(options.containerID); + const ul = legendContainer.querySelector('ul'); + if (!ul) return; + // Remove old legend items + while (ul.firstChild) { + ul.firstChild.remove(); + } + // Reuse the built-in legendItems generator + const items = c.options.plugins.legend.labels.generateLabels(c); + items.forEach((item) => { + const li = document.createElement('li'); + li.style.margin = '6px'; + // Button element + const button = document.createElement('button'); + button.style.display = 'inline-flex'; + button.style.alignItems = 'center'; + button.style.opacity = item.hidden ? '.3' : ''; + button.onclick = () => { + c.toggleDataVisibility(item.index, !item.index); + c.update(); + }; + // Color box + const box = document.createElement('span'); + box.style.display = 'block'; + box.style.width = '12px'; + box.style.height = '12px'; + box.style.borderRadius = '9999px'; + box.style.marginRight = '6px'; + box.style.borderWidth = '3px'; + box.style.borderColor = item.fillStyle; + box.style.pointerEvents = 'none'; + // Label + const label = document.createElement('span'); + label.style.color = '#64748b'; + label.style.fontSize = '0.875rem'; + label.style.lineHeight = '1.5715'; + const labelText = document.createTextNode(item.text); + label.appendChild(labelText); + li.appendChild(button); + button.appendChild(box); + button.appendChild(label); + ul.appendChild(li); + }); + }, + }], + }); +}; +fintechCard09(); + +// Init #fintech-10 chart +const fintechCard10 = () => { + const ctx = document.getElementById('fintech-card-10'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'line', + data: { + labels: [ + '12-01-2020', '01-01-2021', '02-01-2021', + '03-01-2021', '04-01-2021', '05-01-2021', + '06-01-2021', '07-01-2021', '08-01-2021', + '09-01-2021', '10-01-2021', '11-01-2021', + '12-01-2021', '01-01-2022', '02-01-2022', + '03-01-2022', '04-01-2022', '05-01-2022', + '06-01-2022', '07-01-2022', '08-01-2022', + '09-01-2022', '10-01-2022', '11-01-2022', + '12-01-2022', '01-01-2023', + ], + datasets: [ + // Line + { + data: [ + 732, 610, 610, 504, 504, 504, 349, + 349, 504, 342, 504, 610, 391, 192, + 154, 273, 191, 191, 126, 263, 349, + 252, 323, 322, 270, 232, + ], + fill: true, + backgroundColor: `rgba(${hexToRGB('#f43f5e')}, 0.08)`, + borderColor: '#f43f5e', + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#f43f5e', + clip: 20, + }, + ], + }, + options: { + layout: { + padding: { + top: 16, + bottom: 16, + left: 20, + right: 20, + }, + }, + scales: { + y: { + beginAtZero: true, + grid: { + drawBorder: false, + drawTicks: false, + }, + ticks: { + maxTicksLimit: 2, + display: false, + }, + }, + x: { + type: 'time', + time: { + parser: 'MM-DD-YYYY', + unit: 'month', + }, + display: false, + }, + }, + plugins: { + tooltip: { + callbacks: { + title: () => false, // Disable tooltip title + label: (context) => formatValue(context.parsed.y), + }, + }, + legend: { + display: false, + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + maintainAspectRatio: false, + }, + }); +}; +fintechCard10(); + +// Init #fintech-11 chart +const fintechCard11 = () => { + const ctx = document.getElementById('fintech-card-11'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'line', + data: { + labels: [ + '12-01-2020', '01-01-2021', '02-01-2021', + '03-01-2021', '04-01-2021', '05-01-2021', + '06-01-2021', '07-01-2021', '08-01-2021', + '09-01-2021', '10-01-2021', '11-01-2021', + '12-01-2021', '01-01-2022', '02-01-2022', + '03-01-2022', '04-01-2022', '05-01-2022', + '06-01-2022', '07-01-2022', '08-01-2022', + '09-01-2022', '10-01-2022', '11-01-2022', + '12-01-2022', '01-01-2023', + ], + datasets: [ + // Line + { + data: [ + 222, 222, 226, 271, 365, 365, 238, + 324, 288, 206, 324, 324, 500, 409, + 409, 273, 232, 273, 500, 570, 767, + 808, 685, 767, 685, 685, + ], + fill: true, + backgroundColor: `rgba(${hexToRGB('#10b981')}, 0.08)`, + borderColor: '#10b981', + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#10b981', + clip: 20, + }, + ], + }, + options: { + layout: { + padding: { + top: 16, + bottom: 16, + left: 20, + right: 20, + }, + }, + scales: { + y: { + beginAtZero: true, + grid: { + drawBorder: false, + drawTicks: false, + }, + ticks: { + maxTicksLimit: 2, + display: false, + }, + }, + x: { + type: 'time', + time: { + parser: 'MM-DD-YYYY', + unit: 'month', + }, + display: false, + }, + }, + plugins: { + tooltip: { + callbacks: { + title: () => false, // Disable tooltip title + label: (context) => formatValue(context.parsed.y), + }, + }, + legend: { + display: false, + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + maintainAspectRatio: false, + }, + }); +}; +fintechCard11(); + +// Init #fintech-12 chart +const fintechCard12 = () => { + const ctx = document.getElementById('fintech-card-12'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'line', + data: { + labels: [ + '12-01-2020', '01-01-2021', '02-01-2021', + '03-01-2021', '04-01-2021', '05-01-2021', + '06-01-2021', '07-01-2021', '08-01-2021', + '09-01-2021', '10-01-2021', '11-01-2021', + '12-01-2021', '01-01-2022', '02-01-2022', + '03-01-2022', '04-01-2022', '05-01-2022', + '06-01-2022', '07-01-2022', '08-01-2022', + '09-01-2022', '10-01-2022', '11-01-2022', + '12-01-2022', '01-01-2023', + ], + datasets: [ + // Line + { + data: [ + 540, 466, 540, 466, 385, 432, 334, + 334, 289, 289, 200, 289, 222, 289, + 289, 403, 554, 304, 289, 270, 134, + 270, 829, 644, 688, 664, + ], + fill: true, + backgroundColor: `rgba(${hexToRGB('#10b981')}, 0.08)`, + borderColor: '#10b981', + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#10b981', + clip: 20, + }, + ], + }, + options: { + layout: { + padding: { + top: 16, + bottom: 16, + left: 20, + right: 20, + }, + }, + scales: { + y: { + beginAtZero: true, + grid: { + drawBorder: false, + drawTicks: false, + }, + ticks: { + maxTicksLimit: 2, + display: false, + }, + }, + x: { + type: 'time', + time: { + parser: 'MM-DD-YYYY', + unit: 'month', + }, + display: false, + }, + }, + plugins: { + tooltip: { + callbacks: { + title: () => false, // Disable tooltip title + label: (context) => formatValue(context.parsed.y), + }, + }, + legend: { + display: false, + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + maintainAspectRatio: false, + }, + }); +}; +fintechCard12(); + +// Init #fintech-13 chart +const fintechCard13 = () => { + const ctx = document.getElementById('fintech-card-13'); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'line', + data: { + labels: [ + '12-01-2020', '01-01-2021', '02-01-2021', + '03-01-2021', '04-01-2021', '05-01-2021', + '06-01-2021', '07-01-2021', '08-01-2021', + '09-01-2021', '10-01-2021', '11-01-2021', + '12-01-2021', '01-01-2022', '02-01-2022', + '03-01-2022', '04-01-2022', '05-01-2022', + '06-01-2022', '07-01-2022', '08-01-2022', + '09-01-2022', '10-01-2022', '11-01-2022', + '12-01-2022', '01-01-2023', + ], + datasets: [ + // Line + { + data: [ + 245, 288, 332, 404, 404, 314, 314, + 314, 314, 314, 234, 314, 234, 234, + 314, 314, 314, 388, 314, 202, 202, + 202, 202, 514, 720, 642, + ], + fill: true, + backgroundColor: `rgba(${hexToRGB('#10b981')}, 0.08)`, + borderColor: '#10b981', + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + pointBackgroundColor: '#10b981', + clip: 20, + }, + ], + }, + options: { + layout: { + padding: { + top: 16, + bottom: 16, + left: 20, + right: 20, + }, + }, + scales: { + y: { + beginAtZero: true, + grid: { + drawBorder: false, + drawTicks: false, + }, + ticks: { + maxTicksLimit: 2, + display: false, + }, + }, + x: { + type: 'time', + time: { + parser: 'MM-DD-YYYY', + unit: 'month', + }, + display: false, + }, + }, + plugins: { + tooltip: { + callbacks: { + title: () => false, // Disable tooltip title + label: (context) => formatValue(context.parsed.y), + }, + }, + legend: { + display: false, + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + maintainAspectRatio: false, + }, + }); +}; +fintechCard13(); + +// Init #fintech-14 chart +const fintechCard14 = () => { + const miniCharts = [ + // Twitter + { + selector: 'fintech-card-14-a', + data: [ + 540, 466, 540, 466, 385, 432, 334, + 334, 289, 289, 200, 289, 222, 289, + 289, 403, 554, 304, 289, 270, 134, + 270, 829, 644, 688, 664, + ], + growth: true, + }, + // Facebook + { + selector: 'fintech-card-14-b', + data: [ + 245, 288, 332, 404, 404, 314, 314, + 314, 314, 314, 234, 314, 234, 234, + 314, 314, 314, 388, 314, 202, 202, + 202, 202, 514, 720, 642, + ], + growth: true, + }, + // Google + { + selector: 'fintech-card-14-c', + data: [ + 732, 610, 610, 504, 504, 504, 349, + 349, 504, 342, 504, 610, 391, 192, + 154, 273, 191, 191, 126, 263, 349, + 252, 323, 322, 270, 232, + ], + growth: false, + }, + // Apple + { + selector: 'fintech-card-14-d', + data: [ + 222, 222, 226, 271, 365, 365, 238, + 324, 288, 206, 324, 324, 500, 409, + 409, 273, 232, 273, 500, 570, 767, + 808, 685, 767, 685, 685, + ], + growth: true, + }, + // Coinbase + { + selector: 'fintech-card-14-e', + data: [ + 632, 510, 610, 404, 504, 404, 449, + 349, 404, 542, 404, 410, 491, 392, + 254, 273, 291, 191, 226, 363, 449, + 252, 223, 222, 170, 132, + ], + growth: false, + }, + ]; + + miniCharts.forEach((miniChart) => { + const ctx = document.getElementById(miniChart.selector); + if (!ctx) return; + // eslint-disable-next-line no-unused-vars + const chart = new Chart(ctx, { + type: 'line', + data: { + labels: [ + '12-01-2020', '01-01-2021', '02-01-2021', + '03-01-2021', '04-01-2021', '05-01-2021', + '06-01-2021', '07-01-2021', '08-01-2021', + '09-01-2021', '10-01-2021', '11-01-2021', + '12-01-2021', '01-01-2022', '02-01-2022', + '03-01-2022', '04-01-2022', '05-01-2022', + '06-01-2022', '07-01-2022', '08-01-2022', + '09-01-2022', '10-01-2022', '11-01-2022', + '12-01-2022', '01-01-2023', + ], + datasets: [ + // Line + { + data: miniChart.data, + // eslint-disable-next-line max-len + borderColor: miniChart.growth ? '#10b981' : '#f43f5e', + borderWidth: 2, + tension: 0, + pointRadius: 0, + pointHoverRadius: 3, + // eslint-disable-next-line max-len + pointBackgroundColor: miniChart.growth ? '#10b981' : '#f43f5e', + clip: 20, + }, + ], + }, + options: { + scales: { + y: { + display: false, + beginAtZero: true, + }, + x: { + type: 'time', + time: { + parser: 'MM-DD-YYYY', + unit: 'month', + }, + display: false, + }, + }, + plugins: { + tooltip: { + callbacks: { + title: () => false, // Disable tooltip title + label: (context) => formatValue(context.parsed.y), + }, + }, + legend: { + display: false, + }, + }, + interaction: { + intersect: false, + mode: 'nearest', + }, + maintainAspectRatio: false, + }, + }); + }); +}; +fintechCard14(); \ No newline at end of file diff --git a/backend-server/public/dashboard/js/flatpickr-init.js b/backend-server/public/dashboard/js/flatpickr-init.js new file mode 100644 index 00000000..3edbe6ed --- /dev/null +++ b/backend-server/public/dashboard/js/flatpickr-init.js @@ -0,0 +1,20 @@ +// Init flatpickr +flatpickr('.datepicker', { + mode: 'range', + static: true, + monthSelectorType: 'static', + dateFormat: 'M j, Y', + defaultDate: [new Date().setDate(new Date().getDate() - 6), new Date()], + prevArrow: '', + nextArrow: '', + onReady: (selectedDates, dateStr, instance) => { + // eslint-disable-next-line no-param-reassign + instance.element.value = dateStr.replace('to', '-'); + const customClass = instance.element.getAttribute('data-class'); + instance.calendarContainer.classList.add(customClass); + }, + onChange: (selectedDates, dateStr, instance) => { + // eslint-disable-next-line no-param-reassign + instance.element.value = dateStr.replace('to', '-'); + }, +}); \ No newline at end of file diff --git a/backend-server/public/dashboard/js/vendors/alpinejs.min.js b/backend-server/public/dashboard/js/vendors/alpinejs.min.js new file mode 100644 index 00000000..42ab0778 --- /dev/null +++ b/backend-server/public/dashboard/js/vendors/alpinejs.min.js @@ -0,0 +1,5 @@ +(()=>{var We=!1,Ge=!1,j=[];function Nt(e){nn(e)}function nn(e){j.includes(e)||j.push(e),on()}function he(e){let t=j.indexOf(e);t!==-1&&j.splice(t,1)}function on(){!Ge&&!We&&(We=!0,queueMicrotask(sn))}function sn(){We=!1,Ge=!0;for(let e=0;ee.effect(t,{scheduler:r=>{Je?Nt(r):r()}}),Ye=e.raw}function Ze(e){K=e}function Dt(e){let t=()=>{};return[n=>{let i=K(n);return e._x_effects||(e._x_effects=new Set,e._x_runEffects=()=>{e._x_effects.forEach(o=>o())}),e._x_effects.add(i),t=()=>{i!==void 0&&(e._x_effects.delete(i),Y(i))},i},()=>{t()}]}var $t=[],Lt=[],Ft=[];function jt(e){Ft.push(e)}function _e(e,t){typeof t=="function"?(e._x_cleanups||(e._x_cleanups=[]),e._x_cleanups.push(t)):(t=e,Lt.push(t))}function Kt(e){$t.push(e)}function Bt(e,t,r){e._x_attributeCleanups||(e._x_attributeCleanups={}),e._x_attributeCleanups[t]||(e._x_attributeCleanups[t]=[]),e._x_attributeCleanups[t].push(r)}function Qe(e,t){!e._x_attributeCleanups||Object.entries(e._x_attributeCleanups).forEach(([r,n])=>{(t===void 0||t.includes(r))&&(n.forEach(i=>i()),delete e._x_attributeCleanups[r])})}var et=new MutationObserver(Xe),tt=!1;function rt(){et.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),tt=!0}function cn(){an(),et.disconnect(),tt=!1}var ee=[],nt=!1;function an(){ee=ee.concat(et.takeRecords()),ee.length&&!nt&&(nt=!0,queueMicrotask(()=>{ln(),nt=!1}))}function ln(){Xe(ee),ee.length=0}function m(e){if(!tt)return e();cn();let t=e();return rt(),t}var it=!1,ge=[];function zt(){it=!0}function Vt(){it=!1,Xe(ge),ge=[]}function Xe(e){if(it){ge=ge.concat(e);return}let t=[],r=[],n=new Map,i=new Map;for(let o=0;os.nodeType===1&&t.push(s)),e[o].removedNodes.forEach(s=>s.nodeType===1&&r.push(s))),e[o].type==="attributes")){let s=e[o].target,a=e[o].attributeName,c=e[o].oldValue,l=()=>{n.has(s)||n.set(s,[]),n.get(s).push({name:a,value:s.getAttribute(a)})},u=()=>{i.has(s)||i.set(s,[]),i.get(s).push(a)};s.hasAttribute(a)&&c===null?l():s.hasAttribute(a)?(u(),l()):u()}i.forEach((o,s)=>{Qe(s,o)}),n.forEach((o,s)=>{$t.forEach(a=>a(s,o))});for(let o of r)if(!t.includes(o)&&(Lt.forEach(s=>s(o)),o._x_cleanups))for(;o._x_cleanups.length;)o._x_cleanups.pop()();t.forEach(o=>{o._x_ignoreSelf=!0,o._x_ignore=!0});for(let o of t)r.includes(o)||!o.isConnected||(delete o._x_ignoreSelf,delete o._x_ignore,Ft.forEach(s=>s(o)),o._x_ignore=!0,o._x_ignoreSelf=!0);t.forEach(o=>{delete o._x_ignoreSelf,delete o._x_ignore}),t=null,r=null,n=null,i=null}function xe(e){return P(N(e))}function C(e,t,r){return e._x_dataStack=[t,...N(r||e)],()=>{e._x_dataStack=e._x_dataStack.filter(n=>n!==t)}}function ot(e,t){let r=e._x_dataStack[0];Object.entries(t).forEach(([n,i])=>{r[n]=i})}function N(e){return e._x_dataStack?e._x_dataStack:typeof ShadowRoot=="function"&&e instanceof ShadowRoot?N(e.host):e.parentNode?N(e.parentNode):[]}function P(e){let t=new Proxy({},{ownKeys:()=>Array.from(new Set(e.flatMap(r=>Object.keys(r)))),has:(r,n)=>e.some(i=>i.hasOwnProperty(n)),get:(r,n)=>(e.find(i=>{if(i.hasOwnProperty(n)){let o=Object.getOwnPropertyDescriptor(i,n);if(o.get&&o.get._x_alreadyBound||o.set&&o.set._x_alreadyBound)return!0;if((o.get||o.set)&&o.enumerable){let s=o.get,a=o.set,c=o;s=s&&s.bind(t),a=a&&a.bind(t),s&&(s._x_alreadyBound=!0),a&&(a._x_alreadyBound=!0),Object.defineProperty(i,n,{...c,get:s,set:a})}return!0}return!1})||{})[n],set:(r,n,i)=>{let o=e.find(s=>s.hasOwnProperty(n));return o?o[n]=i:e[e.length-1][n]=i,!0}});return t}function ye(e){let t=n=>typeof n=="object"&&!Array.isArray(n)&&n!==null,r=(n,i="")=>{Object.entries(Object.getOwnPropertyDescriptors(n)).forEach(([o,{value:s,enumerable:a}])=>{if(a===!1||s===void 0)return;let c=i===""?o:`${i}.${o}`;typeof s=="object"&&s!==null&&s._x_interceptor?n[o]=s.initialize(e,c,o):t(s)&&s!==n&&!(s instanceof Element)&&r(s,c)})};return r(e)}function be(e,t=()=>{}){let r={initialValue:void 0,_x_interceptor:!0,initialize(n,i,o){return e(this.initialValue,()=>un(n,i),s=>st(n,i,s),i,o)}};return t(r),n=>{if(typeof n=="object"&&n!==null&&n._x_interceptor){let i=r.initialize.bind(r);r.initialize=(o,s,a)=>{let c=n.initialize(o,s,a);return r.initialValue=c,i(o,s,a)}}else r.initialValue=n;return r}}function un(e,t){return t.split(".").reduce((r,n)=>r[n],e)}function st(e,t,r){if(typeof t=="string"&&(t=t.split(".")),t.length===1)e[t[0]]=r;else{if(t.length===0)throw error;return e[t[0]]||(e[t[0]]={}),st(e[t[0]],t.slice(1),r)}}var Ht={};function x(e,t){Ht[e]=t}function te(e,t){return Object.entries(Ht).forEach(([r,n])=>{Object.defineProperty(e,`$${r}`,{get(){let[i,o]=at(t);return i={interceptor:be,...i},_e(t,o),n(t,i)},enumerable:!1})}),e}function qt(e,t,r,...n){try{return r(...n)}catch(i){J(i,e,t)}}function J(e,t,r=void 0){Object.assign(e,{el:t,expression:r}),console.warn(`Alpine Expression Error: ${e.message} + +${r?'Expression: "'+r+`" + +`:""}`,t),setTimeout(()=>{throw e},0)}var ve=!0;function Ut(e){let t=ve;ve=!1,e(),ve=t}function k(e,t,r={}){let n;return _(e,t)(i=>n=i,r),n}function _(...e){return Wt(...e)}var Wt=ct;function Gt(e){Wt=e}function ct(e,t){let r={};te(r,e);let n=[r,...N(e)];if(typeof t=="function")return fn(n,t);let i=dn(n,t,e);return qt.bind(null,e,t,i)}function fn(e,t){return(r=()=>{},{scope:n={},params:i=[]}={})=>{let o=t.apply(P([n,...e]),i);we(r,o)}}var lt={};function pn(e,t){if(lt[e])return lt[e];let r=Object.getPrototypeOf(async function(){}).constructor,n=/^[\n\s]*if.*\(.*\)/.test(e)||/^(let|const)\s/.test(e)?`(() => { ${e} })()`:e,o=(()=>{try{return new r(["__self","scope"],`with (scope) { __self.result = ${n} }; __self.finished = true; return __self.result;`)}catch(s){return J(s,t,e),Promise.resolve()}})();return lt[e]=o,o}function dn(e,t,r){let n=pn(t,r);return(i=()=>{},{scope:o={},params:s=[]}={})=>{n.result=void 0,n.finished=!1;let a=P([o,...e]);if(typeof n=="function"){let c=n(n,a).catch(l=>J(l,r,t));n.finished?(we(i,n.result,a,s,r),n.result=void 0):c.then(l=>{we(i,l,a,s,r)}).catch(l=>J(l,r,t)).finally(()=>n.result=void 0)}}}function we(e,t,r,n,i){if(ve&&typeof t=="function"){let o=t.apply(r,n);o instanceof Promise?o.then(s=>we(e,s,r,n)).catch(s=>J(s,i,t)):e(o)}else e(t)}var ut="x-";function E(e=""){return ut+e}function Yt(e){ut=e}var Jt={};function d(e,t){Jt[e]=t}function re(e,t,r){let n={};return Array.from(t).map(Zt((o,s)=>n[o]=s)).filter(Qt).map(hn(n,r)).sort(_n).map(o=>mn(e,o))}function Xt(e){return Array.from(e).map(Zt()).filter(t=>!Qt(t))}var ft=!1,ne=new Map,er=Symbol();function tr(e){ft=!0;let t=Symbol();er=t,ne.set(t,[]);let r=()=>{for(;ne.get(t).length;)ne.get(t).shift()();ne.delete(t)},n=()=>{ft=!1,r()};e(r),n()}function at(e){let t=[],r=a=>t.push(a),[n,i]=Dt(e);return t.push(i),[{Alpine:I,effect:n,cleanup:r,evaluateLater:_.bind(_,e),evaluate:k.bind(k,e)},()=>t.forEach(a=>a())]}function mn(e,t){let r=()=>{},n=Jt[t.type]||r,[i,o]=at(e);Bt(e,t.original,o);let s=()=>{e._x_ignore||e._x_ignoreSelf||(n.inline&&n.inline(e,t,i),n=n.bind(n,e,t,i),ft?ne.get(er).push(n):n())};return s.runCleanups=o,s}var Ee=(e,t)=>({name:r,value:n})=>(r.startsWith(e)&&(r=r.replace(e,t)),{name:r,value:n}),Se=e=>e;function Zt(e=()=>{}){return({name:t,value:r})=>{let{name:n,value:i}=rr.reduce((o,s)=>s(o),{name:t,value:r});return n!==t&&e(n,t),{name:n,value:i}}}var rr=[];function Z(e){rr.push(e)}function Qt({name:e}){return nr().test(e)}var nr=()=>new RegExp(`^${ut}([^:^.]+)\\b`);function hn(e,t){return({name:r,value:n})=>{let i=r.match(nr()),o=r.match(/:([a-zA-Z0-9\-:]+)/),s=r.match(/\.[^.\]]+(?=[^\]]*$)/g)||[],a=t||e[r]||r;return{type:i?i[1]:null,value:o?o[1]:null,modifiers:s.map(c=>c.replace(".","")),expression:n,original:a}}}var dt="DEFAULT",Ae=["ignore","ref","data","id","bind","init","for","mask","model","modelable","transition","show","if",dt,"teleport","element"];function _n(e,t){let r=Ae.indexOf(e.type)===-1?dt:e.type,n=Ae.indexOf(t.type)===-1?dt:t.type;return Ae.indexOf(r)-Ae.indexOf(n)}function B(e,t,r={}){e.dispatchEvent(new CustomEvent(t,{detail:r,bubbles:!0,composed:!0,cancelable:!0}))}var pt=[],mt=!1;function Te(e=()=>{}){return queueMicrotask(()=>{mt||setTimeout(()=>{Oe()})}),new Promise(t=>{pt.push(()=>{e(),t()})})}function Oe(){for(mt=!1;pt.length;)pt.shift()()}function ir(){mt=!0}function R(e,t){if(typeof ShadowRoot=="function"&&e instanceof ShadowRoot){Array.from(e.children).forEach(i=>R(i,t));return}let r=!1;if(t(e,()=>r=!0),r)return;let n=e.firstElementChild;for(;n;)R(n,t,!1),n=n.nextElementSibling}function O(e,...t){console.warn(`Alpine Warning: ${e}`,...t)}function sr(){document.body||O("Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's ` + +@endsection diff --git a/backend-server/resources/views/errors/404.blade.php b/backend-server/resources/views/errors/404.blade.php new file mode 100644 index 00000000..f2419f73 --- /dev/null +++ b/backend-server/resources/views/errors/404.blade.php @@ -0,0 +1,44 @@ +@extends('marketing.layout.app', ['title' => __('Dashboard')]) +@section('content') + + +

+ +
+ + + + +
+
+
+ +

404 Oh, No! You stumbled upon a rarity

+ +
+
+
+
+ +
+ +@endsection + +@section('scripts') +@endsection diff --git a/backend-server/resources/views/errors/500.blade.php b/backend-server/resources/views/errors/500.blade.php new file mode 100644 index 00000000..0d7b94f3 --- /dev/null +++ b/backend-server/resources/views/errors/500.blade.php @@ -0,0 +1,41 @@ +@extends('marketing.layout.app', ['title' => __('Dashboard')]) +@section('content') + + +
+ +
+ + + + +
+
+
+ +

It seem we are having some problems, please refresh in a couple of minutes

+
+
+
+
+ +
+ +@endsection + +@section('scripts') +@endsection diff --git a/backend-server/resources/views/index.blade.php b/backend-server/resources/views/index.blade.php new file mode 100644 index 00000000..d3f9f343 --- /dev/null +++ b/backend-server/resources/views/index.blade.php @@ -0,0 +1,131 @@ +@extends('layout.app', ['title' => __('Dashboard')]) +@section('content') + + + +
+ + + + +
+
+

👋 Welcome to OpenChat!

+
+
+
+
+ + +
+ + +
+

My chatbots ✨

+
+ + + + +
+ + +
+ + + @foreach($chatbots as $bot) +
+
+
+
+
+ + + +
+
+
+
+ +

{{$bot->name}}

+
+{{--
Lorem ipsum is placeholder text commonly used in the graphic, print, and publishing industries for previewing layouts.
--}} +
+
+
{{ $bot->created_at }}
+
+
+{{--
--}} +{{-- {{$bot->getStatus()->getLabel()}}--}} +{{--
--}} +
+
+ Open -> +
+
+
+
+
+ @endforeach + +
+
+@endsection + +@section('scripts') +@endsection diff --git a/backend-server/resources/views/layout/app.blade.php b/backend-server/resources/views/layout/app.blade.php new file mode 100644 index 00000000..df4d69a3 --- /dev/null +++ b/backend-server/resources/views/layout/app.blade.php @@ -0,0 +1,72 @@ + + + + + + OpenChat - Dashboard + + + + + + + + + + +
+ + +
+ + + + +{{-- @include('layout.sidebar')--}} +
+ + +
+ + + @if(!isset($doNotShowTopHeader)) + @include('layout.header') + @endif + +
+ @yield('content') +
+ +
+ +
+ + + + + + + + + + +@yield('scripts') + + + diff --git a/backend-server/resources/views/layout/header.blade.php b/backend-server/resources/views/layout/header.blade.php new file mode 100644 index 00000000..aa99ad8d --- /dev/null +++ b/backend-server/resources/views/layout/header.blade.php @@ -0,0 +1,77 @@ +
+
+
+ + + + + +
+ + + +
+ + +
+ +
+
+
User
+
Root account
+
+ +
+
+ +
+ +
+
+
diff --git a/backend-server/resources/views/layout/sidebar-bot-page.blade.php b/backend-server/resources/views/layout/sidebar-bot-page.blade.php new file mode 100644 index 00000000..decd3b42 --- /dev/null +++ b/backend-server/resources/views/layout/sidebar-bot-page.blade.php @@ -0,0 +1,68 @@ + diff --git a/backend-server/resources/views/layout/sidebar.blade.php b/backend-server/resources/views/layout/sidebar.blade.php new file mode 100644 index 00000000..bf38246d --- /dev/null +++ b/backend-server/resources/views/layout/sidebar.blade.php @@ -0,0 +1,264 @@ + diff --git a/backend-server/resources/views/marketing/index.blade.php b/backend-server/resources/views/marketing/index.blade.php new file mode 100644 index 00000000..9e08433c --- /dev/null +++ b/backend-server/resources/views/marketing/index.blade.php @@ -0,0 +1,570 @@ +@extends('marketing.layout.app', ['title' => __('Dashboard')]) +@section('content') + + +
+ + +
+ + + + +
+ + +
+ + +
+

Your own ChatGPT for
your website

+
+

+ Build a custom a chatbot like ChatGPT for your website or for personal use. No coding + required. +

+
+ @if(\Illuminate\Support\Facades\Auth::user()) + + @else + + @endif +
+
+
+ + +
+
+
+ + + +
+ +
+ + + + + + + +
+ +
+ +
+
+ + +
+ + + +
+ +
+
+ + +
+ + +
+
+

Live demo

+

We have prepared multiple demos on what you can build + with our tools in less than 5 minutes - same amount of time

+
+ +
+ + + +
+
+ +
+
+ +
+
+ + +
+ + +
+

How the he*k does this work?

+

Once you provide your website, PDF files, etc... , we use + powerful crawlers to crawl your data and transform it to knowledge using LLMs! .

+
+ + +
+ +
+
+
+
+ + +
+ + + +
+ +
+
+ + +
+

What can I do with OpenChat?

+

Well, a lot.

+
+ + +
+ + +
+ + + + + + + + + + + +

Customer support chatbot

+

Trained on your very own data whatever it is

+
+ + +
+ + + + + + + + + + +

Private tutor

+

Upload your books, and ask the bot any question

+
+ + +
+ + + + + + + + + + + +

Internal knowledge

+

Your employees doesnot have to waste more time searching Confluence

+
+ + +
+ + + + + + + + + + + +

Share with client

+

Create private chatbot and share them with your clients

+
+ + +
+ + + + + + + + + + +

Personal library

+

Upload your books, texts, and then ask the bot any question

+
+ + +
+ + + + + + + + + +

Your use case?

+

You can use the bot as you wish! it's that simple

+
+ +
+ +
+
+
+ + + +
+
+
+ + +
+ +
+ + +
+

Build your own ChatGPT for free!

+

We have a generous free tier available to get + you started right away.

+
+ + + + +
+ +
+ +
+
+
+ +
+@endsection + +@section('scripts') + +@endsection diff --git a/backend-server/resources/views/marketing/layout/app.blade.php b/backend-server/resources/views/marketing/layout/app.blade.php new file mode 100644 index 00000000..b57e039f --- /dev/null +++ b/backend-server/resources/views/marketing/layout/app.blade.php @@ -0,0 +1,131 @@ + + + + + + OpenChat - Build your own ChatGPT + + + + + + + + + + + + +
+ + +
+ +
+
+ + + + + + + + +
+
+
+ + + + @yield('content') + + +
+
+ + + + +
+ + + +
© Openchat.so - Amsterdam / All rights reserved.
+ +
+ +
+
+ +
+ + + + + +@if(!request()->routeIs('chat')) + +@endif +@yield('scripts') + + + + + diff --git a/backend-server/resources/views/marketing/pricing.blade.php b/backend-server/resources/views/marketing/pricing.blade.php new file mode 100644 index 00000000..70ec31da --- /dev/null +++ b/backend-server/resources/views/marketing/pricing.blade.php @@ -0,0 +1,588 @@ +@extends('marketing.layout.app', ['title' => __('Dashboard')]) +@section('content') +
+ + +
+
+
+ + +
+

Start for free. Pay as you grow.

+

Our pricing is simple, transparent and adapts to the size of your company.

+
+ + +
+ + +
+
+ + + +
+
+ +
+ + +
+
+
Starter
+
+ + + +
+
To get you started. quickly.
+
+
    +
  • + + + + 1 chatbot +
  • +
  • + + + + 1 website (extract up to 10 pages) +
  • +
  • + + + + 100 message monthly +
  • +
  • + + + + 5 PDF uploads +
  • +
+ +
+ + +
+
+ + + +
+
+
Grow
+
+ + + +
+
More control and perfect scale
+
+
    +
  • + + + + 10 Chatbots +
  • +
  • + + + + 20 websites (each up to 100 pages) +
  • +
  • + + + + 10.000 messages +
  • +
  • + + + + 10 PDF uploads +
  • +
+ +
+ + +
+
+
Enterprise
+
+ + + +
+
Tell us what you need, and we will make it happen
+
+
    + +
+
+ Call us +
+
+
+ +
+ + + + +
+
+
+ + + + +
+ + + + +
+
+ + +
+

Trusted by over 200 users - and counting

+

Arcu cursus vitae congue mauris rhoncus viverra nibh cras pulvinar mattis + blandit libero cursus mattis.

+
+ + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ +
+ + +
+ + +
+ + +
+ + + + +
+ + +
+ + +
+ +
+ + + + +
+
+
+
+ + +
+
+
+ + +
+

Questions & Answers

+
+ + +
    +
  • + +
    +

    + No coding knowledge is required! Openchat.so have intuitive interface and easy to use and you can get your own chatbot in a few minutes. +

    +
    +
  • +
  • + +
    +

    + Yes, you can use multiple data sources for your chatbot. Currently, we support website (we do the scraping), PDF files, Notion and Confluence. We are working on adding more data sources. +

    +
    +
  • +
  • + +
    +

    + Currently you can't change your chatbot styling settings, but we are working on adding this feature very very soon. +

    +
    +
  • +
  • + +
    +

    + Your chatbot will be able to answer questions in almost all languages (+100 Languages). Thanks to the power of LLMs. +

    +
    +
  • +
  • + +
    +

    + Yes, you can share your chatbot url with anyone and they will be able to use it! the chatbot will be available on a public url. +

    +
    +
  • +
  • + +
    +

    + We store your data on a secure server in Germany and we don't share it with anyone. however, you can enable the "enhanced privacy mode" and we will not store any data on our servers (expect temporarily for the chatbot training) . +

    +
    +
  • +
  • + +
    +

    + If you have a problem, or you have a feature request, you can contact us at hey@openchat.so and we should be able to help you. +

    +
    +
  • +
  • + +
    +

    + Yes you can! you can embed the chatbot on your website using the embed code we provide. +

    +
    +
  • + +
+ +
+
+
+ + +
+
+
+ + +
+ +
+ + +
+

Ready to get started?

+

We have a generous free tier available to get you started right away.

+
+ + + + +
+ +
+ +
+
+
+ +
+@endsection + +@section('scripts') +@endsection diff --git a/backend-server/resources/views/marketing/privacy-policy.blade.php b/backend-server/resources/views/marketing/privacy-policy.blade.php new file mode 100644 index 00000000..5446aae2 --- /dev/null +++ b/backend-server/resources/views/marketing/privacy-policy.blade.php @@ -0,0 +1,148 @@ +@extends('marketing.layout.app', ['title' => __('Dashboard')]) +@section('content') +
+ + +
+
+
+ + +
+

Privacy Policy

+

+ Our Commitment to Safeguarding Your Privacy and Confidentiality +

+
+ + +
+
+
+ + +
+
+
+ +
+

At OpenChat, we value your privacy and are committed to protecting your personal information. This Privacy Policy outlines how we collect, use, disclose, and store your data when you use our product, OpenChat. Please take the time to read this policy carefully to understand our practices regarding your personal information.

+ +

1. Information We Collect

+ +

1.1 Personal Information

+

When you sign up for OpenChat, we may collect certain personal information, including but not limited to:

+
    +
  • Your name
  • +
  • Email address
  • +
  • Profile picture (optional)
  • +
  • User-generated content (messages, posts, and other communications)
  • +
+ +

1.2 Usage Information

+

We also gather usage information when you interact with OpenChat, such as:

+
    +
  • IP addresses
  • +
  • Device information (e.g., operating system, browser type)
  • +
  • Log data (e.g., access times, pages viewed, actions taken within the app)
  • +
+ +

2. How We Use Your Information

+ +

2.1 Providing and Improving OpenChat

+

We utilize your personal information to:

+
    +
  • Enable you to create and manage your OpenChat account
  • +
  • Facilitate communication and interactions within OpenChat
  • +
  • Personalize your user experience
  • +
  • Improve our product, including adding new features and functionality
  • +
+ +

2.2 Communication and Updates

+

We may use your email address to send you important notifications, updates about OpenChat, and relevant promotional materials. You can opt-out of marketing communications at any time.

+ +

3. Information Sharing and Disclosure

+ +

3.1 Third-Party Service Providers

+

We may engage trusted third-party service providers to assist us in operating, maintaining, and improving OpenChat. These providers are bound by confidentiality obligations and are only authorized to use your personal information as necessary to provide services to us.

+ +

3.2 Legal Requirements

+

We may disclose your personal information if required to do so by law or if we believe that such action is necessary to:

+
    +
  • Comply with legal obligations
  • +
  • Protect our rights, property, or safety
  • +
  • Investigate and prevent potential violations
  • +
+ +

4. Data Security

+

We implement security measures to protect your personal information from unauthorized access, disclosure, alteration, or destruction. However, please be aware that no method of transmission over the internet or electronic storage is 100% secure.

+ +

5. Data Retention

+

We retain your personal information for as long as necessary to fulfill the purposes outlined in this Privacy Policy, unless a longer retention period is required or permitted by law.

+ +

6. Your Rights and Choices

+

You have the right to:

+
    +
  • Access, update, or delete your personal information
  • +
  • Object to the processing of your personal information
  • +
  • Withdraw consent for certain processing activities
  • +
+ +

7. Children's Privacy

+

OpenChat is not intended for use by individuals under the age of 13. We do not knowingly collect personal information from children. If we become aware that we have collected personal information from a child without parental consent, we will take steps to remove that information from our servers.

+ +

8. Changes to this Privacy Policy

+

We may update this Privacy Policy from time to time. We will notify you of any significant changes by email or through a notice on the OpenChat website or app.

+ +

9. Contact Us

+

If you have any questions, concerns, or requests regarding this Privacy Policy or the processing of your personal information, please contact us at contact@openchat.com.

+ +

Last Updated: [Date]

+ +

Note: This privacy policy template is provided as a general guide. Depending on the specific nature of your product and jurisdiction, you may need to tailor the policy to meet your unique requirements and comply with applicable laws and regulations. It is always recommended to seek legal advice to ensure compliance.

+
+ +
+

+ Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat auctor urna nunc id cursus metus aliquam eleifend, arcu dictum varius duis at consectetur lorem donec massa sapien, sed risus ultricies tristique nulla aliquet. Morbi tristique senectus et netus et, nibh nisl condimentum id venenatis a condimentum vitae sapien. +

+
+ +
+
+
+ + +
+
+
+ + +
+ +
+ + +
+

Build your own ChatGPT for free!

+
+ + + + +
+ +
+ +
+ +
+
+ +
+@endsection + +@section('scripts') +@endsection diff --git a/backend-server/resources/views/marketing/signin.blade.php b/backend-server/resources/views/marketing/signin.blade.php new file mode 100644 index 00000000..bd6f0c71 --- /dev/null +++ b/backend-server/resources/views/marketing/signin.blade.php @@ -0,0 +1,83 @@ +@extends('marketing.layout.app', ['title' => __('Dashboard')]) +@section('content') + + +
+ +
+
+
+ + +
+

Login.

+
+ + +
+ +
+
+
+ +
+
+
+
+ +
Or
+ +
+
+ @csrf +
+
+ + +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+ Don’t you have an account? Sign up +
+
+ +
+
+
+ +
+ +@endsection + +@section('scripts') +@endsection diff --git a/backend-server/resources/views/marketing/signup.blade.php b/backend-server/resources/views/marketing/signup.blade.php new file mode 100644 index 00000000..2b069539 --- /dev/null +++ b/backend-server/resources/views/marketing/signup.blade.php @@ -0,0 +1,80 @@ +@extends('marketing.layout.app', ['title' => __('Dashboard')]) +@section('content') + + +
+ +
+
+
+ + +
+

Register.

+
+ + +
+ +
+
+
+ +
+
+
+
+ +
Or
+ +
+
+ @csrf +
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ +
+
+
+ By creating an account, you agree to our privacy policy. +
+
+ +
+ Already using Simple? Sign in +
+
+ +
+
+
+ +
+ +@endsection + +@section('scripts') +@endsection diff --git a/backend-server/resources/views/onboarding/other-data-sources-pdf.blade.php b/backend-server/resources/views/onboarding/other-data-sources-pdf.blade.php new file mode 100644 index 00000000..e07b993d --- /dev/null +++ b/backend-server/resources/views/onboarding/other-data-sources-pdf.blade.php @@ -0,0 +1,189 @@ +@extends('layout.app', ['title' => __('Dashboard')]) +@section('content') + + +
+ + + + + +
+
+ +

Upload PDF files as sources ✨

+ + @if ($errors->has('pdffiles')) +
+
+
+
+ + + +
+
+
+ +
+
+
+ @endif +
+ @csrf +
+ +
+
+
+ ⬆️ +
+

Click to upload or drag & drop + +

+ + you can upload up to 5 pdf files, and we will process the first ±100k words +
+ + + +
+ +
+ +
+ +
+
+
Make sure that your files are scannable (text not images) 🫶 +
+
+ You can upload multiple files at once and we will process them in the background. +
+
+
+
+
+ <- + Back + +
+
+ +
+
+
+ +@endsection + +@section('scripts') + + +@endsection diff --git a/backend-server/resources/views/onboarding/other-data-sources-website.blade.php b/backend-server/resources/views/onboarding/other-data-sources-website.blade.php new file mode 100644 index 00000000..bdd67404 --- /dev/null +++ b/backend-server/resources/views/onboarding/other-data-sources-website.blade.php @@ -0,0 +1,105 @@ +@extends('layout.app', ['title' => __('Dashboard')]) +@section('content') + + +
+ + + + + +
+
+ +

Website information ✨

+ + @if ($errors->has('website')) +
+
+
+
+ + + +
Please enter a valid website URL, it's important that your website is live and + accessible +
+
+ +
+
+
+ @endif +
+ @csrf +
+ +
+ + +
+ +
+
+
Just to make sure we are on the + same page 🫶 +
+
+ Sometimes, we might face challenges when trying to crawl certain websites, especially the ones built using JavaScript (Single-Page Applications). However, we're currently working on adding headless browsing to our system so that we can support all kinds of websites. +
+
+
+
+
+ <- + Back + +
+
+ +
+
+
+ +@endsection + +@section('scripts') + +@endsection diff --git a/backend-server/resources/views/onboarding/step-0.blade.php b/backend-server/resources/views/onboarding/step-0.blade.php new file mode 100644 index 00000000..387a7bef --- /dev/null +++ b/backend-server/resources/views/onboarding/step-0.blade.php @@ -0,0 +1,100 @@ +@extends('layout.app', ['title' => __('Dashboard')]) +@section('content') +
+ + + + + +
+
+
+ +
    +
  • + 1 +
  • +
  • + 2 +
  • +
  • + 3 +
  • +
  • + 4 +
  • +
+
+
+
+ +
+
+ +

Let's set up your first chatbot, for free 🔥

+

And here how we are going to do it:

+ +
+
+
    + +
  • +
    + + +

    You provide the system with data

    +
    +
    It could be a website, pdf files, and soon you will have the option to integrate with many more
    +
  • + +
  • +
    + + +

    We train our AI on this knowledge

    +
    +
    It might take minutes or hours, depend on how large is your data.
    +
  • + +
  • +
    + + +

    You integrate the chatbot on your website

    +
    +
    That is it! we will provide you with a Javascript code to put it on your website.
    +
  • + +
+
+ +
+ +
+
+ +
+ +@endsection + +@section('scripts') + +@endsection diff --git a/backend-server/resources/views/onboarding/step-1.blade.php b/backend-server/resources/views/onboarding/step-1.blade.php new file mode 100644 index 00000000..453b44d8 --- /dev/null +++ b/backend-server/resources/views/onboarding/step-1.blade.php @@ -0,0 +1,165 @@ +@extends('layout.app', ['title' => __('Dashboard')]) +@section('content') +
+ + + + + +
+
+
+ +
    +
  • + 1 +
  • +
  • + 2 +
  • +
  • + 3 +
  • +
  • + 4 +
  • +
+
+
+
+ +
+
+ +

Select your data source ✨

+

Select the source of your data to train your new chatbot, you can + always add new sources later

+ +
+ +
    +
  • + +
  • + +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • + +
  • + ... +
    + + Many others to come 🔥️ +
  • + +
+ +
+ +
+
+ +
+ +@endsection + +@section('scripts') + +@endsection diff --git a/backend-server/resources/views/onboarding/step-2-pdf.blade.php b/backend-server/resources/views/onboarding/step-2-pdf.blade.php new file mode 100644 index 00000000..2ae1c785 --- /dev/null +++ b/backend-server/resources/views/onboarding/step-2-pdf.blade.php @@ -0,0 +1,216 @@ +@extends('layout.app', ['title' => __('Dashboard')]) +@section('content') + + +
+ + + + +
+
+
+ +
    +
  • + 1 +
  • +
  • + 2 +
  • +
  • + 3 +
  • +
  • + 4 +
  • +
+
+
+
+ +
+
+ +

Upload PDF files as sources ✨

+ + @if ($errors->has('pdffiles')) +
+
+
+
+ + + +
+
+
+ +
+
+
+ @endif +
+ @csrf +
+ +
+
+
+ ⬆️ +
+

Click to upload or drag & drop + +

+ + you can upload up to 5 pdf files, and we will process the first ±100k words +
+ + + +
+ +
+ +
+ +
+
+
Make sure that your files are + scannable (text not images) 🫶 +
+
+ You can upload multiple files at once and we will process them in the background. +
+
+
+
+
+ <- + Back + +
+
+ +
+
+
+ +@endsection + +@section('scripts') + + +@endsection diff --git a/backend-server/resources/views/onboarding/step-2.blade.php b/backend-server/resources/views/onboarding/step-2.blade.php new file mode 100644 index 00000000..255285c3 --- /dev/null +++ b/backend-server/resources/views/onboarding/step-2.blade.php @@ -0,0 +1,106 @@ +@extends('layout.app', ['title' => __('Dashboard')]) +@section('content') +
+ + + + + +
+
+
+ +
    +
  • + 1 +
  • +
  • + 2 +
  • +
  • + 3 +
  • +
  • + 4 +
  • +
+
+
+
+ +
+
+ +

Website information ✨

+ + @if ($errors->has('website')) +
+
+
+
+ + + +
Please enter a valid website URL, it's important that your website is live and + accessible +
+
+ +
+
+
+ @endif +
+ @csrf +
+ +
+ + +
+ +
+
+
Just to make sure we are on the + same page 🫶 +
+
+ We might not be able to crawl some websites, epically websites that is built + using JS (SPA), we are working on adding headless browsing to support all + sort of websites. +
+
+
+
+
+ <- + Back + +
+
+ +
+
+ +
+ +@endsection + +@section('scripts') + +@endsection diff --git a/backend-server/resources/views/onboarding/step-3.blade.php b/backend-server/resources/views/onboarding/step-3.blade.php new file mode 100644 index 00000000..4a395074 --- /dev/null +++ b/backend-server/resources/views/onboarding/step-3.blade.php @@ -0,0 +1,113 @@ +@extends('layout.app', ['title' => __('Dashboard')]) +@section('content') +
+ + + + + +
+
+
+ +
    +
  • + 1 +
  • +
  • + 2 +
  • +
  • + 3 +
  • +
  • + 4 +
  • +
+
+
+
+ +
+
+ +

In the meanwhile, Let's do some configurations ✨

+ +
While we are crawling your website, you can do some + configurations on your chatbot +
+
+ +
+ @csrf +
+ + +

What type of character that chatbot must be?

+ +
Choose the preferred bot character, wise & + strict character will force the bot to only answer questions that has been seen before, + while the Knowledgeable makes the bot a bit more fixable and try to be creative with answers +
+ + +
+
+ + +
+
+
+
+ <- + Back + +
+
+ +
+
+ +
+ +@endsection + +@section('scripts') + +@endsection diff --git a/backend-server/resources/views/onboarding/step-4.blade.php b/backend-server/resources/views/onboarding/step-4.blade.php new file mode 100644 index 00000000..893b820f --- /dev/null +++ b/backend-server/resources/views/onboarding/step-4.blade.php @@ -0,0 +1,56 @@ +@extends('layout.app', ['title' => __('Dashboard')]) +@section('content') +
+ + + + + +
+
+
+ +
    +
  • + 1 +
  • +
  • + 2 +
  • +
  • + 3 +
  • +
  • + 4 +
  • +
+
+
+
+ +
+
+ +
+ + + + +

That is it! 🙌

+ Open your bot 🔥 -> +
+ +
+
+
+ +@endsection + +@section('scripts') + +@endsection diff --git a/backend-server/resources/views/settings-analytics.blade.php b/backend-server/resources/views/settings-analytics.blade.php new file mode 100644 index 00000000..4902e345 --- /dev/null +++ b/backend-server/resources/views/settings-analytics.blade.php @@ -0,0 +1,167 @@ +@extends('layout.app', ['title' => __('Dashboard')]) +@section('content') + +
+ + +
+ + +

{{$bot->getName()}}: analytics ✨

+ + +
+ +
+
+ + + @include('layout.sidebar-bot-page') + + +
+ + +
+ + +
+

Analytics

+
This is your general bot settings such as name and id
+
+ +
+ +
+
+ ⌛ +
+ Analytics is coming soon! +
+
+

Analytics

+
+
+
+ +
+
+
+
24.7K
+
+49%
+
+
Unique Visitors
+
+ +
+ +
+
+
+
56.9K
+
+7%
+
+
Total Pageviews
+
+ +
+ +
+
+
+
54%
+
-7%
+
+
Bounce Rate
+
+ +
+ +
+
+
+
2m 56s
+
+7%
+
+
Visit Duration
+
+
+
+
+ + +
+ + +
+
+ + + +
+ +
+ + + +
+ +
+
+ +
+@endsection + +@section('scripts') + +@endsection diff --git a/backend-server/resources/views/settings-data.blade.php b/backend-server/resources/views/settings-data.blade.php new file mode 100644 index 00000000..7eb2cf4f --- /dev/null +++ b/backend-server/resources/views/settings-data.blade.php @@ -0,0 +1,583 @@ +@extends('layout.app', ['title' => __('Dashboard')]) +@section('content') + + +
+ + +
+ + +

{{$bot->getName()}}: data sources ✨

+ +
+ +
+
+ + + @include('layout.sidebar-bot-page') + +
+ +
+
+

Data sources

+
Currently we only support web based sources, soon we will support Pdf, + Text and even videos! +
+ @php + /** @var \App\Models\WebsiteDataSource[] $websiteDataSources */ + @endphp + @foreach($websiteDataSources as $source) +
+ +
+
+ + + + + + + + + + + + + + + + + + +
+
+
+ User 01 +
+
+ website: + {{$source->getRootUrl()}} +
+
+
+
+ {{$source->getCrawledPages()->count()}} pages scanned +
+
+ + @if($source->getCrawlingStatus()->isPending()) +
+ {{$source->getCrawlingStatus()->getLabel()}} +
+ @elseif($source->getCrawlingStatus()->isInProgress()) +
+ {{$source->getCrawlingStatus()->getLabel()}} +
+ @elseif($source->getCrawlingStatus()->isCompleted()) +
+ {{$source->getCrawlingStatus()->getLabel()}} +
+ @elseif($source->getCrawlingStatus()->isFailed()) +
+ {{$source->getCrawlingStatus()->getLabel()}} +
+ @endif + +
+
+ + + +
Re-sync +
+ + + + soon +
+
+
+
+ + +
+ +
+
+
+
+ +
+ @endforeach + + +
+ @php + /** @var \App\Models\PdfDataSource[] $pdfDataSources */ + @endphp + @foreach($pdfDataSources as $source) +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+ User 01 +
+
+ Bulk Upload of Pdf files + +
+
+
+
+ {{count($source->getFiles())}} files scanned +
+
+ @if($source->getCreatedAt()->diffInMinutes(now()) <= 3) +
+ In progress (eta: {{$source->getCreatedAt()->addMinutes(3)->diffForHumans()}}) +
+ @else +
+ Completed +
+ @endif +
+
+ + + +
Re-sync +
+ + + + soon +
+
+
+
+ + +
+ +
+
+
+
+ +
+ @endforeach +
+
+
Want to add new sources? +
+ +
+ +
+ + + + + +
+ +
+ +
+
+ +
+ +
+ +
+ +
+
+ +
+@endsection + +@section('scripts') +@endsection diff --git a/backend-server/resources/views/settings-integrations.blade.php b/backend-server/resources/views/settings-integrations.blade.php new file mode 100644 index 00000000..98f24d5b --- /dev/null +++ b/backend-server/resources/views/settings-integrations.blade.php @@ -0,0 +1,450 @@ +@extends('layout.app', ['title' => __('Dashboard')]) +@section('content') + + +
+ + +
+ + +

{{$bot->getName()}}: data sources ✨

+ +
+ +
+
+ + + @include('layout.sidebar-bot-page') + +
+ + +
+

Integrations

+ + +
+ +
+ +
+
+ + +
+
+ +
+ +
+
+
+
+ + + +
+

MaterialStack

+
+
Lorem ipsum dolor sit amet eiusmod sed do eiusmod tempor.
+
+ +
+
+ +
+
+ + + +
4K+
+
+
+ + + +
4.7
+
+
+ + +
+
+
+
+ +
+ +
+
+
+
+ + + +
+

MaterialStack

+
+
Lorem ipsum dolor sit amet eiusmod sed do eiusmod tempor.
+
+ +
+
+ +
+
+ + + +
4K+
+
+
+ + + +
4.7
+
+
+ + +
+
+
+
+ +
+ +
+
+
+
+ + + +
+

MaterialStack

+
+
Lorem ipsum dolor sit amet eiusmod sed do eiusmod tempor.
+
+ +
+
+ +
+
+ + + +
4K+
+
+
+ + + +
4.7
+
+
+ + +
+
+
+
+ +
+ +
+
+
+
+ + + +
+

MaterialStack

+
+
Lorem ipsum dolor sit amet eiusmod sed do eiusmod tempor.
+
+ +
+
+ +
+
+ + + +
4K+
+
+
+ + + +
4.7
+
+
+ + +
+
+
+
+ +
+ +
+
+
+
+ + + +
+

MaterialStack

+
+
Lorem ipsum dolor sit amet eiusmod sed do eiusmod tempor.
+
+ +
+
+ +
+
+ + + +
4K+
+
+
+ + + +
4.7
+
+
+ + +
+
+
+
+ +
+ +
+
+
+
+ + + +
+

MaterialStack

+
+
Lorem ipsum dolor sit amet eiusmod sed do eiusmod tempor.
+
+ +
+
+ +
+
+ + + +
4K+
+
+
+ + + +
4.7
+
+
+ + +
+
+
+
+
+
+ + +
+

Trending Categories

+
+ +
+ +
+
+
+

Programming

+
+
+ + +
+
+ +
+ +
+
+
+

Digital Marketing

+
+
+ + +
+
+ +
+ +
+
+
+

Music & Audio

+
+
+ + +
+
+
+
+
+ +
+ +
+
+ +
+@endsection + +@section('scripts') +@endsection diff --git a/backend-server/resources/views/settings-theme.blade.php b/backend-server/resources/views/settings-theme.blade.php new file mode 100644 index 00000000..80a1bdbf --- /dev/null +++ b/backend-server/resources/views/settings-theme.blade.php @@ -0,0 +1,176 @@ +@extends('layout.app', ['title' => __('Dashboard')]) +@section('content') + + + +
+ + +
+ + +

{{$bot->getName()}}: try & share ✨

+ +
+ +
+
+ + + @include('layout.sidebar-bot-page') + + +
+
+ +
+
+
+ +
+

Try & Share!

+
Here you can try and play with your bot, also you can share it or embed it in your web apps
+ + + + +
+ +
+
+ +
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+
+ + + +
+ +
+ + +
+ + +
+ + + + +
+ +
+
+
+ +
+
+ +
+@endsection + +@section('scripts') + + + + +@endsection diff --git a/backend-server/resources/views/settings.blade.php b/backend-server/resources/views/settings.blade.php new file mode 100644 index 00000000..291c539b --- /dev/null +++ b/backend-server/resources/views/settings.blade.php @@ -0,0 +1,142 @@ +@extends('layout.app', ['title' => __('Dashboard')]) +@section('content') + +
+ + +
+ + +

{{$bot->getName()}}: general settings✨

+ +
+ +
+
+ + + @include('layout.sidebar-bot-page') + + +
+
+ @if ($errors->any()) +
+
+
+
+ + + +
+ + @foreach($errors->all() as $error) +

- {{ $error }}

+ @endforeach +
+
+ +
+
+
+ @endif + @csrf + +
+ + +
+

General Settings

+
This is your general bot settings such as name and id
+
+
+ + +
+
+ + +
+
+
+ +
+ + +
+
+
+ +
+
+
+ +
+ +
+ +
+
+ +
+@endsection + +@section('scripts') +@endsection diff --git a/backend-server/resources/views/widgets/data-sources-updates.blade.php b/backend-server/resources/views/widgets/data-sources-updates.blade.php new file mode 100644 index 00000000..57b37ea7 --- /dev/null +++ b/backend-server/resources/views/widgets/data-sources-updates.blade.php @@ -0,0 +1,102 @@ + +@php + /** + * @var \App\Models\WebsiteDataSource[] $dataSources + */ +@endphp +@foreach($dataSources as $source) + @if(!$source->getCrawlingStatus()->isCompleted()) +
+
+ +
+ +
+ +
+
+ + + +
+
+ + @if($source->getCrawlingStatus()->isPending() || $source->getCrawlingStatus()->isInProgress()) +
+
{{$source->getCrawlingProgress()}} + % ⌛ +
+
We are still crawling your + website and your chatbot will be ready once we + are done (and we will email you too), click + here to open all data sources. +
+
+ @endif + + @if($source->getCrawlingStatus()->isFailed()) +
+
+
We are unable to crawl your + website please make sure that your website is + online and accessible. +
+
+ @endif + +
+
+ +
+
+ + @endif + + @if($source->getCrawlingStatus()->isCompleted() && $source->getCreatedAt()->diffInMinutes(now()) <= 3) + + @endif + +@endforeach diff --git a/backend-server/routes/api.php b/backend-server/routes/api.php new file mode 100644 index 00000000..889937e1 --- /dev/null +++ b/backend-server/routes/api.php @@ -0,0 +1,19 @@ +get('/user', function (Request $request) { + return $request->user(); +}); diff --git a/backend-server/routes/channels.php b/backend-server/routes/channels.php new file mode 100644 index 00000000..5d451e1f --- /dev/null +++ b/backend-server/routes/channels.php @@ -0,0 +1,18 @@ +id === (int) $id; +}); diff --git a/backend-server/routes/console.php b/backend-server/routes/console.php new file mode 100644 index 00000000..e05f4c9a --- /dev/null +++ b/backend-server/routes/console.php @@ -0,0 +1,19 @@ +comment(Inspiring::quote()); +})->purpose('Display an inspiring quote'); diff --git a/backend-server/routes/web.php b/backend-server/routes/web.php new file mode 100644 index 00000000..bdee698d --- /dev/null +++ b/backend-server/routes/web.php @@ -0,0 +1,74 @@ +group(function () { + + /** + * Dashboard + */ + Route::get('/', [ChatbotController::class, 'index'])->name('index'); + + + /** + * Chatbot Settings + */ + Route::get('/app/{id}', [ChatbotSettingController::class, 'generalSettings'])->name('chatbot.settings'); + Route::post('/app/{id}', [ChatbotSettingController::class, 'generalSettingsUpdate'])->name('chatbot.settings.update'); + Route::get('/app/{id}/try-and-share', [ChatbotSettingController::class, 'themeSettings'])->name('chatbot.settings-theme'); + Route::get('/app/{id}/data', [ChatbotSettingController::class, 'dataSettings'])->name('chatbot.settings-data'); + Route::get('/app/{id}/analytics', [ChatbotSettingController::class, 'analyticsSettings'])->name('chatbot.settings-analytics'); + Route::get('/app/{id}/integrations', [ChatbotSettingController::class, 'integrationsSettings'])->name('chatbot.settings-integrations'); + Route::get('widget/data-sources-updates/{id}', [ChatbotSettingController::class, 'dataSourcesUpdates'])->name('widget.data-sources-updates'); + + + /** + * Onboarding Frontend + */ + Route::get('/onboarding/welcome', [OnboardingController::class, 'welcome'])->name('onboarding.welcome'); + Route::get('/onboarding/data-source', [OnboardingController::class, 'dataSources'])->name('onboarding.data-source'); + Route::get('/onboarding/website', [OnboardingController::class, 'dataSourcesWebsite'])->name('onboarding.website'); + Route::get('/onboarding/pdf', [OnboardingController::class, 'dataSourcesPdf'])->name('onboarding.pdf'); + + + /** + * Onboarding Backend + */ + Route::post('/onboarding/website', [ChatbotController::class, 'createViaWebsiteFlow'])->name('onboarding.website.create'); + Route::post('/onboarding/pdf', [ChatbotController::class, 'createViaPdfFlow'])->name('onboarding.pdf.create'); + Route::post('/onboarding/{id}/config', [ChatbotController::class, 'updateCharacterSettings'])->name('onboarding.config.create'); + Route::get('/onboarding/{id}/config', [OnboardingController::class, 'config'])->name('onboarding.config'); + + Route::get('/app/{id}/data/pdf', [PdfDataSourceController::class, 'show'])->name('onboarding.other-data-sources-pdf'); + Route::post('/app/{id}/data/pdf', [PdfDataSourceController::class, 'create'])->name('onboarding.other-data-sources-pdf.create'); + + Route::get('/app/{id}/data/web', [WebsiteDataSourceController::class, 'show'])->name('onboarding.other-data-sources-web'); + Route::post('/app/{id}/data/web', [WebsiteDataSourceController::class, 'create'])->name('onboarding.other-data-sources-web.create'); + + Route::get('/onboarding/{id}/done', [OnboardingController::class, 'done'])->name('onboarding.done'); + +}); + +Route::get('/chat/{token}', [ChatbotController::class, 'getChatView'])->name('chat')->withoutMiddleware([FrameGuard::class])->middleware([IframeMiddleware::class]); +Route::post('/chat/{token}/send-message', [ChatbotController::class, 'sendMessage'])->name('sendMessage'); diff --git a/backend-server/storage/app/.gitignore b/backend-server/storage/app/.gitignore new file mode 100644 index 00000000..8f4803c0 --- /dev/null +++ b/backend-server/storage/app/.gitignore @@ -0,0 +1,3 @@ +* +!public/ +!.gitignore diff --git a/backend-server/storage/app/public/.gitignore b/backend-server/storage/app/public/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/backend-server/storage/app/public/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/backend-server/storage/framework/.gitignore b/backend-server/storage/framework/.gitignore new file mode 100644 index 00000000..05c4471f --- /dev/null +++ b/backend-server/storage/framework/.gitignore @@ -0,0 +1,9 @@ +compiled.php +config.php +down +events.scanned.php +maintenance.php +routes.php +routes.scanned.php +schedule-* +services.json diff --git a/backend-server/storage/framework/cache/.gitignore b/backend-server/storage/framework/cache/.gitignore new file mode 100644 index 00000000..01e4a6cd --- /dev/null +++ b/backend-server/storage/framework/cache/.gitignore @@ -0,0 +1,3 @@ +* +!data/ +!.gitignore diff --git a/backend-server/storage/framework/cache/data/.gitignore b/backend-server/storage/framework/cache/data/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/backend-server/storage/framework/cache/data/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/backend-server/storage/framework/sessions/.gitignore b/backend-server/storage/framework/sessions/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/backend-server/storage/framework/sessions/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/backend-server/storage/framework/testing/.gitignore b/backend-server/storage/framework/testing/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/backend-server/storage/framework/testing/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/backend-server/storage/framework/views/.gitignore b/backend-server/storage/framework/views/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/backend-server/storage/framework/views/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/backend-server/storage/logs/.gitignore b/backend-server/storage/logs/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/backend-server/storage/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/backend-server/tests/CreatesApplication.php b/backend-server/tests/CreatesApplication.php new file mode 100644 index 00000000..cc683011 --- /dev/null +++ b/backend-server/tests/CreatesApplication.php @@ -0,0 +1,21 @@ +make(Kernel::class)->bootstrap(); + + return $app; + } +} diff --git a/backend-server/tests/Feature/ExampleTest.php b/backend-server/tests/Feature/ExampleTest.php new file mode 100644 index 00000000..8364a84e --- /dev/null +++ b/backend-server/tests/Feature/ExampleTest.php @@ -0,0 +1,19 @@ +get('/'); + + $response->assertStatus(200); + } +} diff --git a/backend-server/tests/TestCase.php b/backend-server/tests/TestCase.php new file mode 100644 index 00000000..2932d4a6 --- /dev/null +++ b/backend-server/tests/TestCase.php @@ -0,0 +1,10 @@ +assertTrue(true); + } +} diff --git a/backend-server/vite.config.js b/backend-server/vite.config.js new file mode 100644 index 00000000..421b5695 --- /dev/null +++ b/backend-server/vite.config.js @@ -0,0 +1,11 @@ +import { defineConfig } from 'vite'; +import laravel from 'laravel-vite-plugin'; + +export default defineConfig({ + plugins: [ + laravel({ + input: ['resources/css/app.css', 'resources/js/app.js'], + refresh: true, + }), + ], +}); diff --git a/common.env b/common.env new file mode 100644 index 00000000..f5e1ffcf --- /dev/null +++ b/common.env @@ -0,0 +1,4 @@ +OPENAI_API_KEY= +PINECONE_API_KEY= +PINECONE_ENVIRONMENT= +PINECONE_INDEX_NAME= \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..1b64e03e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,67 @@ +version: '3' +services: + backend-server: + restart: unless-stopped + build: + context: ./backend-server + dockerfile: Dockerfile + ports: + - "8000:8000" + depends_on: + - llm-server + - mysql + - redis + environment: + - REDIS_HOST=redis + - DB_HOST=mysql + - DB_PORT=3306 + - DB_DATABASE=openchat + - DB_USERNAME=dbuser + - DB_PASSWORD=dbpass + volumes: + - shared_data:/app/shared_data + networks: + - openchat_network + + llm-server: + restart: unless-stopped + build: + context: ./llm-server + dockerfile: Dockerfile + volumes: + - shared_data:/app/shared_data + networks: + - openchat_network + + mysql: + restart: unless-stopped + platform: linux/x86_64 + image: "mysql:5.7" + ports: + - "3307:3306" + command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci + environment: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: openchat + MYSQL_USER: dbuser + MYSQL_PASSWORD: dbpass + volumes: + - database:/var/lib/mysql + networks: + - openchat_network + + redis: + restart: unless-stopped + image: "redis:3.2" + ports: + - "6379:6379" + networks: + - openchat_network + + +networks: + openchat_network: + +volumes: + shared_data: + database: \ No newline at end of file diff --git a/llm-server/.eslintrc.json b/llm-server/.eslintrc.json new file mode 100644 index 00000000..bffb357a --- /dev/null +++ b/llm-server/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/llm-server/.gitignore b/llm-server/.gitignore new file mode 100644 index 00000000..1759b24f --- /dev/null +++ b/llm-server/.gitignore @@ -0,0 +1,40 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +.env*.local +.env + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +#Notion_db +/Notion_DB diff --git a/llm-server/.prettierrc b/llm-server/.prettierrc new file mode 100644 index 00000000..0238bf0f --- /dev/null +++ b/llm-server/.prettierrc @@ -0,0 +1,6 @@ +{ + "trailingComma": "all", + "singleQuote": true, + "printWidth": 80, + "tabWidth": 2 +} diff --git a/llm-server/Dockerfile b/llm-server/Dockerfile new file mode 100644 index 00000000..0be9e9c7 --- /dev/null +++ b/llm-server/Dockerfile @@ -0,0 +1,26 @@ +# Use an official Node.js runtime as the base image +FROM node:18 + +# Set the working directory +WORKDIR /usr/src/app + +# Copy package.json and yarn.lock +COPY package*.json yarn.lock ./ + +COPY .env .env + +# Install dependencies +RUN yarn install + +# Copy the project files to the container +COPY . . + +# Expose the container's port (if required by the app) + +# Start the app +CMD [ "npm", "run", "dev" ] + + + + + diff --git a/llm-server/config/pinecone.ts b/llm-server/config/pinecone.ts new file mode 100644 index 00000000..596845ed --- /dev/null +++ b/llm-server/config/pinecone.ts @@ -0,0 +1,13 @@ +/** + * Change the namespace to the namespace on Pinecone you'd like to store your embeddings. + */ + +if (!process.env.PINECONE_INDEX_NAME) { + throw new Error('Missing Pinecone index name in .env file'); +} + +const PINECONE_INDEX_NAME = process.env.PINECONE_INDEX_NAME ?? ''; + +const PINECONE_NAME_SPACE = 'bot-test'; //namespace is optional for your vectors + +export { PINECONE_INDEX_NAME, PINECONE_NAME_SPACE }; diff --git a/llm-server/declarations/pdf-parse.d.ts b/llm-server/declarations/pdf-parse.d.ts new file mode 100644 index 00000000..5b2ab502 --- /dev/null +++ b/llm-server/declarations/pdf-parse.d.ts @@ -0,0 +1,5 @@ +declare module 'pdf-parse/lib/pdf-parse.js' { + import pdf from 'pdf-parse'; + + export default pdf; +} diff --git a/llm-server/next.config.js b/llm-server/next.config.js new file mode 100644 index 00000000..edb615be --- /dev/null +++ b/llm-server/next.config.js @@ -0,0 +1,11 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactStrictMode: true, + swcMinify: true, + webpack(config) { + config.experiments = { ...config.experiments, topLevelAwait: true }; + return config; + }, +}; + +export default nextConfig; diff --git a/llm-server/package.json b/llm-server/package.json new file mode 100644 index 00000000..15e69615 --- /dev/null +++ b/llm-server/package.json @@ -0,0 +1,58 @@ +{ + "name": "openchat-llm-server", + "version": "0.0.1", + "private": true, + "license": "MIT", + "author": "First verison written by Mayooear & modifed by Openchat Team", + "type": "module", + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "type-check": "tsc --noEmit", + "lint": "eslint --ignore-path ../backend-server/.gitignore \\\"**/*.+(ts|js|tsx)\\\"", + "format": "prettier --ignore-path ../backend-server/.gitignore \\\"**/*.+(ts|js|tsx)\\\" --write", + "ingest": "tsx -r dotenv/config scripts/ingest-data.ts" + }, + "dependencies": { + "@aws-sdk/client-s3": "^3.332.0", + "@microsoft/fetch-event-source": "^2.0.1", + "@pinecone-database/pinecone": "0.0.12", + "@radix-ui/react-accordion": "^1.1.1", + "axios": "^1.4.0", + "clsx": "^1.2.1", + "dotenv": "^16.0.3", + "langchain": "0.0.55", + "lucide-react": "^0.125.0", + "next": "13.2.3", + "pdf-parse": "1.1.1", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-markdown": "^8.0.5", + "tailwind-merge": "^1.10.0" + }, + "devDependencies": { + "@types/node": "^18.14.6", + "@types/react": "^18.0.28", + "@types/react-dom": "^18.0.11", + "@typescript-eslint/parser": "^5.54.0", + "autoprefixer": "^10.4.13", + "eslint": "8.35.0", + "eslint-config-next": "13.2.3", + "postcss": "^8.4.21", + "prettier": "^2.8.4", + "tailwindcss": "^3.2.7", + "tsx": "^3.12.3", + "typescript": "^4.9.5" + }, + "engines": { + "node": ">=18" + }, + "keywords": [ + "pinecone", + "gpt4", + "langchain", + "pdf", + "openai" + ] +} diff --git a/llm-server/pages/api/chat.ts b/llm-server/pages/api/chat.ts new file mode 100644 index 00000000..f52d2734 --- /dev/null +++ b/llm-server/pages/api/chat.ts @@ -0,0 +1,55 @@ +import type { NextApiRequest, NextApiResponse } from 'next'; +import { OpenAIEmbeddings } from 'langchain/embeddings/openai'; +import { PineconeStore } from 'langchain/vectorstores/pinecone'; +import { makeChain } from '@/utils/makechain'; +import { pinecone } from '@/utils/pinecone-client'; +import { PINECONE_INDEX_NAME, PINECONE_NAME_SPACE } from '@/config/pinecone'; + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse, +) { + const { question, history, namespace } = req.body; + + console.log('question', question); + + //only accept post requests + if (req.method !== 'POST') { + res.status(405).json({ error: 'Method not allowed' }); + return; + } + + if (!question) { + return res.status(400).json({ message: 'No question in the request' }); + } + // OpenAI recommends replacing newlines with spaces for best results + const sanitizedQuestion = question.trim().replaceAll('\n', ' '); + + try { + const index = pinecone.Index(PINECONE_INDEX_NAME); + + /* create vectorstore*/ + const vectorStore = await PineconeStore.fromExistingIndex( + new OpenAIEmbeddings({}), + { + pineconeIndex: index, + textKey: 'text', + namespace: namespace, //namespace comes from your config folder + }, + ); + + //create chain + const chain = makeChain(vectorStore); + //Ask a question using chat history + const response = await chain.call({ + question: sanitizedQuestion, + chat_history: history || [], + }); + + console.log('response', response); + res.status(200).json(response); + } catch (error: any) { + console.log('error', error); + res.status(500).json({ error: error.message || 'Something went wrong' }); + } +} diff --git a/llm-server/pages/api/ingest.ts b/llm-server/pages/api/ingest.ts new file mode 100644 index 00000000..7c20aaa8 --- /dev/null +++ b/llm-server/pages/api/ingest.ts @@ -0,0 +1,77 @@ +import type {NextApiRequest, NextApiResponse} from 'next'; +import {OpenAIEmbeddings} from 'langchain/embeddings/openai'; +import {PineconeStore} from 'langchain/vectorstores/pinecone'; +import {pinecone} from '@/utils/pinecone-client'; +import {PINECONE_INDEX_NAME, PINECONE_NAME_SPACE} from '@/config/pinecone'; +import {DirectoryLoader} from 'langchain/document_loaders/fs/directory'; +import {CustomPDFLoader} from '@/utils/customPDFLoader'; +import {RecursiveCharacterTextSplitter} from 'langchain/text_splitter'; +import {TextLoader} from 'langchain/document_loaders'; + + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + try { + const {type} = req.body; + + if (req.method !== 'POST') { + return res.status(405).json({error: 'Method not allowed'}); + } + + if (!type) { + return res.status(400).json({message: 'No type in the request'}); + } + + if (type !== 'pdf' && type !== 'website') { + return res.status(400).json({message: 'Type not supported'}); + } + + var directoryLoader; + var namespace = PINECONE_NAME_SPACE; + + if (type === 'pdf') { + const {shared_folder} = req.body; + namespace = req.body.namespace; + + directoryLoader = new DirectoryLoader("/app/shared_data/" + shared_folder, { + '.pdf': (path: string | Blob) => new CustomPDFLoader(path), + }); + } else if (type === 'website') { + const {shared_folder} = req.body; + namespace = req.body.namespace; + + directoryLoader = new DirectoryLoader("/app/shared_data/" + shared_folder, { + '.txt': (path: any) => new TextLoader(path), + }); + } else { + return res.status(400).json({message: 'Not supported type'}); + } + + // const loader = new PDFLoader(filePath); + const rawDocs = await directoryLoader.load(); + + /* Split text into chunks */ + const textSplitter = new RecursiveCharacterTextSplitter({ + chunkSize: 1000, chunkOverlap: 200, + }); + + const docs = await textSplitter.splitDocuments(rawDocs); + console.log('split docs', docs); + + console.log('creating vector store...'); + /*create and store the embeddings in the vectorStore*/ + const embeddings = new OpenAIEmbeddings(); + const index = pinecone.Index(PINECONE_INDEX_NAME); // change to your own index name + + // Embed the documents + await PineconeStore.fromDocuments(docs, embeddings, { + pineconeIndex: index, namespace: namespace, textKey: 'text', + }); + console.log('Done...'); + return res.status(200).json({message: 'Success'}); + } catch (e) { + console.error(e); + // Return error message and line number + // @ts-ignore + res.status(500).json({error: e.message, line: e.lineNumber}); + } +} diff --git a/llm-server/postcss.config.cjs b/llm-server/postcss.config.cjs new file mode 100644 index 00000000..12a703d9 --- /dev/null +++ b/llm-server/postcss.config.cjs @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/llm-server/tailwind.config.cjs b/llm-server/tailwind.config.cjs new file mode 100644 index 00000000..00efc5d5 --- /dev/null +++ b/llm-server/tailwind.config.cjs @@ -0,0 +1,11 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + './app/**/*.{js,ts,jsx,tsx}', + './pages/**/*.{js,ts,jsx,tsx}', + './components/**/*.{js,ts,jsx,tsx}', + ], + theme: { + extend: {}, + }, +}; diff --git a/llm-server/tsconfig.json b/llm-server/tsconfig.json new file mode 100644 index 00000000..537ecafc --- /dev/null +++ b/llm-server/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "es2020", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "baseUrl": ".", + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/llm-server/types/chat.ts b/llm-server/types/chat.ts new file mode 100644 index 00000000..f1a8fa63 --- /dev/null +++ b/llm-server/types/chat.ts @@ -0,0 +1,8 @@ +import { Document } from 'langchain/document'; + +export type Message = { + type: 'apiMessage' | 'userMessage'; + message: string; + isStreaming?: boolean; + sourceDocs?: Document[]; +}; diff --git a/llm-server/utils/cn.ts b/llm-server/utils/cn.ts new file mode 100644 index 00000000..e57f9802 --- /dev/null +++ b/llm-server/utils/cn.ts @@ -0,0 +1,6 @@ +import { ClassValue, clsx } from 'clsx'; +import { twMerge } from 'tailwind-merge'; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/llm-server/utils/customPDFLoader.ts b/llm-server/utils/customPDFLoader.ts new file mode 100644 index 00000000..dba71148 --- /dev/null +++ b/llm-server/utils/customPDFLoader.ts @@ -0,0 +1,61 @@ +import { Document } from 'langchain/document'; +import { readFile } from 'fs/promises'; +import { BaseDocumentLoader } from 'langchain/document_loaders'; + +export abstract class BufferLoader extends BaseDocumentLoader { + constructor(public filePathOrBlob: string | Blob) { + super(); + } + + protected abstract parse( + raw: Buffer, + metadata: Document['metadata'], + ): Promise; + + public async load(): Promise { + let buffer: Buffer; + let metadata: Record; + if (typeof this.filePathOrBlob === 'string') { + buffer = await readFile(this.filePathOrBlob); + metadata = { source: this.filePathOrBlob }; + } else { + buffer = await this.filePathOrBlob + .arrayBuffer() + .then((ab) => Buffer.from(ab)); + metadata = { source: 'blob', blobType: this.filePathOrBlob.type }; + } + return this.parse(buffer, metadata); + } +} + +export class CustomPDFLoader extends BufferLoader { + public async parse( + raw: Buffer, + metadata: Document['metadata'], + ): Promise { + const { pdf } = await PDFLoaderImports(); + const parsed = await pdf(raw); + return [ + new Document({ + pageContent: parsed.text, + metadata: { + ...metadata, + pdf_numpages: parsed.numpages, + }, + }), + ]; + } +} + +async function PDFLoaderImports() { + try { + // the main entrypoint has some debug code that we don't want to import + const { default: pdf } = await import('pdf-parse/lib/pdf-parse.js'); + return { pdf }; + } catch (e) { + console.error(e); + throw new Error( + 'Failed to load pdf-parse. Please install it with eg. `npm install pdf-parse`.', + ); + } +} diff --git a/llm-server/utils/makechain.ts b/llm-server/utils/makechain.ts new file mode 100644 index 00000000..b83192f3 --- /dev/null +++ b/llm-server/utils/makechain.ts @@ -0,0 +1,37 @@ +import { OpenAI } from 'langchain/llms/openai'; +import { PineconeStore } from 'langchain/vectorstores/pinecone'; +import { ConversationalRetrievalQAChain } from 'langchain/chains'; + +const CONDENSE_PROMPT = `Given the following conversation and a follow up question, rephrase the follow up question to be a standalone question. + +Chat History: +{chat_history} +Follow Up Input: {question} +Standalone question:`; + +const QA_PROMPT = `You are a helpful AI customer support agent. Use the following pieces of context to answer the question at the end. +If you don't know the answer, just say you don't know. DO NOT try to make up an answer. +If the question is not related to the context, politely respond that you are tuned to only answer questions that are related to the context. + +{context} + +Question: {question} +Helpful answer in markdown:`; + +export const makeChain = (vectorstore: PineconeStore) => { + const model = new OpenAI({ + temperature: 0, // increase temepreature to get more creative answers + modelName: 'gpt-3.5-turbo', //change this to gpt-4 if you have access + }); + + const chain = ConversationalRetrievalQAChain.fromLLM( + model, + vectorstore.asRetriever(), + { + qaTemplate: QA_PROMPT, + questionGeneratorTemplate: CONDENSE_PROMPT, + returnSourceDocuments: true, //The number of source documents returned is 4 by default + }, + ); + return chain; +}; diff --git a/llm-server/utils/pinecone-client.ts b/llm-server/utils/pinecone-client.ts new file mode 100644 index 00000000..c8499003 --- /dev/null +++ b/llm-server/utils/pinecone-client.ts @@ -0,0 +1,23 @@ +import { PineconeClient } from '@pinecone-database/pinecone'; + +if (!process.env.PINECONE_ENVIRONMENT || !process.env.PINECONE_API_KEY) { + throw new Error('Pinecone environment or api key vars missing'); +} + +async function initPinecone() { + try { + const pinecone = new PineconeClient(); + + await pinecone.init({ + environment: process.env.PINECONE_ENVIRONMENT ?? '', //this is in the dashboard + apiKey: process.env.PINECONE_API_KEY ?? '', + }); + + return pinecone; + } catch (error) { + console.log('error', error); + throw new Error('Failed to initialize Pinecone Client'); + } +} + +export const pinecone = await initPinecone(); diff --git a/llm-server/yarn.lock b/llm-server/yarn.lock new file mode 100644 index 00000000..ea47c42f --- /dev/null +++ b/llm-server/yarn.lock @@ -0,0 +1,4540 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@anthropic-ai/sdk@^0.4.3": + version "0.4.3" + resolved "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.4.3.tgz" + integrity sha512-SZrlXvjUUYT9rPmSzlTtmVk1OjVNpkCzILRluhiYwNcxXfQyvPJDi0CI6PyymygcgtqEF5EVqhKmC/PtPsNEIw== + dependencies: + "@fortaine/fetch-event-source" "^3.0.6" + cross-fetch "^3.1.5" + +"@aws-crypto/crc32@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-3.0.0.tgz#07300eca214409c33e3ff769cd5697b57fdd38fa" + integrity sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA== + dependencies: + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + tslib "^1.11.1" + +"@aws-crypto/crc32c@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz#016c92da559ef638a84a245eecb75c3e97cb664f" + integrity sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w== + dependencies: + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + tslib "^1.11.1" + +"@aws-crypto/ie11-detection@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz#640ae66b4ec3395cee6a8e94ebcd9f80c24cd688" + integrity sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q== + dependencies: + tslib "^1.11.1" + +"@aws-crypto/sha1-browser@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz#f9083c00782b24714f528b1a1fef2174002266a3" + integrity sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw== + dependencies: + "@aws-crypto/ie11-detection" "^3.0.0" + "@aws-crypto/supports-web-crypto" "^3.0.0" + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-crypto/sha256-browser@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz#05f160138ab893f1c6ba5be57cfd108f05827766" + integrity sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ== + dependencies: + "@aws-crypto/ie11-detection" "^3.0.0" + "@aws-crypto/sha256-js" "^3.0.0" + "@aws-crypto/supports-web-crypto" "^3.0.0" + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-crypto/sha256-js@3.0.0", "@aws-crypto/sha256-js@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz#f06b84d550d25521e60d2a0e2a90139341e007c2" + integrity sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ== + dependencies: + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + tslib "^1.11.1" + +"@aws-crypto/supports-web-crypto@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz#5d1bf825afa8072af2717c3e455f35cda0103ec2" + integrity sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg== + dependencies: + tslib "^1.11.1" + +"@aws-crypto/util@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-3.0.0.tgz#1c7ca90c29293f0883468ad48117937f0fe5bfb0" + integrity sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w== + dependencies: + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-sdk/abort-controller@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.329.0.tgz#f311f79cad1040b84b853c5e9386ea2e069e571a" + integrity sha512-hzrjPNQcJoSPe0oS20V5i98oiEZSM3mKNiR6P3xHTHTPI/F23lyjGZ+/CSkCmJbSWfGZ5sHZZcU6AWuS7xBdTw== + dependencies: + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/chunked-blob-reader@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.310.0.tgz#2ada1b024a2745c2fe7e869606fab781325f981e" + integrity sha512-CrJS3exo4mWaLnWxfCH+w88Ou0IcAZSIkk4QbmxiHl/5Dq705OLoxf4385MVyExpqpeVJYOYQ2WaD8i/pQZ2fg== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/client-s3@^3.332.0": + version "3.332.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.332.0.tgz#99488145424265e87e55cbc740f3bed8751116ed" + integrity sha512-4AkbBPGjFkIvN15l9uDHcry3kwMknpl0b7mqFaNQqQJR2OyFJnr7US/KyeTjwijJAuU+f7lKz8QMTtBcghJm3w== + dependencies: + "@aws-crypto/sha1-browser" "3.0.0" + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/client-sts" "3.332.0" + "@aws-sdk/config-resolver" "3.329.0" + "@aws-sdk/credential-provider-node" "3.332.0" + "@aws-sdk/eventstream-serde-browser" "3.329.0" + "@aws-sdk/eventstream-serde-config-resolver" "3.329.0" + "@aws-sdk/eventstream-serde-node" "3.329.0" + "@aws-sdk/fetch-http-handler" "3.329.0" + "@aws-sdk/hash-blob-browser" "3.329.0" + "@aws-sdk/hash-node" "3.329.0" + "@aws-sdk/hash-stream-node" "3.329.0" + "@aws-sdk/invalid-dependency" "3.329.0" + "@aws-sdk/md5-js" "3.329.0" + "@aws-sdk/middleware-bucket-endpoint" "3.329.0" + "@aws-sdk/middleware-content-length" "3.329.0" + "@aws-sdk/middleware-endpoint" "3.329.0" + "@aws-sdk/middleware-expect-continue" "3.329.0" + "@aws-sdk/middleware-flexible-checksums" "3.331.0" + "@aws-sdk/middleware-host-header" "3.329.0" + "@aws-sdk/middleware-location-constraint" "3.329.0" + "@aws-sdk/middleware-logger" "3.329.0" + "@aws-sdk/middleware-recursion-detection" "3.329.0" + "@aws-sdk/middleware-retry" "3.329.0" + "@aws-sdk/middleware-sdk-s3" "3.329.0" + "@aws-sdk/middleware-serde" "3.329.0" + "@aws-sdk/middleware-signing" "3.329.0" + "@aws-sdk/middleware-ssec" "3.329.0" + "@aws-sdk/middleware-stack" "3.329.0" + "@aws-sdk/middleware-user-agent" "3.332.0" + "@aws-sdk/node-config-provider" "3.329.0" + "@aws-sdk/node-http-handler" "3.329.0" + "@aws-sdk/protocol-http" "3.329.0" + "@aws-sdk/signature-v4-multi-region" "3.329.0" + "@aws-sdk/smithy-client" "3.329.0" + "@aws-sdk/types" "3.329.0" + "@aws-sdk/url-parser" "3.329.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-body-length-browser" "3.310.0" + "@aws-sdk/util-body-length-node" "3.310.0" + "@aws-sdk/util-defaults-mode-browser" "3.329.0" + "@aws-sdk/util-defaults-mode-node" "3.329.0" + "@aws-sdk/util-endpoints" "3.332.0" + "@aws-sdk/util-retry" "3.329.0" + "@aws-sdk/util-stream-browser" "3.329.0" + "@aws-sdk/util-stream-node" "3.331.0" + "@aws-sdk/util-user-agent-browser" "3.329.0" + "@aws-sdk/util-user-agent-node" "3.329.0" + "@aws-sdk/util-utf8" "3.310.0" + "@aws-sdk/util-waiter" "3.329.0" + "@aws-sdk/xml-builder" "3.310.0" + fast-xml-parser "4.1.2" + tslib "^2.5.0" + +"@aws-sdk/client-sso-oidc@3.332.0": + version "3.332.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.332.0.tgz#8875ce4834d5d0decefadec828e32cbc0465fc30" + integrity sha512-tz8k8Yqm4TScIfit0Tum2zWAq1md+gZKr747CSixd4Zwcp7Vwh75cRoL7Rz1ZHSEn1Yo983MWREevVez3SubLw== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/config-resolver" "3.329.0" + "@aws-sdk/fetch-http-handler" "3.329.0" + "@aws-sdk/hash-node" "3.329.0" + "@aws-sdk/invalid-dependency" "3.329.0" + "@aws-sdk/middleware-content-length" "3.329.0" + "@aws-sdk/middleware-endpoint" "3.329.0" + "@aws-sdk/middleware-host-header" "3.329.0" + "@aws-sdk/middleware-logger" "3.329.0" + "@aws-sdk/middleware-recursion-detection" "3.329.0" + "@aws-sdk/middleware-retry" "3.329.0" + "@aws-sdk/middleware-serde" "3.329.0" + "@aws-sdk/middleware-stack" "3.329.0" + "@aws-sdk/middleware-user-agent" "3.332.0" + "@aws-sdk/node-config-provider" "3.329.0" + "@aws-sdk/node-http-handler" "3.329.0" + "@aws-sdk/protocol-http" "3.329.0" + "@aws-sdk/smithy-client" "3.329.0" + "@aws-sdk/types" "3.329.0" + "@aws-sdk/url-parser" "3.329.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-body-length-browser" "3.310.0" + "@aws-sdk/util-body-length-node" "3.310.0" + "@aws-sdk/util-defaults-mode-browser" "3.329.0" + "@aws-sdk/util-defaults-mode-node" "3.329.0" + "@aws-sdk/util-endpoints" "3.332.0" + "@aws-sdk/util-retry" "3.329.0" + "@aws-sdk/util-user-agent-browser" "3.329.0" + "@aws-sdk/util-user-agent-node" "3.329.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/client-sso@3.332.0": + version "3.332.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.332.0.tgz#e22fa9ded125cce75ca2cd63d3f3f9a6b8dfaa77" + integrity sha512-4q1Nko8M6YVANdEiLYvdv1qb00j4xN4ppE/6d4xpGp7DxHYlm0GA762h0/TR2dun+2I+SMnwj4Fv6BxOmzBaEw== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/config-resolver" "3.329.0" + "@aws-sdk/fetch-http-handler" "3.329.0" + "@aws-sdk/hash-node" "3.329.0" + "@aws-sdk/invalid-dependency" "3.329.0" + "@aws-sdk/middleware-content-length" "3.329.0" + "@aws-sdk/middleware-endpoint" "3.329.0" + "@aws-sdk/middleware-host-header" "3.329.0" + "@aws-sdk/middleware-logger" "3.329.0" + "@aws-sdk/middleware-recursion-detection" "3.329.0" + "@aws-sdk/middleware-retry" "3.329.0" + "@aws-sdk/middleware-serde" "3.329.0" + "@aws-sdk/middleware-stack" "3.329.0" + "@aws-sdk/middleware-user-agent" "3.332.0" + "@aws-sdk/node-config-provider" "3.329.0" + "@aws-sdk/node-http-handler" "3.329.0" + "@aws-sdk/protocol-http" "3.329.0" + "@aws-sdk/smithy-client" "3.329.0" + "@aws-sdk/types" "3.329.0" + "@aws-sdk/url-parser" "3.329.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-body-length-browser" "3.310.0" + "@aws-sdk/util-body-length-node" "3.310.0" + "@aws-sdk/util-defaults-mode-browser" "3.329.0" + "@aws-sdk/util-defaults-mode-node" "3.329.0" + "@aws-sdk/util-endpoints" "3.332.0" + "@aws-sdk/util-retry" "3.329.0" + "@aws-sdk/util-user-agent-browser" "3.329.0" + "@aws-sdk/util-user-agent-node" "3.329.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/client-sts@3.332.0": + version "3.332.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.332.0.tgz#15bb163319d3da69f152f80fb4583eabe73e0e30" + integrity sha512-uVobnXIzMcEhwBDyk6iOt36N/TRNI8hwq7MQugjYGj7Inma9g4vnR09hXJ24HxyKCoVUoIgMbEguQ43+/+uvDQ== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/config-resolver" "3.329.0" + "@aws-sdk/credential-provider-node" "3.332.0" + "@aws-sdk/fetch-http-handler" "3.329.0" + "@aws-sdk/hash-node" "3.329.0" + "@aws-sdk/invalid-dependency" "3.329.0" + "@aws-sdk/middleware-content-length" "3.329.0" + "@aws-sdk/middleware-endpoint" "3.329.0" + "@aws-sdk/middleware-host-header" "3.329.0" + "@aws-sdk/middleware-logger" "3.329.0" + "@aws-sdk/middleware-recursion-detection" "3.329.0" + "@aws-sdk/middleware-retry" "3.329.0" + "@aws-sdk/middleware-sdk-sts" "3.329.0" + "@aws-sdk/middleware-serde" "3.329.0" + "@aws-sdk/middleware-signing" "3.329.0" + "@aws-sdk/middleware-stack" "3.329.0" + "@aws-sdk/middleware-user-agent" "3.332.0" + "@aws-sdk/node-config-provider" "3.329.0" + "@aws-sdk/node-http-handler" "3.329.0" + "@aws-sdk/protocol-http" "3.329.0" + "@aws-sdk/smithy-client" "3.329.0" + "@aws-sdk/types" "3.329.0" + "@aws-sdk/url-parser" "3.329.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-body-length-browser" "3.310.0" + "@aws-sdk/util-body-length-node" "3.310.0" + "@aws-sdk/util-defaults-mode-browser" "3.329.0" + "@aws-sdk/util-defaults-mode-node" "3.329.0" + "@aws-sdk/util-endpoints" "3.332.0" + "@aws-sdk/util-retry" "3.329.0" + "@aws-sdk/util-user-agent-browser" "3.329.0" + "@aws-sdk/util-user-agent-node" "3.329.0" + "@aws-sdk/util-utf8" "3.310.0" + fast-xml-parser "4.1.2" + tslib "^2.5.0" + +"@aws-sdk/config-resolver@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.329.0.tgz#f4283c9c8e61752cecad8cfaebb4db52ac1bbf60" + integrity sha512-Oj6eiT3q+Jn685yvUrfRi8PhB3fb81hasJqdrsEivA8IP8qAgnVUTJzXsh8O2UX8UM2MF6A1gTgToSgneJuw2Q== + dependencies: + "@aws-sdk/types" "3.329.0" + "@aws-sdk/util-config-provider" "3.310.0" + "@aws-sdk/util-middleware" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-env@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.329.0.tgz#54bb313de01324e302b5927733083a4c93ed9962" + integrity sha512-B4orC9hMt9hG82vAR0TAnQqjk6cFDbO2S14RdzUj2n2NPlGWW4Blkv3NTo86K0lq011VRhtqaLcuTwn5EJD5Sg== + dependencies: + "@aws-sdk/property-provider" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-imds@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.329.0.tgz#566b21c37f5e89730ef3b4229f0824b4c455f669" + integrity sha512-ggPlnd7QROPTid0CwT01TYYGvstRRTpzTGsQ/B31wkh30IrRXE81W3S4xrOYuqQD3u0RnflSxnvhs+EayJEYjg== + dependencies: + "@aws-sdk/node-config-provider" "3.329.0" + "@aws-sdk/property-provider" "3.329.0" + "@aws-sdk/types" "3.329.0" + "@aws-sdk/url-parser" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-ini@3.332.0": + version "3.332.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.332.0.tgz#03c77480a94d07784c789eeca44ca67c0900ba4a" + integrity sha512-DTW6d6rcqizPVyvcIrwvxecQ7e5GONtVc5Wyf0RTfqf41sDOVZYmn6G+zEFSpBLW0975uZbJS0lyLWtJe2VujQ== + dependencies: + "@aws-sdk/credential-provider-env" "3.329.0" + "@aws-sdk/credential-provider-imds" "3.329.0" + "@aws-sdk/credential-provider-process" "3.329.0" + "@aws-sdk/credential-provider-sso" "3.332.0" + "@aws-sdk/credential-provider-web-identity" "3.329.0" + "@aws-sdk/property-provider" "3.329.0" + "@aws-sdk/shared-ini-file-loader" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-node@3.332.0": + version "3.332.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.332.0.tgz#bfd4fa8855dd3cf80f1e0d8d160966441e44c4a7" + integrity sha512-KkBayS9k4WyJTvC86ngeRM+RmWxNCS1BHvudkR6PLXfnsNPDzxySDVY0UgxVhbNYDYsO561fXZt9ccpKyVWjgg== + dependencies: + "@aws-sdk/credential-provider-env" "3.329.0" + "@aws-sdk/credential-provider-imds" "3.329.0" + "@aws-sdk/credential-provider-ini" "3.332.0" + "@aws-sdk/credential-provider-process" "3.329.0" + "@aws-sdk/credential-provider-sso" "3.332.0" + "@aws-sdk/credential-provider-web-identity" "3.329.0" + "@aws-sdk/property-provider" "3.329.0" + "@aws-sdk/shared-ini-file-loader" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-process@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.329.0.tgz#5c07b2f4c67cb97190c69d4af5890c9db3f8a31d" + integrity sha512-5oO220qoFc2pMdZDQa6XN/mVhp669I3+LqMbbscGtX/UgLJPSOb7YzPld9Wjv12L5rf+sD3G1PF3LZXO0vKLFA== + dependencies: + "@aws-sdk/property-provider" "3.329.0" + "@aws-sdk/shared-ini-file-loader" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-sso@3.332.0": + version "3.332.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.332.0.tgz#ed12b58d30b6ee359462c7e78672734af22fe713" + integrity sha512-SaKXl48af3n6LRitcaEqbeg1YDXwQ0A5QziC1xQyYPraEIj3IZ/GyTjx04Lo2jxNYHuEOE8u4aTw1+IK1GDKbg== + dependencies: + "@aws-sdk/client-sso" "3.332.0" + "@aws-sdk/property-provider" "3.329.0" + "@aws-sdk/shared-ini-file-loader" "3.329.0" + "@aws-sdk/token-providers" "3.332.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-web-identity@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.329.0.tgz#5610293c03bc4c323dfcae522c545c20e2d8dd86" + integrity sha512-lcEibZD7AlutCacpQ6DyNUqElZJDq+ylaIo5a8MH9jGh7Pg2WpDg0Sy+B6FbGCkVn4eIjdHxeX54JM245nhESg== + dependencies: + "@aws-sdk/property-provider" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/eventstream-codec@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-codec/-/eventstream-codec-3.329.0.tgz#6bdfd69ad54352309535f53352017e932b9f643b" + integrity sha512-1r+6MNfye0za35FNLxMR5V9zpKY1lyzwySyu7o7aj8lnStBaCcjOEe7iHboP/z3DH73KJbxR++O2N+UC/XHFrg== + dependencies: + "@aws-crypto/crc32" "3.0.0" + "@aws-sdk/types" "3.329.0" + "@aws-sdk/util-hex-encoding" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/eventstream-serde-browser@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.329.0.tgz#3ba7866a691905e2af8a89c1f562f91fb3779ef9" + integrity sha512-oWFSn4o6sxlbFF0AIuDJYf7N0fkiOyWvYgRW3VTX9FSbd66f/KnDspdxIasaDPDUzJl5YRMwUvQbPWw8y9ZQfQ== + dependencies: + "@aws-sdk/eventstream-serde-universal" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/eventstream-serde-config-resolver@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.329.0.tgz#8498747fa40c8cf159181da043fd9b0ae949deb7" + integrity sha512-iQguqvTtxWXAIniaWmmAO0Qy8080fqnS309p9jbYzz7KaT90sNSCX+CxGFHPy5F0QY36uklDdHn1d1fwWTZciA== + dependencies: + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/eventstream-serde-node@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.329.0.tgz#8faf03049bde8772cf75c3831a78df160bbb6ad3" + integrity sha512-+DFia0wdZiHpdOKjBcl1baZjtzPKf4U4MvOpsUpC6CeW1kSy0hoikKzJstNvRb1qxrTSamElT4gKkMHxxVhPBQ== + dependencies: + "@aws-sdk/eventstream-serde-universal" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/eventstream-serde-universal@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.329.0.tgz#c4e4bd786c8e111db8636e76f343c1c08a076c07" + integrity sha512-n9UzW6HKAhVD5wuz3FMC1ew3VI/vUvRSPXGUpKReMiR2z+YyjmuW8UM4nn7q6i7A/I4QHBt1TC/ax/J2yupgPg== + dependencies: + "@aws-sdk/eventstream-codec" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/fetch-http-handler@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.329.0.tgz#5aee0c9a32ad8ff4fa96c6869bba68c345818532" + integrity sha512-9jfIeJhYCcTX4ScXOueRTB3S/tVce0bRsKxKDP0PnTxnGYOwKXoM9lAPmiYItzYmQ/+QzjTI8xfkA9Usz2SK/Q== + dependencies: + "@aws-sdk/protocol-http" "3.329.0" + "@aws-sdk/querystring-builder" "3.329.0" + "@aws-sdk/types" "3.329.0" + "@aws-sdk/util-base64" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/hash-blob-browser@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.329.0.tgz#a90a73998dd017b80952743a3901d5036e142506" + integrity sha512-F5HwXYYSpJtUJqmCRKbz/xwDdOyxKpu69TlfsliECLvAQiQGMh2GO1wGm7grolgTROVVqLYRKk2TSJl/WBg1pw== + dependencies: + "@aws-sdk/chunked-blob-reader" "3.310.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/hash-node@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.329.0.tgz#91ef8b1b55e1a438c367f63747673bf146a00499" + integrity sha512-6RmnWXNWpi7yAs0oRDQlkMn2wfXOStr/8kTCgiAiqrk1KopGSBkC2veKiKRSfv02FTd1yV/ISqYNIRqW1VLyxg== + dependencies: + "@aws-sdk/types" "3.329.0" + "@aws-sdk/util-buffer-from" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/hash-stream-node@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-stream-node/-/hash-stream-node-3.329.0.tgz#137b2bc825a7435514b30a89299b68f33c6e7e9b" + integrity sha512-blSZcb/hJyw3c1bH2Hc1aRoRgruNhRK/qc2svq5kXQFW+qBI5O4fwJayKSdo62/Wh2ejR/N06teYQ9haQLVJEA== + dependencies: + "@aws-sdk/types" "3.329.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/invalid-dependency@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.329.0.tgz#83dc33de710f80eba5e084a82aab656c1d240352" + integrity sha512-UXynGusDxN/HxLma5ByJ7u+XnuMd47NbHOjJgYsaAjb1CVZT7hEPXOB+mcZ+Ku7To5SCOKu2QbRn7m4bGespBg== + dependencies: + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/is-array-buffer@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/is-array-buffer/-/is-array-buffer-3.310.0.tgz#f87a79f1b858c88744f07e8d8d0a791df204017e" + integrity sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/md5-js@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/md5-js/-/md5-js-3.329.0.tgz#25a6b417ecba04ed4e6b299ad5db0e5ab59c9603" + integrity sha512-newSeHd+CO2hNmXhQOrUk5Y1hH7BsJ5J4IldcqHKY93UwWqvQNiepRowSa2bV5EuS1qx3kfXhD66PFNRprrIlQ== + dependencies: + "@aws-sdk/types" "3.329.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-bucket-endpoint@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.329.0.tgz#cae414055e1ff7e2f724f7da2feabb93ffffc3a7" + integrity sha512-h3/JdK+FmJ/nxLcd8QciJYLy0B4QRsYqqxSffXJ7DYlDjEhUgvVpfGdVgAYHrTtOP8rHSG/K7l7iY7QqTaZpuw== + dependencies: + "@aws-sdk/protocol-http" "3.329.0" + "@aws-sdk/types" "3.329.0" + "@aws-sdk/util-arn-parser" "3.310.0" + "@aws-sdk/util-config-provider" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-content-length@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.329.0.tgz#cadd0c3ba7fe3d0b21812523bb7d7f7526c9c700" + integrity sha512-7kCd+CvY/4KbyXB0uyL7jCwPjMi2yERMALFdEH9dsUciwmxIQT6eSc4aF6wImC4UrbafaqmXvvHErABKMVBTKA== + dependencies: + "@aws-sdk/protocol-http" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-endpoint@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.329.0.tgz#50c5f71afa3b6d3062d3b542279009454898314e" + integrity sha512-hdJRoNdCM0BT4W+rrtee+kfFRgGPGXQDgtbIQlf/FuuuYz2sdef7/SYWr0mxuncnVBW5WkYSPP8h6q07whSKbg== + dependencies: + "@aws-sdk/middleware-serde" "3.329.0" + "@aws-sdk/types" "3.329.0" + "@aws-sdk/url-parser" "3.329.0" + "@aws-sdk/util-middleware" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-expect-continue@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.329.0.tgz#2a69584020b9c93926b83735fbd9741de117a586" + integrity sha512-E/Jp2KijdR/BwF4s899xcSN4/bbHqYznwmBRL5PiHI+HImA6aZ11qTP8kPt5U5p0l2j5iTmW3FpMnByQKJP5Dw== + dependencies: + "@aws-sdk/protocol-http" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-flexible-checksums@3.331.0": + version "3.331.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.331.0.tgz#41878726e7b2da175bfb5b5eb688123c7fb7cce3" + integrity sha512-rdRa4yvyqSQ/HDCh4p1Glv8Y/uRNuIwmOG4nDuL6/GYK1BQdpUpbgrhsszPormku10SnbAdsaWGmVhy3qlUSCQ== + dependencies: + "@aws-crypto/crc32" "3.0.0" + "@aws-crypto/crc32c" "3.0.0" + "@aws-sdk/is-array-buffer" "3.310.0" + "@aws-sdk/protocol-http" "3.329.0" + "@aws-sdk/types" "3.329.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-host-header@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.329.0.tgz#22b1a6d91f3f281ef802f21f2ab0b426526d6066" + integrity sha512-JrHeUdTIpTCfXDo9JpbAbZTS1x4mt63CCytJRq0mpWp+FlP9hjckBcNxWdR/wSKEzP9pDRnTri638BOwWH7O8w== + dependencies: + "@aws-sdk/protocol-http" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-location-constraint@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.329.0.tgz#8f6e21c2eee990579e3ac06bdbb8b89f2cde49a4" + integrity sha512-iUTkyXyhchqoEPkdMZSkHhRQmXe0El1+r9oOw8y9JN6IY0T1bnaqUlerGXzb/tQUeENk9OXYuvDHExegHjEWug== + dependencies: + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-logger@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.329.0.tgz#fa8adc07928da24e713e384d4a32c8d0e36f96ee" + integrity sha512-lKeeTXsYC1NiwmxrXsZepcwNXPoQxTNNbeD1qaCELPGK2cJlrGoeAP2YRWzpwO2kNZWrDLaGAPT/EUEhqw+d1w== + dependencies: + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-recursion-detection@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.329.0.tgz#afa676f26f9a050cd3d57a2efa2b0247a6e1d614" + integrity sha512-0/TYOJwrj1Z8s+Y7thibD23hggBq/K/01NwPk32CwWG/G+1vWozs5DefknEl++w0vuV+39pkY4KHI8m/+wOCpg== + dependencies: + "@aws-sdk/protocol-http" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-retry@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.329.0.tgz#326fb0b7442d665689d311fba43eb49a510d2939" + integrity sha512-cB3D7GlhHUcHGOlygOYxD9cPhwsTYEAMcohK38An8+RHNp6VQEWezzLFCmHVKUSeCQ+wkjZfPA40jOG0rbjSgQ== + dependencies: + "@aws-sdk/protocol-http" "3.329.0" + "@aws-sdk/service-error-classification" "3.329.0" + "@aws-sdk/types" "3.329.0" + "@aws-sdk/util-middleware" "3.329.0" + "@aws-sdk/util-retry" "3.329.0" + tslib "^2.5.0" + uuid "^8.3.2" + +"@aws-sdk/middleware-sdk-s3@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.329.0.tgz#e5b99d7a9074a069c5f75afdce0b91c8b9855112" + integrity sha512-Uo8dLXLDpOb3BnLVl0mkTPiVXlNzNGOXOVtpihvYhF2Z+hGFJW1Ro3aUDbVEsFHu753r2Lss4dLiq1fzREeBKA== + dependencies: + "@aws-sdk/protocol-http" "3.329.0" + "@aws-sdk/types" "3.329.0" + "@aws-sdk/util-arn-parser" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-sdk-sts@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.329.0.tgz#50056cca7688e708e3db6bd66203878bc373ff7d" + integrity sha512-bqtZuhkH8pANb2Gb4FEM1p27o+BoDBmVhEWm8sWH+APsyOor3jc6eUG2GxkfoO6D5tGNIuyCC/GuvW9XDIe4Kg== + dependencies: + "@aws-sdk/middleware-signing" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-serde@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.329.0.tgz#f822d7419953ba5d31104262724034340908dd28" + integrity sha512-tvM9NdPuRPCozPjTGNOeYZeLlyx3BcEyajrkRorCRf1YzG/mXdB6I1stote7i4q1doFtYTz0sYL8bqW3LUPn9A== + dependencies: + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-signing@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.329.0.tgz#25011abb0911c1a23840d8d228676758f5b55926" + integrity sha512-bL1nI+EUcF5B1ipwDXxiKL+Uw02Mbt/TNX54PbzunBGZIyO6DZG/H+M3U296bYbvPlwlZhp26O830g6K7VEWsA== + dependencies: + "@aws-sdk/property-provider" "3.329.0" + "@aws-sdk/protocol-http" "3.329.0" + "@aws-sdk/signature-v4" "3.329.0" + "@aws-sdk/types" "3.329.0" + "@aws-sdk/util-middleware" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-ssec@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.329.0.tgz#c5bef2aca924c694e0ce03e8d1676b6d1885c0d4" + integrity sha512-XtDA/P2Sf79scu4a7tG77QC3VLtAGq/pit73x+qwctnI4gBgZlQ+FpE15d89ulntd7rIaD4v6tVU0bAg/L3PIQ== + dependencies: + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-stack@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.329.0.tgz#745150a190cc025d0bd7a52c0db5580c05dbbb54" + integrity sha512-2huFLhJ45td2nuiIOjpc9JKJbFNn5CYmw9U8YDITTcydpteRN62CzCpeqroDvF89VOLWxh0ZFtuLCGUr7liSWQ== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/middleware-user-agent@3.332.0": + version "3.332.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.332.0.tgz#6f2de9579b09dd7feeab27ef8a18c236694ad903" + integrity sha512-rSL1xP4QmcMOsunN1p5ZDR9GT3vvoSCnYa4iPvMSjP8Jx7l4ff/aVctwfZkMs/up12+68Jqwj4TvtaCvCFXdUA== + dependencies: + "@aws-sdk/protocol-http" "3.329.0" + "@aws-sdk/types" "3.329.0" + "@aws-sdk/util-endpoints" "3.332.0" + tslib "^2.5.0" + +"@aws-sdk/node-config-provider@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.329.0.tgz#32666077565924354a2216a5343ee768d3107eea" + integrity sha512-hg9rGNlkzh8aeR/sQbijrkFx2BIO53j4Z6qDxPNWwSGpl05jri1VHxHx2HZMwgbY6Zy/DSguETN/BL8vdFqyLg== + dependencies: + "@aws-sdk/property-provider" "3.329.0" + "@aws-sdk/shared-ini-file-loader" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/node-http-handler@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.329.0.tgz#6dc721e6a9df7baebefd145295ef1a8bf1000a51" + integrity sha512-OrjaHjU2ZTPfoHa5DruRvTIbeHH/cc0wvh4ml+FwDpWaPaBpOhLiluhZ3anqX1l5QjrXNiQnL8FxSM5OV/zVCA== + dependencies: + "@aws-sdk/abort-controller" "3.329.0" + "@aws-sdk/protocol-http" "3.329.0" + "@aws-sdk/querystring-builder" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/property-provider@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.329.0.tgz#069dda84e132c9d4eca1a4ae37c62f7a650a0046" + integrity sha512-1cHLTV6yyMGaMSWWDW/p4vTkJ1cc5BOEO+A0eHuAcoSOk+LDe9IKhUG3/ZOvvYKQYcqIj5jjGSni/noXNCl/qw== + dependencies: + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/protocol-http@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.329.0.tgz#a8a7e01477831961f5f040fe607c3552f9ccb013" + integrity sha512-0rLEHY6QTHTUUcVxzGbPUSmCKlXWplxT/fcYRh0bcc5MBK4naKfcQft1O6Ajp8uqs/9YPZ7XCVCn90pDeJfeaw== + dependencies: + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/querystring-builder@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.329.0.tgz#c6e6dd03dcd4378d1fbee576ce2a81dd94ac46a6" + integrity sha512-UWgMKkS5trliaDJG4nPv3onu8Y0aBuwRo7RdIgggguOiU8pU6pq1I113nH2FBNWy+Me1bwf+bcviJh0pCo6bEg== + dependencies: + "@aws-sdk/types" "3.329.0" + "@aws-sdk/util-uri-escape" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/querystring-parser@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.329.0.tgz#dbbf2fd23ff0dfa2e4663fa414de1d5e60814896" + integrity sha512-9mkK+FB7snJ2G7H3CqtprDwYIRhzm6jEezffCwUWrC+lbqHBbErbhE9IeU/MKxILmf0RbC2riXEY1MHGspjRrQ== + dependencies: + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/service-error-classification@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.329.0.tgz#32db59091ff28f14e526cee738bc14e32a6850f6" + integrity sha512-TSNr0flOcCLe71aPp7MjblKNGsmxpTU4xR5772MDX9Cz9GUTNZCPFtvrcqd+wzEPP/AC7XwNXe8KjoXooZImUQ== + +"@aws-sdk/shared-ini-file-loader@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.329.0.tgz#190eb922860d49b4259b20ca6df4d20769544802" + integrity sha512-e0hyd75fbjMd4aCoRwpP2/HR+0oScwogErVArIkq3F42c/hyNCQP3sph4JImuXIjuo6HNnpKpf20CEPPhNna8A== + dependencies: + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/signature-v4-multi-region@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.329.0.tgz#6ccf1255358a49c1393e6f7c8cd43800827eb37e" + integrity sha512-SiK1ez8Ns61ulDm0MJsTOSGNJNOMNoPgfA9i+Uu/VMCBkotZASuxrcSWW8seQnLEynWLerjUF9CYpCQuCqKn9w== + dependencies: + "@aws-sdk/protocol-http" "3.329.0" + "@aws-sdk/signature-v4" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/signature-v4@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.329.0.tgz#8d40683189678f49504169c923e8342247b1da70" + integrity sha512-9EnLoyOD5nFtCRAp+QRllDgQASCfY7jLHVhwht7jzwE80wE65Z9Ym5Z/mwTd4IyTz/xXfCvcE2VwClsBt0Ybdw== + dependencies: + "@aws-sdk/is-array-buffer" "3.310.0" + "@aws-sdk/types" "3.329.0" + "@aws-sdk/util-hex-encoding" "3.310.0" + "@aws-sdk/util-middleware" "3.329.0" + "@aws-sdk/util-uri-escape" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/smithy-client@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.329.0.tgz#54705963939855c87ae6e6c88196d23e819d728e" + integrity sha512-7E0fGpBKxwFqHHAOqNbgNsHSEmCZLuvmU9yvG9DXKVzrS4P48O/PfOro123WpcFZs3STyOVgH8wjUPftHAVKmg== + dependencies: + "@aws-sdk/middleware-stack" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/token-providers@3.332.0": + version "3.332.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.332.0.tgz#d014556ad93c0e43bb20237a3c5e85e9eed612a2" + integrity sha512-fccbg6OSl0l658pxl2p1MoU9gEePo5B361+JNaN0zfRMu7c5HBXCpdl4djlFxAHjltrX9f1+BKqfGHYgI3h8SQ== + dependencies: + "@aws-sdk/client-sso-oidc" "3.332.0" + "@aws-sdk/property-provider" "3.329.0" + "@aws-sdk/shared-ini-file-loader" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/types@3.329.0", "@aws-sdk/types@^3.222.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.329.0.tgz#bc20659abfcd666954196c3a24ad47785db80dd3" + integrity sha512-wFBW4yciDfzQBSFmWNaEvHShnSGLMxSu9Lls6EUf6xDMavxSB36bsrVRX6CyAo/W0NeIIyEOW1LclGPgJV1okg== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/url-parser@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.329.0.tgz#a2862834a832ec1d379791f5233e378b75fc63ad" + integrity sha512-/VcfL7vNJKJGSjYYHVQF3bYCDFs4fSzB7j5qeVDwRdWr870gE7O1Dar+sLWBRKFF3AX+4VzplqzUfpu9t44JVA== + dependencies: + "@aws-sdk/querystring-parser" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/util-arn-parser@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.310.0.tgz#861ff8810851be52a320ec9e4786f15b5fc74fba" + integrity sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/util-base64@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64/-/util-base64-3.310.0.tgz#d0fd49aff358c5a6e771d0001c63b1f97acbe34c" + integrity sha512-v3+HBKQvqgdzcbL+pFswlx5HQsd9L6ZTlyPVL2LS9nNXnCcR3XgGz9jRskikRUuUvUXtkSG1J88GAOnJ/apTPg== + dependencies: + "@aws-sdk/util-buffer-from" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/util-body-length-browser@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.310.0.tgz#3fca9d2f73c058edf1907e4a1d99a392fdd23eca" + integrity sha512-sxsC3lPBGfpHtNTUoGXMQXLwjmR0zVpx0rSvzTPAuoVILVsp5AU/w5FphNPxD5OVIjNbZv9KsKTuvNTiZjDp9g== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/util-body-length-node@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-node/-/util-body-length-node-3.310.0.tgz#4846ae72834ab0636f29f89fc1878520f6543fed" + integrity sha512-2tqGXdyKhyA6w4zz7UPoS8Ip+7sayOg9BwHNidiGm2ikbDxm1YrCfYXvCBdwaJxa4hJfRVz+aL9e+d3GqPI9pQ== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/util-buffer-from@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-buffer-from/-/util-buffer-from-3.310.0.tgz#7a72cb965984d3c6a7e256ae6cf1621f52e54a57" + integrity sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw== + dependencies: + "@aws-sdk/is-array-buffer" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/util-config-provider@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-config-provider/-/util-config-provider-3.310.0.tgz#ff21f73d4774cfd7bd16ae56f905828600dda95f" + integrity sha512-xIBaYo8dwiojCw8vnUcIL4Z5tyfb1v3yjqyJKJWV/dqKUFOOS0U591plmXbM+M/QkXyML3ypon1f8+BoaDExrg== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/util-defaults-mode-browser@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.329.0.tgz#49fc6836e85968ff86917c56c82fc9ef595c0565" + integrity sha512-2iSiy/pzX3OXMhtSxtAzOiEFr3viQEFnYOTeZuiheuyS+cea2L79F6SlZ1110b/nOIU/UOrxxtz83HVad8YFMQ== + dependencies: + "@aws-sdk/property-provider" "3.329.0" + "@aws-sdk/types" "3.329.0" + bowser "^2.11.0" + tslib "^2.5.0" + +"@aws-sdk/util-defaults-mode-node@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.329.0.tgz#2296652bcacd56c6abe159194aae283738a796b2" + integrity sha512-7A6C7YKjkZtmKtH29isYEtOCbhd7IcXPP8lftN8WAWlLOiZE4gV7PHveagUj7QserJzgRKGwwTQbBj53n18HYg== + dependencies: + "@aws-sdk/config-resolver" "3.329.0" + "@aws-sdk/credential-provider-imds" "3.329.0" + "@aws-sdk/node-config-provider" "3.329.0" + "@aws-sdk/property-provider" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/util-endpoints@3.332.0": + version "3.332.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.332.0.tgz#e360f65d240c97661988e20f15bb5bca160f773a" + integrity sha512-nQx7AiOroMU2hj6h+umWOSZ+WECwxupaxFUK/PPKGW6NY/VdQE6LluYnXOtF5awlr8w1nPksT0Lq05PZutMDLA== + dependencies: + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/util-hex-encoding@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.310.0.tgz#19294c78986c90ae33f04491487863dc1d33bd87" + integrity sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/util-locate-window@^3.0.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz#b071baf050301adee89051032bd4139bba32cc40" + integrity sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/util-middleware@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-middleware/-/util-middleware-3.329.0.tgz#0d4056c8479d80760778928e807ff74c57fcead3" + integrity sha512-RhBOBaxzkTUghi4MSqr8S5qeeBCjgJ0XPJ6jIYkVkj1saCmqkuZCgl3zFaYdyhdxxPV6nflkFer+1HUoqT+Fqw== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/util-retry@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-retry/-/util-retry-3.329.0.tgz#20b71504dd907e70a457cd56dcd131d08d6de39c" + integrity sha512-+3VQ9HZLinysnmryUs9Xjt1YVh4TYYHLt30ilu4iUnIHFQoamdzIbRCWseSVFPCxGroen9M9qmAleAsytHEKuA== + dependencies: + "@aws-sdk/service-error-classification" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/util-stream-browser@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-browser/-/util-stream-browser-3.329.0.tgz#a85d5f0fecc0817e0b6ff0721a6de774bd1b3890" + integrity sha512-UF1fJNfgrdJLMxn8ZlfPkYdv7hoLvVgSk3GHgxYA4OQs5zKCzeZgVrbxtE147LxWwJbxi3Qf04vnaEHwzVESpg== + dependencies: + "@aws-sdk/fetch-http-handler" "3.329.0" + "@aws-sdk/types" "3.329.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-hex-encoding" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/util-stream-node@3.331.0": + version "3.331.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-node/-/util-stream-node-3.331.0.tgz#3412a6cbf94085ef59827d248c8664449afb2e4f" + integrity sha512-5YUatdh4vgkv7VFY+lSkF+b+6EFkiHvy+dlucfGoJEOcEzuA/NBZYebWbcJ5TiR6z3cQdA23OTyZz3ZofZY1hw== + dependencies: + "@aws-sdk/node-http-handler" "3.329.0" + "@aws-sdk/types" "3.329.0" + "@aws-sdk/util-buffer-from" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/util-uri-escape@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-uri-escape/-/util-uri-escape-3.310.0.tgz#9f942f09a715d8278875013a416295746b6085ba" + integrity sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/util-user-agent-browser@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.329.0.tgz#6c3353a68f5d3d420156fabdcfab3bf4160f383b" + integrity sha512-8hLSmMCl8aw2++0Zuba8ELq8FkK6/VNyx470St201IpMn2GMbQMDl/rLolRKiTgji6wc+T3pOTidkJkz8/cIXA== + dependencies: + "@aws-sdk/types" "3.329.0" + bowser "^2.11.0" + tslib "^2.5.0" + +"@aws-sdk/util-user-agent-node@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.329.0.tgz#eb0930a1f3315fa6ea6f72e4007bbfce1202a3e5" + integrity sha512-C50Zaeodc0+psEP+L4WpElrH8epuLWJPVN4hDOTORcM0cSoU2o025Ost9mbcU7UdoHNxF9vitLnzORGN9SHolg== + dependencies: + "@aws-sdk/node-config-provider" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/util-utf8-browser@^3.0.0": + version "3.259.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" + integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-utf8@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8/-/util-utf8-3.310.0.tgz#4a7b9dcebb88e830d3811aeb21e9a6df4273afb4" + integrity sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA== + dependencies: + "@aws-sdk/util-buffer-from" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/util-waiter@3.329.0": + version "3.329.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-waiter/-/util-waiter-3.329.0.tgz#4e0d457548661e210cf716f8b18ff16a4dbd17c7" + integrity sha512-MIGs7snNL0ZV55zo1BDVPlrmbinUGV3260hp6HrW4zUbpYVoeIOGeewtrwAsF6FJ+vpZCxljPBB0X2jYR7Q7ZQ== + dependencies: + "@aws-sdk/abort-controller" "3.329.0" + "@aws-sdk/types" "3.329.0" + tslib "^2.5.0" + +"@aws-sdk/xml-builder@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.310.0.tgz#f0236f2103b438d16117e0939a6305ad69b7ff76" + integrity sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw== + dependencies: + tslib "^2.5.0" + +"@babel/runtime@^7.13.10", "@babel/runtime@^7.20.7": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz" + integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== + dependencies: + regenerator-runtime "^0.13.11" + +"@dqbd/tiktoken@^1.0.4": + version "1.0.6" + resolved "https://registry.npmjs.org/@dqbd/tiktoken/-/tiktoken-1.0.6.tgz" + integrity sha512-umSdeZTy/SbPPKVuZKV/XKyFPmXSN145CcM3iHjBbmhlohBJg7vaDp4cPCW+xNlWL6L2U1sp7T2BD+di2sUKdA== + +"@esbuild-kit/cjs-loader@^2.4.2": + version "2.4.2" + resolved "https://registry.npmjs.org/@esbuild-kit/cjs-loader/-/cjs-loader-2.4.2.tgz" + integrity sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg== + dependencies: + "@esbuild-kit/core-utils" "^3.0.0" + get-tsconfig "^4.4.0" + +"@esbuild-kit/core-utils@^3.0.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.1.0.tgz" + integrity sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw== + dependencies: + esbuild "~0.17.6" + source-map-support "^0.5.21" + +"@esbuild-kit/esm-loader@^2.5.5": + version "2.5.5" + resolved "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.5.5.tgz" + integrity sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw== + dependencies: + "@esbuild-kit/core-utils" "^3.0.0" + get-tsconfig "^4.4.0" + +"@esbuild/android-arm64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.16.tgz#7b18cab5f4d93e878306196eed26b6d960c12576" + integrity sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q== + +"@esbuild/android-arm@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.16.tgz#5c47f6a7c2cada6ed4b4d4e72d8c66e76d812812" + integrity sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw== + +"@esbuild/android-x64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.16.tgz#8686a6e98359071ffd5312046551943e7244c51a" + integrity sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow== + +"@esbuild/darwin-arm64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.16.tgz#aa79fbf447630ca0696a596beba962a775bbf394" + integrity sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA== + +"@esbuild/darwin-x64@0.17.16": + version "0.17.16" + resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.16.tgz" + integrity sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ== + +"@esbuild/freebsd-arm64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.16.tgz#b00b4cc8c2e424907cfe3a607384ab24794edd52" + integrity sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA== + +"@esbuild/freebsd-x64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.16.tgz#84af4430a07730b50bbc945a90cf7036c1853b76" + integrity sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g== + +"@esbuild/linux-arm64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.16.tgz#35571d15de6272c862d9ce6341372fb3cef0f266" + integrity sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA== + +"@esbuild/linux-arm@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.16.tgz#b65c7cd5b0eadd08f91aab66b9dda81b6a4b2a70" + integrity sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw== + +"@esbuild/linux-ia32@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.16.tgz#673a68cb251ce44a00a6422ada29064c5a1cd2c0" + integrity sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA== + +"@esbuild/linux-loong64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.16.tgz#477e2da34ab46ffdbf4740fa6441e80045249385" + integrity sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ== + +"@esbuild/linux-mips64el@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.16.tgz#e1e9687bbdaa831d7c34edc9278200982c1a4bf4" + integrity sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA== + +"@esbuild/linux-ppc64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.16.tgz#2f19075d63622987e86e83a4b7866cd57b796c60" + integrity sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q== + +"@esbuild/linux-riscv64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.16.tgz#bbf40a38f03ba2434fe69b5ceeec5d13c742b329" + integrity sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA== + +"@esbuild/linux-s390x@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.16.tgz#d2b8c0779ccd2b7917cdf0fab8831a468e0f9c01" + integrity sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw== + +"@esbuild/linux-x64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.16.tgz#da48b39cfdc1b12a74976625f583f031eac43590" + integrity sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g== + +"@esbuild/netbsd-x64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.16.tgz#ddef985aed37cc81908d2573b66c0299dbc49037" + integrity sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA== + +"@esbuild/openbsd-x64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.16.tgz#85035bf89efd66e9068bc72aa6bb85a2c317d090" + integrity sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew== + +"@esbuild/sunos-x64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.16.tgz#16338ecab854cb2d831cc9ee9cc21ef69566e1f3" + integrity sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag== + +"@esbuild/win32-arm64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.16.tgz#423f46bb744aff897a5f74435469e1ef4952e343" + integrity sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg== + +"@esbuild/win32-ia32@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.16.tgz#1978be5b192c7063bd2c8d5960eb213e1964740e" + integrity sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA== + +"@esbuild/win32-x64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.16.tgz#260f19b0a3300d22c3a3f52722c671dc561edaa3" + integrity sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg== + +"@eslint/eslintrc@^2.0.0": + version "2.0.2" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz" + integrity sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.5.1" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.35.0": + version "8.35.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz" + integrity sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw== + +"@fortaine/fetch-event-source@^3.0.6": + version "3.0.6" + resolved "https://registry.npmjs.org/@fortaine/fetch-event-source/-/fetch-event-source-3.0.6.tgz" + integrity sha512-621GAuLMvKtyZQ3IA6nlDWhV1V/7PGOTNIGLUifxt0KzM+dZIweJ6F3XvQF3QnqeNfS1N7WQ0Kil1Di/lhChEw== + +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@microsoft/fetch-event-source@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz" + integrity sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA== + +"@next/env@13.2.3": + version "13.2.3" + resolved "https://registry.npmjs.org/@next/env/-/env-13.2.3.tgz" + integrity sha512-FN50r/E+b8wuqyRjmGaqvqNDuWBWYWQiigfZ50KnSFH0f+AMQQyaZl+Zm2+CIpKk0fL9QxhLxOpTVA3xFHgFow== + +"@next/eslint-plugin-next@13.2.3": + version "13.2.3" + resolved "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.2.3.tgz" + integrity sha512-QmMPItnU7VeojI1KnuwL9SLFWEwmaNHNlnOGpoTwdLoSiP9sc8KYiAHWEc4/44L+cAdCxcZYvn7frcRNP5l84Q== + dependencies: + glob "7.1.7" + +"@next/swc-android-arm-eabi@13.2.3": + version "13.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.3.tgz#85eed560c87c7996558c868a117be9780778f192" + integrity sha512-mykdVaAXX/gm+eFO2kPeVjnOCKwanJ9mV2U0lsUGLrEdMUifPUjiXKc6qFAIs08PvmTMOLMNnUxqhGsJlWGKSw== + +"@next/swc-android-arm64@13.2.3": + version "13.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-13.2.3.tgz#8ac54ca9795a48afc4631b4823a4864bd5db0129" + integrity sha512-8XwHPpA12gdIFtope+n9xCtJZM3U4gH4vVTpUwJ2w1kfxFmCpwQ4xmeGSkR67uOg80yRMuF0h9V1ueo05sws5w== + +"@next/swc-darwin-arm64@13.2.3": + version "13.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.2.3.tgz#f674e3c65aec505b6d218a662ade3fe248ccdbda" + integrity sha512-TXOubiFdLpMfMtaRu1K5d1I9ipKbW5iS2BNbu8zJhoqrhk3Kp7aRKTxqFfWrbliAHhWVE/3fQZUYZOWSXVQi1w== + +"@next/swc-darwin-x64@13.2.3": + version "13.2.3" + resolved "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.2.3.tgz" + integrity sha512-GZctkN6bJbpjlFiS5pylgB2pifHvgkqLAPumJzxnxkf7kqNm6rOGuNjsROvOWVWXmKhrzQkREO/WPS2aWsr/yw== + +"@next/swc-freebsd-x64@13.2.3": + version "13.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.3.tgz#f7ac6ae4f7d706ff2431f33e40230a554c8c2cbc" + integrity sha512-rK6GpmMt/mU6MPuav0/M7hJ/3t8HbKPCELw/Uqhi4732xoq2hJ2zbo2FkYs56y6w0KiXrIp4IOwNB9K8L/q62g== + +"@next/swc-linux-arm-gnueabihf@13.2.3": + version "13.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.3.tgz#84ad9e9679d55542a23b590ad9f2e1e9b2df62f7" + integrity sha512-yeiCp/Odt1UJ4KUE89XkeaaboIDiVFqKP4esvoLKGJ0fcqJXMofj4ad3tuQxAMs3F+qqrz9MclqhAHkex1aPZA== + +"@next/swc-linux-arm64-gnu@13.2.3": + version "13.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.2.3.tgz#56f9175bc632d647c60b9e8bedc0875edf92d8b7" + integrity sha512-/miIopDOUsuNlvjBjTipvoyjjaxgkOuvlz+cIbbPcm1eFvzX2ltSfgMgty15GuOiR8Hub4FeTSiq3g2dmCkzGA== + +"@next/swc-linux-arm64-musl@13.2.3": + version "13.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.2.3.tgz#7d4cf00e8f1729a3de464da0624773f5d0d14888" + integrity sha512-sujxFDhMMDjqhruup8LLGV/y+nCPi6nm5DlFoThMJFvaaKr/imhkXuk8uCTq4YJDbtRxnjydFv2y8laBSJVC2g== + +"@next/swc-linux-x64-gnu@13.2.3": + version "13.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.2.3.tgz#17de404910c4ebf7a1d366b19334d7e27e126ab0" + integrity sha512-w5MyxPknVvC9LVnMenAYMXMx4KxPwXuJRMQFvY71uXg68n7cvcas85U5zkdrbmuZ+JvsO5SIG8k36/6X3nUhmQ== + +"@next/swc-linux-x64-musl@13.2.3": + version "13.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.2.3.tgz#07cb7b7f3a3a98034e2533f82638a9b099ba4ab1" + integrity sha512-CTeelh8OzSOVqpzMFMFnVRJIFAFQoTsI9RmVJWW/92S4xfECGcOzgsX37CZ8K982WHRzKU7exeh7vYdG/Eh4CA== + +"@next/swc-win32-arm64-msvc@13.2.3": + version "13.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.2.3.tgz#b9ac98c954c71ec9de45d3497a8585096b873152" + integrity sha512-7N1KBQP5mo4xf52cFCHgMjzbc9jizIlkTepe9tMa2WFvEIlKDfdt38QYcr9mbtny17yuaIw02FXOVEytGzqdOQ== + +"@next/swc-win32-ia32-msvc@13.2.3": + version "13.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.2.3.tgz#5ec48653a48fd664e940c69c96bba698fdae92eb" + integrity sha512-LzWD5pTSipUXTEMRjtxES/NBYktuZdo7xExJqGDMnZU8WOI+v9mQzsmQgZS/q02eIv78JOCSemqVVKZBGCgUvA== + +"@next/swc-win32-x64-msvc@13.2.3": + version "13.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.2.3.tgz#cd432f280beb8d8de5b7cd2501e9f502e9f3dd72" + integrity sha512-aLG2MaFs4y7IwaMTosz2r4mVbqRyCnMoFqOcmfTi7/mAS+G4IMH0vJp4oLdbshqiVoiVuKrAfqtXj55/m7Qu1Q== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pinecone-database/pinecone@0.0.12": + version "0.0.12" + resolved "https://registry.npmjs.org/@pinecone-database/pinecone/-/pinecone-0.0.12.tgz" + integrity sha512-YI9IQ7/0k6jI+NUyTD+I2BvwUGhOMRgMpx/qx/v5t5Cm31vSdnXEgGfh9jILUpi/+j59vtK+O5rB+pV5v1L15w== + dependencies: + cross-fetch "^3.1.5" + +"@pkgr/utils@^2.3.1": + version "2.3.1" + resolved "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz" + integrity sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw== + dependencies: + cross-spawn "^7.0.3" + is-glob "^4.0.3" + open "^8.4.0" + picocolors "^1.0.0" + tiny-glob "^0.2.9" + tslib "^2.4.0" + +"@radix-ui/primitive@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz" + integrity sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-accordion@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.1.1.tgz" + integrity sha512-TQtyyRubYe8DD6DYCovNLTjd2D+TFrNCpr99T5M3cYUbR7BsRxWsxfInjbQ1nHsdy2uPTcnJS5npyXPVfP0piw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.0" + "@radix-ui/react-collapsible" "1.0.2" + "@radix-ui/react-collection" "1.0.2" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-context" "1.0.0" + "@radix-ui/react-direction" "1.0.0" + "@radix-ui/react-id" "1.0.0" + "@radix-ui/react-primitive" "1.0.2" + "@radix-ui/react-use-controllable-state" "1.0.0" + +"@radix-ui/react-collapsible@1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.0.2.tgz" + integrity sha512-QNiDT6Au8jUU0K1WV+HEd4loH7C5CKQjeXxskwqyiyAkyCmW7qlQM5vSSJCIoQC+OVPyhgafSmGudRP8Qm1/gA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.0" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-context" "1.0.0" + "@radix-ui/react-id" "1.0.0" + "@radix-ui/react-presence" "1.0.0" + "@radix-ui/react-primitive" "1.0.2" + "@radix-ui/react-use-controllable-state" "1.0.0" + "@radix-ui/react-use-layout-effect" "1.0.0" + +"@radix-ui/react-collection@1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.2.tgz" + integrity sha512-s8WdQQ6wNXpaxdZ308KSr8fEWGrg4un8i4r/w7fhiS4ElRNjk5rRcl0/C6TANG2LvLOGIxtzo/jAg6Qf73TEBw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-context" "1.0.0" + "@radix-ui/react-primitive" "1.0.2" + "@radix-ui/react-slot" "1.0.1" + +"@radix-ui/react-compose-refs@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz" + integrity sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-context@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz" + integrity sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-direction@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.0.tgz" + integrity sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-id@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz" + integrity sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-layout-effect" "1.0.0" + +"@radix-ui/react-presence@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz" + integrity sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-use-layout-effect" "1.0.0" + +"@radix-ui/react-primitive@1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.2.tgz" + integrity sha512-zY6G5Qq4R8diFPNwtyoLRZBxzu1Z+SXMlfYpChN7Dv8gvmx9X3qhDqiLWvKseKVJMuedFeU/Sa0Sy/Ia+t06Dw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-slot" "1.0.1" + +"@radix-ui/react-slot@1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz" + integrity sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.0" + +"@radix-ui/react-use-callback-ref@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz" + integrity sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-use-controllable-state@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz" + integrity sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.0.0" + +"@radix-ui/react-use-layout-effect@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz" + integrity sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@rushstack/eslint-patch@^1.1.3": + version "1.2.0" + resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz" + integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== + +"@swc/helpers@0.4.14": + version "0.4.14" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz" + integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw== + dependencies: + tslib "^2.4.0" + +"@types/debug@^4.0.0": + version "4.1.7" + resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" + +"@types/hast@^2.0.0": + version "2.3.4" + resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz" + integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== + dependencies: + "@types/unist" "*" + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/mdast@^3.0.0": + version "3.0.11" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz" + integrity sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw== + dependencies: + "@types/unist" "*" + +"@types/ms@*": + version "0.7.31" + resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + +"@types/node@^18.14.6": + version "18.15.11" + resolved "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz" + integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== + +"@types/prop-types@*", "@types/prop-types@^15.0.0": + version "15.7.5" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/react-dom@^18.0.11": + version "18.0.11" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz" + integrity sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.0.28": + version "18.0.35" + resolved "https://registry.npmjs.org/@types/react/-/react-18.0.35.tgz" + integrity sha512-6Laome31HpetaIUGFWl1VQ3mdSImwxtFZ39rh059a1MNnKGqBpC88J6NJ8n/Is3Qx7CefDGLgf/KhN/sYCf7ag== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/scheduler@*": + version "0.16.3" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== + +"@types/unist@*", "@types/unist@^2.0.0": + version "2.0.6" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz" + integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== + +"@typescript-eslint/parser@^5.42.0", "@typescript-eslint/parser@^5.54.0": + version "5.58.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz" + integrity sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ== + dependencies: + "@typescript-eslint/scope-manager" "5.58.0" + "@typescript-eslint/types" "5.58.0" + "@typescript-eslint/typescript-estree" "5.58.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.58.0": + version "5.58.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.58.0.tgz" + integrity sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA== + dependencies: + "@typescript-eslint/types" "5.58.0" + "@typescript-eslint/visitor-keys" "5.58.0" + +"@typescript-eslint/types@5.58.0": + version "5.58.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz" + integrity sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g== + +"@typescript-eslint/typescript-estree@5.58.0": + version "5.58.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.58.0.tgz" + integrity sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q== + dependencies: + "@typescript-eslint/types" "5.58.0" + "@typescript-eslint/visitor-keys" "5.58.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/visitor-keys@5.58.0": + version "5.58.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz" + integrity sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA== + dependencies: + "@typescript-eslint/types" "5.58.0" + eslint-visitor-keys "^3.3.0" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.8.0: + version "8.8.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@^5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-includes@^3.1.5, array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +autoprefixer@^10.4.13: + version "10.4.14" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== + dependencies: + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axe-core@^4.6.2: + version "4.6.3" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz" + integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg== + +axios@^0.26.0: + version "0.26.1" + resolved "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz" + integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== + dependencies: + follow-redirects "^1.14.8" + +axios@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz" + integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +axobject-query@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz" + integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== + dependencies: + deep-equal "^2.0.5" + +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0, binary-extensions@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +binary-search@^1.3.5: + version "1.3.6" + resolved "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz" + integrity sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA== + +bowser@^2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" + integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-or-node@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/browser-or-node/-/browser-or-node-2.1.1.tgz" + integrity sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg== + +browserslist@^4.21.5: + version "4.21.5" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: + version "1.0.30001478" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001478.tgz" + integrity sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw== + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +client-only@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + +clsx@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@^1.1.4, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +cross-fetch@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +csstype@^3.0.2: + version "3.1.2" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +debug@^3.1.0, debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decode-named-character-reference@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz" + integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + dependencies: + character-entities "^2.0.0" + +deep-equal@^2.0.5: + version "2.2.0" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz" + integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw== + dependencies: + call-bind "^1.0.2" + es-get-iterator "^1.1.2" + get-intrinsic "^1.1.3" + is-arguments "^1.1.1" + is-array-buffer "^3.0.1" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.2.0" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +dequal@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +diff@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz" + integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dotenv@^16.0.3: + version "16.0.3" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz" + integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== + +electron-to-chromium@^1.4.284: + version "1.4.361" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.361.tgz" + integrity sha512-VocVwjPp05HUXzf3xmL0boRn5b0iyqC7amtDww84Jb1QJNPBc7F69gJyEeXRoriLBC4a5pSyckdllrXAg4mmRA== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +enhanced-resolve@^5.12.0: + version "5.12.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz" + integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.21.2" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== + dependencies: + array-buffer-byte-length "^1.0.0" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.0" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" + +es-get-iterator@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +esbuild@~0.17.6: + version "0.17.16" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.17.16.tgz" + integrity sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg== + optionalDependencies: + "@esbuild/android-arm" "0.17.16" + "@esbuild/android-arm64" "0.17.16" + "@esbuild/android-x64" "0.17.16" + "@esbuild/darwin-arm64" "0.17.16" + "@esbuild/darwin-x64" "0.17.16" + "@esbuild/freebsd-arm64" "0.17.16" + "@esbuild/freebsd-x64" "0.17.16" + "@esbuild/linux-arm" "0.17.16" + "@esbuild/linux-arm64" "0.17.16" + "@esbuild/linux-ia32" "0.17.16" + "@esbuild/linux-loong64" "0.17.16" + "@esbuild/linux-mips64el" "0.17.16" + "@esbuild/linux-ppc64" "0.17.16" + "@esbuild/linux-riscv64" "0.17.16" + "@esbuild/linux-s390x" "0.17.16" + "@esbuild/linux-x64" "0.17.16" + "@esbuild/netbsd-x64" "0.17.16" + "@esbuild/openbsd-x64" "0.17.16" + "@esbuild/sunos-x64" "0.17.16" + "@esbuild/win32-arm64" "0.17.16" + "@esbuild/win32-ia32" "0.17.16" + "@esbuild/win32-x64" "0.17.16" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-next@13.2.3: + version "13.2.3" + resolved "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.2.3.tgz" + integrity sha512-kPulHiQEHGei9hIaaNGygHRc0UzlWM+3euOmYbxNkd2Nbhci5rrCDeMBMPSV8xgUssphDGmwDHWbk4VZz3rlZQ== + dependencies: + "@next/eslint-plugin-next" "13.2.3" + "@rushstack/eslint-patch" "^1.1.3" + "@typescript-eslint/parser" "^5.42.0" + eslint-import-resolver-node "^0.3.6" + eslint-import-resolver-typescript "^3.5.2" + eslint-plugin-import "^2.26.0" + eslint-plugin-jsx-a11y "^6.5.1" + eslint-plugin-react "^7.31.7" + eslint-plugin-react-hooks "^4.5.0" + +eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + dependencies: + debug "^3.2.7" + is-core-module "^2.11.0" + resolve "^1.22.1" + +eslint-import-resolver-typescript@^3.5.2: + version "3.5.5" + resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz" + integrity sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw== + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.12.0" + eslint-module-utils "^2.7.4" + get-tsconfig "^4.5.0" + globby "^13.1.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + synckit "^0.8.5" + +eslint-module-utils@^2.7.4: + version "2.7.4" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz" + integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.26.0: + version "2.27.5" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" + has "^1.0.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-jsx-a11y@^6.5.1: + version "6.7.1" + resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz" + integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== + dependencies: + "@babel/runtime" "^7.20.7" + aria-query "^5.1.3" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + ast-types-flow "^0.0.7" + axe-core "^4.6.2" + axobject-query "^3.1.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.3.3" + language-tags "=1.0.5" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + semver "^6.3.0" + +eslint-plugin-react-hooks@^4.5.0: + version "4.6.0" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.31.7: + version "7.32.2" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz" + integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.0" + string.prototype.matchall "^4.0.8" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.0: + version "3.4.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz" + integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== + +eslint@8.35.0: + version "8.35.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz" + integrity sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw== + dependencies: + "@eslint/eslintrc" "^2.0.0" + "@eslint/js" "8.35.0" + "@humanwhocodes/config-array" "^0.11.8" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.4.0" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.4.0, espree@^9.5.1: + version "9.5.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz" + integrity sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.0" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eventemitter3@^4.0.4: + version "4.0.7" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +expr-eval@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/expr-eval/-/expr-eval-2.0.2.tgz" + integrity sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg== + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + 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== + +fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-xml-parser@4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.1.2.tgz#5a98c18238d28a57bbdfa9fe4cda01211fff8f4a" + integrity sha512-CDYeykkle1LiA/uqQyNwYpFbyF6Axec6YapmpUP+/RHWIoR1zKjocdvNaTsxCxZzQ6v9MLXaSYm9Qq0thv0DHg== + dependencies: + strnum "^1.0.5" + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +follow-redirects@^1.14.8, follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-tsconfig@^4.4.0, get-tsconfig@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz" + integrity sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@7.1.7: + version "7.1.7" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + 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" + +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globalyzer@0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz" + integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^13.1.3: + version "13.1.4" + resolved "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz" + integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + +globrex@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.2.4: + 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== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hast-util-whitespace@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz" + integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== + +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +is-any-array@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-any-array/-/is-any-array-2.0.0.tgz" + integrity sha512-WdPV58rT3aOWXvvyuBydnCq4S2BM1Yz8shKxlEpk/6x+GX202XRvXOycEFtNgnHVLoc46hpexPFx8Pz1/sMS0w== + +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0, is-core-module@^2.9.0: + version "2.12.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz" + integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jiti@^1.17.2: + version "1.18.2" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz" + integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== + +js-sdsl@^4.1.4: + version "4.4.0" + resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz" + integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +jsonpointer@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz" + integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: + version "3.3.3" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + dependencies: + array-includes "^3.1.5" + object.assign "^4.1.3" + +kleur@^4.0.3: + version "4.1.5" + resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== + +langchain@0.0.55: + version "0.0.55" + resolved "https://registry.npmjs.org/langchain/-/langchain-0.0.55.tgz" + integrity sha512-ScL53LvBm2X0rIO1fdMLEoCFYESLVTmY0d71qX7qDrB1y8Y8nCtCA1ZiUNYl4WDQeEvKcvB39qWmAJ2XcB8tqQ== + dependencies: + "@anthropic-ai/sdk" "^0.4.3" + "@dqbd/tiktoken" "^1.0.4" + binary-extensions "^2.2.0" + browser-or-node "^2.1.1" + expr-eval "^2.0.2" + flat "^5.0.2" + jsonpointer "^5.0.1" + ml-distance "^4.0.0" + object-hash "^3.0.0" + openai "^3.2.0" + p-queue "^6.6.2" + p-retry "4" + uuid "^9.0.0" + yaml "^2.2.1" + zod "^3.21.4" + +language-subtag-registry@~0.3.2: + version "0.3.22" + resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@=1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + dependencies: + language-subtag-registry "~0.3.2" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lilconfig@^2.0.5, lilconfig@^2.0.6: + version "2.1.0" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lucide-react@^0.125.0: + version "0.125.0" + resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.125.0.tgz" + integrity sha512-tadphtB6TPytEitR9vX75hqu9PQT/uz5RcvXMq976nC190eukAM9+cHMgBxfvfEGDXwIhIT9aFxTUGdAjxw9uQ== + +mdast-util-definitions@^5.0.0: + version "5.1.2" + resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz" + integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + unist-util-visit "^4.0.0" + +mdast-util-from-markdown@^1.0.0: + version "1.3.0" + resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.0.tgz" + integrity sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + decode-named-character-reference "^1.0.0" + mdast-util-to-string "^3.1.0" + micromark "^3.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-decode-string "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-stringify-position "^3.0.0" + uvu "^0.5.0" + +mdast-util-to-hast@^12.1.0: + version "12.3.0" + resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz" + integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== + dependencies: + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-definitions "^5.0.0" + micromark-util-sanitize-uri "^1.1.0" + trim-lines "^3.0.0" + unist-util-generated "^2.0.0" + unist-util-position "^4.0.0" + unist-util-visit "^4.0.0" + +mdast-util-to-string@^3.1.0: + version "3.2.0" + resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz" + integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== + dependencies: + "@types/mdast" "^3.0.0" + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromark-core-commonmark@^1.0.1: + version "1.0.6" + resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz" + integrity sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-factory-destination "^1.0.0" + micromark-factory-label "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-factory-title "^1.0.0" + micromark-factory-whitespace "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-classify-character "^1.0.0" + micromark-util-html-tag-name "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + +micromark-factory-destination@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz" + integrity sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-label@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz" + integrity sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-factory-space@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz" + integrity sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-title@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz" + integrity sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-factory-whitespace@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz" + integrity sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-character@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz" + integrity sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-chunked@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz" + integrity sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-classify-character@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz" + integrity sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-combine-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz" + integrity sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-decode-numeric-character-reference@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz" + integrity sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-decode-string@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz" + integrity sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-symbol "^1.0.0" + +micromark-util-encode@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz" + integrity sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA== + +micromark-util-html-tag-name@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz" + integrity sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA== + +micromark-util-normalize-identifier@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz" + integrity sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-resolve-all@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz" + integrity sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw== + dependencies: + micromark-util-types "^1.0.0" + +micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz" + integrity sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-symbol "^1.0.0" + +micromark-util-subtokenize@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz" + integrity sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-util-symbol@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz" + integrity sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ== + +micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz" + integrity sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w== + +micromark@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz" + integrity sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + micromark-core-commonmark "^1.0.1" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + +micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +ml-array-mean@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/ml-array-mean/-/ml-array-mean-1.1.6.tgz" + integrity sha512-MIdf7Zc8HznwIisyiJGRH9tRigg3Yf4FldW8DxKxpCCv/g5CafTw0RRu51nojVEOXuCQC7DRVVu5c7XXO/5joQ== + dependencies: + ml-array-sum "^1.1.6" + +ml-array-sum@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/ml-array-sum/-/ml-array-sum-1.1.6.tgz" + integrity sha512-29mAh2GwH7ZmiRnup4UyibQZB9+ZLyMShvt4cH4eTK+cL2oEMIZFnSyB3SS8MlsTh6q/w/yh48KmqLxmovN4Dw== + dependencies: + is-any-array "^2.0.0" + +ml-distance-euclidean@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ml-distance-euclidean/-/ml-distance-euclidean-2.0.0.tgz" + integrity sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q== + +ml-distance@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/ml-distance/-/ml-distance-4.0.0.tgz" + integrity sha512-zj7+UGZpHk3uL7n79XTfGNUjIGnhLn8xVvrxYvBHvXFxo3jq1q+/UjP311hZxnLVhbxbXCjUniThX8gozjacYA== + dependencies: + ml-array-mean "^1.1.6" + ml-distance-euclidean "^2.0.0" + ml-tree-similarity "^1.0.0" + +ml-tree-similarity@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/ml-tree-similarity/-/ml-tree-similarity-1.0.0.tgz" + integrity sha512-XJUyYqjSuUQkNQHMscr6tcjldsOoAekxADTplt40QKfwW6nd++1wHWV9AArl0Zvw/TIHgNaZZNvr8QGvE8wLRg== + dependencies: + binary-search "^1.3.5" + num-sort "^2.0.0" + +mri@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.4: + version "3.3.6" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +next@13.2.3: + version "13.2.3" + resolved "https://registry.npmjs.org/next/-/next-13.2.3.tgz" + integrity sha512-nKFJC6upCPN7DWRx4+0S/1PIOT7vNlCT157w9AzbXEgKy6zkiPKEt5YyRUsRZkmpEqBVrGgOqNfwecTociyg+w== + dependencies: + "@next/env" "13.2.3" + "@swc/helpers" "0.4.14" + caniuse-lite "^1.0.30001406" + postcss "8.4.14" + styled-jsx "5.1.1" + optionalDependencies: + "@next/swc-android-arm-eabi" "13.2.3" + "@next/swc-android-arm64" "13.2.3" + "@next/swc-darwin-arm64" "13.2.3" + "@next/swc-darwin-x64" "13.2.3" + "@next/swc-freebsd-x64" "13.2.3" + "@next/swc-linux-arm-gnueabihf" "13.2.3" + "@next/swc-linux-arm64-gnu" "13.2.3" + "@next/swc-linux-arm64-musl" "13.2.3" + "@next/swc-linux-x64-gnu" "13.2.3" + "@next/swc-linux-x64-musl" "13.2.3" + "@next/swc-win32-arm64-msvc" "13.2.3" + "@next/swc-win32-ia32-msvc" "13.2.3" + "@next/swc-win32-x64-msvc" "13.2.3" + +node-ensure@^0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/node-ensure/-/node-ensure-0.0.0.tgz" + integrity sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw== + +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +num-sort@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/num-sort/-/num-sort-2.1.0.tgz" + integrity sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg== + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.3, object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +open@^8.4.0: + version "8.4.2" + resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +openai@^3.2.0: + version "3.2.1" + resolved "https://registry.npmjs.org/openai/-/openai-3.2.1.tgz" + integrity sha512-762C9BNlJPbjjlWZi4WYK9iM2tAVAv0uUp1UmI34vb0CN5T2mjB/qM6RYBmNKMh/dN9fC+bxqPwWJZUTWW052A== + dependencies: + axios "^0.26.0" + form-data "^4.0.0" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-queue@^6.6.2: + version "6.6.2" + resolved "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== + dependencies: + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" + +p-retry@4: + version "4.6.2" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pdf-parse@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/pdf-parse/-/pdf-parse-1.1.1.tgz" + integrity sha512-v6ZJ/efsBpGrGGknjtq9J/oC8tZWq0KWL5vQrk2GlzLEQPUDB1ex+13Rmidl1neNN358Jn9EHZw5y07FFtaC7A== + dependencies: + debug "^3.1.0" + node-ensure "^0.0.0" + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1: + version "4.0.5" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +postcss-import@^14.1.0: + version "14.1.0" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz" + integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^3.1.4: + version "3.1.4" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz" + integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== + dependencies: + lilconfig "^2.0.5" + yaml "^1.10.2" + +postcss-nested@6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz" + integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11: + version "6.0.11" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz" + integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@8.4.14: + version "8.4.14" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz" + integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^8.0.9, postcss@^8.4.21: + version "8.4.21" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@^2.8.4: + version "2.8.7" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz" + integrity sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw== + +prop-types@^15.0.0, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +property-information@^6.0.0: + version "6.2.0" + resolved "https://registry.npmjs.org/property-information/-/property-information-6.2.0.tgz" + integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg== + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +react-dom@18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-markdown@^8.0.5: + version "8.0.7" + resolved "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz" + integrity sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ== + dependencies: + "@types/hast" "^2.0.0" + "@types/prop-types" "^15.0.0" + "@types/unist" "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-whitespace "^2.0.0" + prop-types "^15.0.0" + property-information "^6.0.0" + react-is "^18.0.0" + remark-parse "^10.0.0" + remark-rehype "^10.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^0.4.0" + unified "^10.0.0" + unist-util-visit "^4.0.0" + vfile "^5.0.0" + +react@18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +remark-parse@^10.0.0: + version "10.0.1" + resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz" + integrity sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-from-markdown "^1.0.0" + unified "^10.0.0" + +remark-rehype@^10.0.0: + version "10.1.0" + resolved "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz" + integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== + dependencies: + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-to-hast "^12.1.0" + unified "^10.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.1.7, resolve@^1.22.1: + version "1.22.2" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.4: + version "2.0.0-next.4" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +sade@^1.7.3: + version "1.8.1" + resolved "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz" + integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== + dependencies: + mri "^1.1.0" + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.7: + version "7.4.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" + integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== + dependencies: + lru-cache "^6.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-support@^0.5.21: + 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== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +space-separated-tokens@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + +string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + +style-to-object@^0.4.0: + version "0.4.1" + resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz" + integrity sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw== + dependencies: + inline-style-parser "0.1.1" + +styled-jsx@5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz" + integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== + dependencies: + client-only "0.0.1" + +sucrase@^3.29.0: + version "3.32.0" + resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz" + integrity sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "7.1.6" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + 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== + +synckit@^0.8.5: + version "0.8.5" + resolved "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz" + integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== + dependencies: + "@pkgr/utils" "^2.3.1" + tslib "^2.5.0" + +tailwind-merge@^1.10.0: + version "1.12.0" + resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-1.12.0.tgz" + integrity sha512-Y17eDp7FtN1+JJ4OY0Bqv9OA41O+MS8c1Iyr3T6JFLnOgLg3EvcyMKZAnQ8AGyvB5Nxm3t9Xb5Mhe139m8QT/g== + +tailwindcss@^3.2.7: + version "3.3.1" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.1.tgz" + integrity sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g== + dependencies: + arg "^5.0.2" + chokidar "^3.5.3" + color-name "^1.1.4" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.12" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.17.2" + lilconfig "^2.0.6" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.0.9" + postcss-import "^14.1.0" + postcss-js "^4.0.0" + postcss-load-config "^3.1.4" + postcss-nested "6.0.0" + postcss-selector-parser "^6.0.11" + postcss-value-parser "^4.2.0" + quick-lru "^5.1.1" + resolve "^1.22.1" + sucrase "^3.29.0" + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +tiny-glob@^0.2.9: + version "0.2.9" + resolved "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz" + integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== + dependencies: + globalyzer "0.1.0" + globrex "^0.1.2" + +to-regex-range@^5.0.1: + 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== + dependencies: + is-number "^7.0.0" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + +trough@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz" + integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tsconfig-paths@^3.14.1: + version "3.14.2" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.11.1, tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tsx@^3.12.3: + version "3.12.6" + resolved "https://registry.npmjs.org/tsx/-/tsx-3.12.6.tgz" + integrity sha512-q93WgS3lBdHlPgS0h1i+87Pt6n9K/qULIMNYZo07nSeu2z5QE2CellcAZfofVXBo2tQg9av2ZcRMQ2S2i5oadQ== + dependencies: + "@esbuild-kit/cjs-loader" "^2.4.2" + "@esbuild-kit/core-utils" "^3.0.0" + "@esbuild-kit/esm-loader" "^2.5.5" + optionalDependencies: + fsevents "~2.3.2" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typescript@^4.9.5: + version "4.9.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +unified@^10.0.0: + version "10.1.2" + resolved "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz" + integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== + dependencies: + "@types/unist" "^2.0.0" + bail "^2.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^5.0.0" + +unist-util-generated@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz" + integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== + +unist-util-is@^5.0.0: + version "5.2.1" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz" + integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-position@^4.0.0: + version "4.0.4" + resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz" + integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-stringify-position@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz" + integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-visit-parents@^5.1.1: + version "5.1.3" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz" + integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + +unist-util-visit@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz" + integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.1.1" + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + +uvu@^0.5.0: + version "0.5.6" + resolved "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz" + integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== + dependencies: + dequal "^2.0.0" + diff "^5.0.0" + kleur "^4.0.3" + sade "^1.7.3" + +vfile-message@^3.0.0: + version "3.1.4" + resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz" + integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^3.0.0" + +vfile@^5.0.0: + version "5.3.7" + resolved "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz" + integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^3.0.0" + vfile-message "^3.0.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yaml@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz" + integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod@^3.21.4: + version "3.21.4" + resolved "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz" + integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==