commit 65ca290e0b7f1801cd69246a11da134bd722b1e6
Author: hellcat
Date: Thu Feb 12 12:36:53 2026 +0800
no message
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 00000000..a186cd20
--- /dev/null
+++ b/.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
+
+[compose.yaml]
+indent_size = 4
diff --git a/.env.example b/.env.example
new file mode 100644
index 00000000..c0660ea1
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,65 @@
+APP_NAME=Laravel
+APP_ENV=local
+APP_KEY=
+APP_DEBUG=true
+APP_URL=http://localhost
+
+APP_LOCALE=en
+APP_FALLBACK_LOCALE=en
+APP_FAKER_LOCALE=en_US
+
+APP_MAINTENANCE_DRIVER=file
+# APP_MAINTENANCE_STORE=database
+
+# PHP_CLI_SERVER_WORKERS=4
+
+BCRYPT_ROUNDS=12
+
+LOG_CHANNEL=stack
+LOG_STACK=single
+LOG_DEPRECATIONS_CHANNEL=null
+LOG_LEVEL=debug
+
+DB_CONNECTION=sqlite
+# DB_HOST=127.0.0.1
+# DB_PORT=3306
+# DB_DATABASE=laravel
+# DB_USERNAME=root
+# DB_PASSWORD=
+
+SESSION_DRIVER=database
+SESSION_LIFETIME=120
+SESSION_ENCRYPT=false
+SESSION_PATH=/
+SESSION_DOMAIN=null
+
+BROADCAST_CONNECTION=log
+FILESYSTEM_DISK=local
+QUEUE_CONNECTION=database
+
+CACHE_STORE=database
+# CACHE_PREFIX=
+
+MEMCACHED_HOST=127.0.0.1
+
+REDIS_CLIENT=phpredis
+REDIS_HOST=127.0.0.1
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+MAIL_MAILER=log
+MAIL_SCHEME=null
+MAIL_HOST=127.0.0.1
+MAIL_PORT=2525
+MAIL_USERNAME=null
+MAIL_PASSWORD=null
+MAIL_FROM_ADDRESS="hello@example.com"
+MAIL_FROM_NAME="${APP_NAME}"
+
+AWS_ACCESS_KEY_ID=
+AWS_SECRET_ACCESS_KEY=
+AWS_DEFAULT_REGION=us-east-1
+AWS_BUCKET=
+AWS_USE_PATH_STYLE_ENDPOINT=false
+
+VITE_APP_NAME="${APP_NAME}"
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..fcb21d39
--- /dev/null
+++ b/.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/.gitignore b/.gitignore
new file mode 100644
index 00000000..654c7fd6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,25 @@
+*.log
+.DS_Store
+.env
+.env.backup
+.env.production
+.phpactor.json
+.phpunit.result.cache
+/.fleet
+/.idea
+/.nova
+/.phpunit.cache
+/.vscode
+/.zed
+/auth.json
+/node_modules
+/public/build
+/public/hot
+/public/storage
+/storage/*.key
+/storage/pail
+/vendor
+Homestead.json
+Homestead.yaml
+Thumbs.db
+!/_env/*
diff --git a/README.md b/README.md
new file mode 100755
index 00000000..0165a773
--- /dev/null
+++ b/README.md
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+## About Laravel
+
+Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:
+
+- [Simple, fast routing engine](https://laravel.com/docs/routing).
+- [Powerful dependency injection container](https://laravel.com/docs/container).
+- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage.
+- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent).
+- Database agnostic [schema migrations](https://laravel.com/docs/migrations).
+- [Robust background job processing](https://laravel.com/docs/queues).
+- [Real-time event broadcasting](https://laravel.com/docs/broadcasting).
+
+Laravel is accessible, powerful, and provides tools required for large, robust applications.
+
+## Learning Laravel
+
+Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework. You can also check out [Laravel Learn](https://laravel.com/learn), where you will be guided through building a modern Laravel application.
+
+If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library.
+
+## Laravel Sponsors
+
+We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com).
+
+### Premium Partners
+
+- **[Vehikl](https://vehikl.com)**
+- **[Tighten Co.](https://tighten.co)**
+- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)**
+- **[64 Robots](https://64robots.com)**
+- **[Curotec](https://www.curotec.com/services/technologies/laravel)**
+- **[DevSquad](https://devsquad.com/hire-laravel-developers)**
+- **[Redberry](https://redberry.international/laravel-development)**
+- **[Active Logic](https://activelogic.com)**
+
+## Contributing
+
+Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).
+
+## Code of Conduct
+
+In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).
+
+## Security Vulnerabilities
+
+If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed.
+
+## License
+
+The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).
diff --git a/_env/.env b/_env/.env
new file mode 100755
index 00000000..d5946a5c
--- /dev/null
+++ b/_env/.env
@@ -0,0 +1,85 @@
+token_base = wocaonide
+is_loc = true
+url_master_base = dd.loc
+site_code = test.com
+site_code_short = tt
+page_limit = 2
+app_title = SSR/V2ray/Clash免费节点每天更新 - v2rayfreenode
+app_desc = SSR/V2ray/Clash免费节点每天更新
+app_keywords = v2rayclashfree,Clash,Quantumult,Shadowrocket,SSR,v2ray,免费节点,节点,订阅链接
+url_resource_base = resource.loc
+
+SCOUT_DRIVER=meilisearch
+MEILISEARCH_HOST=http://127.0.0.1:7700
+SCOUT_QUEUE=false
+
+VITE_DEV_SERVER_URL=http://127.0.0.1:5173
+
+APP_NAME=Laravelenv
+APP_ENV=local
+APP_KEY=base64:VkMoebPURG4A1ker22M5nfFV+tcjph+eYvQrJYANq0Y=
+APP_DEBUG=true
+APP_URL=http://fn-b.loc
+
+APP_LOCALE=en
+APP_FALLBACK_LOCALE=en
+APP_FAKER_LOCALE=en_US
+
+APP_MAINTENANCE_DRIVER=file
+# APP_MAINTENANCE_STORE=database
+
+# PHP_CLI_SERVER_WORKERS=4
+
+BCRYPT_ROUNDS=12
+
+LOG_CHANNEL=stack
+LOG_STACK=single
+LOG_DEPRECATIONS_CHANNEL=null
+LOG_LEVEL=debug
+
+DB_CONNECTION=mysql
+DB_HOST=127.0.0.1
+DB_PORT=3306
+DB_DATABASE=fn_b
+DB_USERNAME=root
+DB_PASSWORD=root
+
+SESSION_DRIVER=database
+SESSION_LIFETIME=120
+SESSION_ENCRYPT=false
+SESSION_PATH=/
+SESSION_DOMAIN=null
+
+BROADCAST_CONNECTION=log
+FILESYSTEM_DISK=local
+QUEUE_CONNECTION=database
+
+RESPONSE_CACHE_ENABLED=false
+CACHE_STORE=file
+RESPONSE_CACHE_STORE=file
+RESPONSE_CACHE_DRIVER=file
+# CACHE_PREFIX=
+
+MEMCACHED_HOST=127.0.0.1
+
+REDIS_CLIENT=phpredis
+REDIS_HOST=127.0.0.1
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+MAIL_MAILER=log
+MAIL_SCHEME=null
+MAIL_HOST=127.0.0.1
+MAIL_PORT=2525
+MAIL_USERNAME=null
+MAIL_PASSWORD=null
+MAIL_FROM_ADDRESS="hello@example.com"
+MAIL_FROM_NAME="${APP_NAME}"
+
+AWS_ACCESS_KEY_ID=
+AWS_SECRET_ACCESS_KEY=
+AWS_DEFAULT_REGION=us-east-1
+AWS_BUCKET=
+AWS_USE_PATH_STYLE_ENDPOINT=false
+
+VITE_APP_NAME="${APP_NAME}"
diff --git a/_env/sql.sql b/_env/sql.sql
new file mode 100644
index 00000000..366b7503
--- /dev/null
+++ b/_env/sql.sql
@@ -0,0 +1,584 @@
+/*M!999999\- enable the sandbox mode */
+-- MariaDB dump 10.19-11.6.2-MariaDB, for osx10.19 (x86_64)
+--
+-- Host: localhost Database: fn_b
+-- ------------------------------------------------------
+-- Server version 11.6.2-MariaDB
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8mb4 */;
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */;
+
+--
+-- Table structure for table `article_freenode_thumb_nums`
+--
+
+DROP TABLE IF EXISTS `article_freenode_thumb_nums`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `article_freenode_thumb_nums` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `num` int(11) DEFAULT 1,
+ `author_code` varchar(100) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `num` (`num`)
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `article_freenode_thumb_nums`
+--
+
+LOCK TABLES `article_freenode_thumb_nums` WRITE;
+/*!40000 ALTER TABLE `article_freenode_thumb_nums` DISABLE KEYS */;
+INSERT INTO `article_freenode_thumb_nums` VALUES
+(2,2,'tg_xiuren_a');
+/*!40000 ALTER TABLE `article_freenode_thumb_nums` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `article_likes`
+--
+
+DROP TABLE IF EXISTS `article_likes`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `article_likes` (
+ `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+ `iArticleId` bigint(20) unsigned NOT NULL COMMENT '文章ID',
+ `sIp` varchar(45) NOT NULL COMMENT '支持IPv4和IPv6',
+ `sFingerprint` varchar(64) NOT NULL COMMENT '浏览器唯一指纹(建议存储MD5或SHA1)',
+ `created_at` timestamp NULL DEFAULT current_timestamp(),
+ `updated_at` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `uidx_article_fingerprint` (`iArticleId`,`sFingerprint`),
+ KEY `idx_article_likes_sip` (`sIp`)
+) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='游客点赞记录表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `article_likes`
+--
+
+LOCK TABLES `article_likes` WRITE;
+/*!40000 ALTER TABLE `article_likes` DISABLE KEYS */;
+INSERT INTO `article_likes` VALUES
+(6,1,'127.0.0.1','bfed8360f6c1fc7039f49002245377d6','2026-02-01 02:03:19','2026-02-01 02:03:19'),
+(7,2,'127.0.0.1','bfed8360f6c1fc7039f49002245377d6','2026-02-01 02:57:19','2026-02-01 02:57:19'),
+(9,26,'127.0.0.1','bfed8360f6c1fc7039f49002245377d6','2026-02-02 00:03:59','2026-02-02 00:03:59'),
+(10,10,'127.0.0.1','bfed8360f6c1fc7039f49002245377d6','2026-02-02 00:05:55','2026-02-02 00:05:55'),
+(11,33,'127.0.0.1','bfed8360f6c1fc7039f49002245377d6','2026-02-05 20:47:30','2026-02-05 20:47:30'),
+(12,34,'127.0.0.1','bfed8360f6c1fc7039f49002245377d6','2026-02-06 00:38:54','2026-02-06 00:38:54'),
+(13,35,'127.0.0.1','bfed8360f6c1fc7039f49002245377d6','2026-02-07 00:51:18','2026-02-07 00:51:18'),
+(14,9,'127.0.0.1','bfed8360f6c1fc7039f49002245377d6','2026-02-07 00:55:46','2026-02-07 00:55:46');
+/*!40000 ALTER TABLE `article_likes` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `article_tag`
+--
+
+DROP TABLE IF EXISTS `article_tag`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `article_tag` (
+ `iArticleId` int(11) unsigned NOT NULL,
+ `iTagId` int(11) unsigned NOT NULL,
+ KEY `article_tag_idx` (`iArticleId`,`iTagId`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `article_tag`
+--
+
+LOCK TABLES `article_tag` WRITE;
+/*!40000 ALTER TABLE `article_tag` DISABLE KEYS */;
+INSERT INTO `article_tag` VALUES
+(35,5),
+(35,6),
+(35,7),
+(35,8),
+(35,9),
+(35,10),
+(35,11),
+(35,12),
+(36,5),
+(36,6),
+(36,7),
+(36,8),
+(36,9),
+(36,10),
+(36,11),
+(36,12);
+/*!40000 ALTER TABLE `article_tag` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `articles`
+--
+
+DROP TABLE IF EXISTS `articles`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `articles` (
+ `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+ `iUserId` bigint(20) unsigned DEFAULT NULL,
+ `iCategoryId` bigint(20) unsigned NOT NULL COMMENT '所属分类ID',
+ `sTitle` varchar(200) NOT NULL COMMENT '标题',
+ `sTitleSub` varchar(255) DEFAULT NULL,
+ `sSlug` varchar(200) DEFAULT NULL COMMENT '文章别名',
+ `sContent` longtext NOT NULL COMMENT '正文',
+ `sThumb` varchar(255) DEFAULT NULL COMMENT '缩略图',
+ `iViews` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '阅读数',
+ `iStatus` tinyint(4) NOT NULL DEFAULT 1 COMMENT '状态:1发布 0草稿',
+ `iIsTop` tinyint(4) DEFAULT 0,
+ `iLikeCount` int(11) DEFAULT 0,
+ `i7like` int(11) DEFAULT 0,
+ `i365like` int(11) DEFAULT 0,
+ `created_at` timestamp NULL DEFAULT NULL,
+ `updated_at` timestamp NULL DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `sSlug` (`sSlug`),
+ KEY `articles_icategoryid_index` (`iCategoryId`),
+ KEY `articles_istatus_index` (`iStatus`),
+ KEY `idx_i365like` (`i365like`),
+ KEY `iUserId` (`iUserId`),
+ CONSTRAINT `articles_category_fk` FOREIGN KEY (`iCategoryId`) REFERENCES `categories` (`id`) ON DELETE CASCADE
+) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `articles`
+--
+
+LOCK TABLES `articles` WRITE;
+/*!40000 ALTER TABLE `articles` DISABLE KEYS */;
+INSERT INTO `articles` VALUES
+(33,1,1,'「2月5日」2026年最新高速SSR/V2ray/Clash/Shadowrocket免费节点订阅链接','本次更新共50个可用节点,最高速度5M/S。\n覆盖美国、美国、香港、乌克兰、阿根廷、土耳其等多个区域。\n复制下方的v2ray/Clash订阅链接,在客户端添加即可正常使用。','fn20260205','加入tg频道获取更多新鲜免费节点:https://t.me/v2rayfreenode_com。\n\n本次更新共50个可用节点,最高速度5M/S。\n覆盖美国、美国、香港、乌克兰、阿根廷、土耳其等多个区域。\n复制下方的v2ray/Clash订阅链接,在客户端添加即可正常使用。\n\n机场推荐:\n\n* 好好 - 就是好\n\n* 不好不好 - 就是不好\n\n* 你就是个瘠薄 - 知道不\n\n* 去死吧 - 去死\n\n免费节点订阅链接:\n\nv2ray订阅链接:\n\nhttps://nodehub.loc/vfn/5e08dd26fff8100b/20260205-v2ray.txt\n\nclash订阅链接:\n\nhttps://nodehub.loc/vfn/5e08dd26fff8100b/20260205-clash.yaml\n\n温馨提示:\n\n本站提供的都是免费且公共的节点,稳定性与长时间连接速率无法与收费版的高速机场节点相提并论,不能奢望太多。\n\n注意你自己的网络环境(本地连接当中的DNS,手动配置一下:114.114.114.114,8.8.8.8或是其它公共的DNS。)\n\n如果某个网址无法代理访问,可切换到全局代理模式,一般可解决。',NULL,0,1,0,1,NULL,NULL,'2026-02-05 02:04:40','2026-02-05 20:47:30'),
+(34,1,1,'「2月6日」2026年最新高速SSR/V2ray/Clash/Shadowrocket免费节点订阅链接','本次更新共24个可用节点,最高速度8M/S。\n覆盖越南、瑞士、荷兰、泰国、美国、香港等多个区域。\n复制下方的v2ray/Clash订阅链接,在客户端添加即可正常使用。','fn20260206','加入tg频道获取更多新鲜免费节点:t.me/v2rayfreenode_com。
本次更新共24个可用节点,最高速度8M/S。
覆盖越南、瑞士、荷兰、泰国、美国、香港等多个区域。
复制下方的v2ray/Clash订阅链接,在客户端添加即可正常使用。
机场推荐:
* 好好 - 就是好
* 不好不好 - 就是不好
* 你就是个瘠薄 - 知道不
* 去死吧 - 去死
点击进入机场官网:富雨。
免费节点订阅链接:
v2ray订阅链接:
https://nodehub.loc/vfn/90f98a22914332c7/20260206-v2ray.txt
clash订阅链接:
https://nodehub.loc/vfn/90f98a22914332c7/20260206-clash.yaml
温馨提示:
本站提供的都是免费且公共的节点,稳定性与长时间连接速率无法与收费版的高速机场节点相提并论,不能奢望太多。
注意你自己的网络环境(本地连接当中的DNS,手动配置一下:114.114.114.114,8.8.8.8或是其它公共的DNS。)
如果某个网址无法代理访问,可切换到全局代理模式,一般可解决。
','https://resource.loc/upload/images/tg_xiuren_a-01KFAWNMJ27J8TDP1H0YPMNDP4-1-thumb_c.jpg',0,1,0,1,NULL,NULL,'2026-02-05 23:36:50','2026-02-06 00:38:54'),
+(35,1,1,'「2月7日」2026年最新高速SSR/V2ray/Clash/Shadowrocket免费节点订阅链接','本次更新共38个可用节点,最高速度21M/S。\n覆盖香港、台湾、爱尔兰、乌克兰、阿根廷、韩国、德国等多个区域。\n复制下方的v2ray/Clash订阅链接,在客户端添加即可正常使用。','fn20260207','加入tg频道获取更多新鲜免费节点:t.me/v2rayfreenode_com。
本次更新共38个可用节点,最高速度21M/S。
覆盖香港、台湾、爱尔兰、乌克兰、阿根廷、韩国、德国等多个区域。
复制下方的v2ray/Clash订阅链接,在客户端添加即可正常使用。
机场推荐:
* 好好 - 就是好
* 不好不好 - 就是不好
* 你就是个瘠薄 - 知道不
* 去死吧 - 去死
点击进入机场官网:富雨。
免费节点订阅链接:
v2ray订阅链接:
https://nodehub.loc/vfn/bdc9177b109b2339/20260207-v2ray.txt
clash订阅链接:
https://nodehub.loc/vfn/bdc9177b109b2339/20260207-clash.yaml
温馨提示:
本站提供的都是免费且公共的节点,稳定性与长时间连接速率无法与收费版的高速机场节点相提并论,不能奢望太多。
注意你自己的网络环境(本地连接当中的DNS,手动配置一下:114.114.114.114,8.8.8.8或是其它公共的DNS。)
如果某个网址无法代理访问,可切换到全局代理模式,一般可解决。
','https://resource.loc/upload/images/tg_xiuren_a-01KF5WX0N8VE3D773CFWZQBJVX-1-thumb_b.jpg',0,1,0,109,937,100010,'2026-02-07 00:09:20','2026-02-09 01:22:53'),
+(36,1,1,'「2月11日」2026年最新高速SSR/V2ray/Clash/Shadowrocket免费节点订阅链接','本次更新共37个可用节点,最高速度22M/S。\n覆盖台湾、越南、荷兰、冰岛、新加坡、台湾、土耳其、法国、加拿大等多个区域。\n复制下方的v2ray/Clash订阅链接,在客户端添加即可正常使用。','fn20260211','加入tg频道获取更多新鲜免费节点:t.me/v2rayfreenode_com。
本次更新共37个可用节点,最高速度22M/S。
覆盖台湾、越南、荷兰、冰岛、新加坡、台湾、土耳其、法国、加拿大等多个区域。
复制下方的v2ray/Clash订阅链接,在客户端添加即可正常使用。
机场推荐:
* 好好 - 就是好
* 不好不好 - 就是不好
* 你就是个瘠薄 - 知道不
* 去死吧 - 去死
点击进入机场官网:富雨。
免费节点订阅链接:
v2ray订阅链接:
https://nodehub.loc/vfn/ff0acf9080acfa7e/20260211-v2ray.txt
clash订阅链接:
https://nodehub.loc/vfn/ff0acf9080acfa7e/20260211-clash.yaml
温馨提示:
本站提供的都是免费且公共的节点,稳定性与长时间连接速率无法与收费版的高速机场节点相提并论,不能奢望太多。
注意你自己的网络环境(本地连接当中的DNS,手动配置一下:114.114.114.114,8.8.8.8或是其它公共的DNS。)
如果某个网址无法代理访问,可切换到全局代理模式,一般可解决。
','https://resource.loc/upload/images/tg_xiuren_a-01KF5WX0N8VE3D773CFWZQBJVX-1-thumb_c.jpg',0,1,0,0,11,NULL,'2026-02-10 23:39:40','2026-02-10 23:59:48');
+/*!40000 ALTER TABLE `articles` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `cache`
+--
+
+DROP TABLE IF EXISTS `cache`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `cache` (
+ `key` varchar(255) NOT NULL,
+ `value` mediumtext NOT NULL,
+ `expiration` int(11) NOT NULL,
+ PRIMARY KEY (`key`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `cache`
+--
+
+LOCK TABLES `cache` WRITE;
+/*!40000 ALTER TABLE `cache` DISABLE KEYS */;
+/*!40000 ALTER TABLE `cache` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `cache_locks`
+--
+
+DROP TABLE IF EXISTS `cache_locks`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `cache_locks` (
+ `key` varchar(255) NOT NULL,
+ `owner` varchar(255) NOT NULL,
+ `expiration` int(11) NOT NULL,
+ PRIMARY KEY (`key`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `cache_locks`
+--
+
+LOCK TABLES `cache_locks` WRITE;
+/*!40000 ALTER TABLE `cache_locks` DISABLE KEYS */;
+/*!40000 ALTER TABLE `cache_locks` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `categories`
+--
+
+DROP TABLE IF EXISTS `categories`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `categories` (
+ `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+ `iParentId` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '父级ID',
+ `sName` varchar(50) NOT NULL COMMENT '分类名称',
+ `sSlug` varchar(50) NOT NULL COMMENT 'URL标识',
+ `sDescription` varchar(255) DEFAULT NULL COMMENT '描述',
+ `iSort` int(11) NOT NULL DEFAULT 0 COMMENT '排序',
+ `iStatus` tinyint(4) NOT NULL DEFAULT 1 COMMENT '状态:1显示 0隐藏',
+ `sHtmlClass` varchar(50) DEFAULT NULL,
+ `iShowChildren` tinyint(4) DEFAULT 0,
+ `aBanner` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`aBanner`)),
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `categories_sslug_unique` (`sSlug`),
+ KEY `categories_istatus_index` (`iStatus`),
+ KEY `categories_iparentid_index` (`iParentId`)
+) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `categories`
+--
+
+LOCK TABLES `categories` WRITE;
+/*!40000 ALTER TABLE `categories` DISABLE KEYS */;
+INSERT INTO `categories` VALUES
+(1,0,'免费节点','freenode','',0,1,'fas fa-wifi',0,NULL),
+(2,0,'客户端','client','',0,1,'fab fa-app-store-ios',1,NULL),
+(3,2,'windows','windows',NULL,0,1,NULL,0,'{\"img_file\":\"windows.jpg\", \"img_top\":\"24%\"}'),
+(4,2,'andorid','andorid',NULL,0,1,NULL,0,NULL);
+/*!40000 ALTER TABLE `categories` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `dog_option`
+--
+
+DROP TABLE IF EXISTS `dog_option`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `dog_option` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `dog_name` varchar(255) DEFAULT NULL,
+ `k` varchar(255) DEFAULT NULL,
+ `v` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `unique_this_name_k` (`dog_name`,`k`)
+) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `dog_option`
+--
+
+LOCK TABLES `dog_option` WRITE;
+/*!40000 ALTER TABLE `dog_option` DISABLE KEYS */;
+/*!40000 ALTER TABLE `dog_option` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `failed_jobs`
+--
+
+DROP TABLE IF EXISTS `failed_jobs`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `failed_jobs` (
+ `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+ `uuid` varchar(255) NOT NULL,
+ `connection` text NOT NULL,
+ `queue` text NOT NULL,
+ `payload` longtext NOT NULL,
+ `exception` longtext NOT NULL,
+ `failed_at` timestamp NOT NULL DEFAULT current_timestamp(),
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `failed_jobs_uuid_unique` (`uuid`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `failed_jobs`
+--
+
+LOCK TABLES `failed_jobs` WRITE;
+/*!40000 ALTER TABLE `failed_jobs` DISABLE KEYS */;
+/*!40000 ALTER TABLE `failed_jobs` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `job_batches`
+--
+
+DROP TABLE IF EXISTS `job_batches`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `job_batches` (
+ `id` varchar(255) NOT NULL,
+ `name` varchar(255) NOT NULL,
+ `total_jobs` int(11) NOT NULL,
+ `pending_jobs` int(11) NOT NULL,
+ `failed_jobs` int(11) NOT NULL,
+ `failed_job_ids` longtext NOT NULL,
+ `options` mediumtext DEFAULT NULL,
+ `cancelled_at` int(11) DEFAULT NULL,
+ `created_at` int(11) NOT NULL,
+ `finished_at` int(11) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `job_batches`
+--
+
+LOCK TABLES `job_batches` WRITE;
+/*!40000 ALTER TABLE `job_batches` DISABLE KEYS */;
+/*!40000 ALTER TABLE `job_batches` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `jobs`
+--
+
+DROP TABLE IF EXISTS `jobs`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `jobs` (
+ `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+ `queue` varchar(255) NOT NULL,
+ `payload` longtext NOT NULL,
+ `attempts` tinyint(3) unsigned NOT NULL,
+ `reserved_at` int(10) unsigned DEFAULT NULL,
+ `available_at` int(10) unsigned NOT NULL,
+ `created_at` int(10) unsigned NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `jobs_queue_index` (`queue`)
+) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `jobs`
+--
+
+LOCK TABLES `jobs` WRITE;
+/*!40000 ALTER TABLE `jobs` DISABLE KEYS */;
+INSERT INTO `jobs` VALUES
+(1,'default','{\"uuid\":\"314518ec-b054-4d77-a356-1aa9ec26eaac\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769775319,\"delay\":null}',0,NULL,1769775319,1769775319),
+(2,'default','{\"uuid\":\"abc3fbce-24a0-4eaf-96c4-7fcaf00f95aa\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769776393,\"delay\":null}',0,NULL,1769776393,1769776393),
+(3,'default','{\"uuid\":\"7ad35a86-09cb-4d96-82c7-42750b0231bc\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769776737,\"delay\":null}',0,NULL,1769776737,1769776737),
+(4,'default','{\"uuid\":\"339cc071-8610-4382-9c5a-de4213562305\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769777044,\"delay\":null}',0,NULL,1769777044,1769777044),
+(5,'default','{\"uuid\":\"d424ace0-602a-4d8d-a2f8-4421f9a81aeb\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769777247,\"delay\":null}',0,NULL,1769777247,1769777247),
+(6,'default','{\"uuid\":\"6f098b90-ead8-4da3-87b9-59e253c03372\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769777583,\"delay\":null}',0,NULL,1769777583,1769777583),
+(7,'default','{\"uuid\":\"e16751ef-3835-477a-bcdd-4f58799a7e6e\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769777778,\"delay\":null}',0,NULL,1769777778,1769777778),
+(8,'default','{\"uuid\":\"d6494cf5-1d0b-47e2-ab4f-cc9a0a9a0f5c\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769777794,\"delay\":null}',0,NULL,1769777794,1769777794),
+(9,'default','{\"uuid\":\"c6de7ee4-7f70-4a55-a954-f7b3d9c2a187\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769778083,\"delay\":null}',0,NULL,1769778083,1769778083),
+(10,'default','{\"uuid\":\"219e91da-b167-4342-9135-3199d3d6731e\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769780368,\"delay\":null}',0,NULL,1769780368,1769780368),
+(11,'default','{\"uuid\":\"d59f8460-c8ae-4587-b651-b42f1cd4c592\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769780529,\"delay\":null}',0,NULL,1769780529,1769780529),
+(12,'default','{\"uuid\":\"901ccd34-c4cf-44f3-a770-265c71567ee7\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769780620,\"delay\":null}',0,NULL,1769780620,1769780620),
+(13,'default','{\"uuid\":\"4616bf6b-cc4f-4379-941c-88d99f89e8cf\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769832922,\"delay\":null}',0,NULL,1769832922,1769832922),
+(14,'default','{\"uuid\":\"28ee4b0b-2e02-4a73-9da2-c99180cca4ab\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769833122,\"delay\":null}',0,NULL,1769833122,1769833122),
+(15,'default','{\"uuid\":\"1870c533-c149-498d-9b33-dc5dd75c9195\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769833645,\"delay\":null}',0,NULL,1769833646,1769833646),
+(16,'default','{\"uuid\":\"9b079f8e-c05a-4f41-baa9-ae56908f2832\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769833715,\"delay\":null}',0,NULL,1769833715,1769833715),
+(17,'default','{\"uuid\":\"e719def7-8635-4c24-b8c9-55dd64686001\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769833825,\"delay\":null}',0,NULL,1769833825,1769833825),
+(18,'default','{\"uuid\":\"6e69c65a-6de9-4e29-ac49-dd0e62700493\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769833876,\"delay\":null}',0,NULL,1769833876,1769833876),
+(19,'default','{\"uuid\":\"f6052246-365d-45e7-8124-963cc9a8e9cc\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769833926,\"delay\":null}',0,NULL,1769833926,1769833926),
+(20,'default','{\"uuid\":\"7f0e95cd-0440-447e-b0ed-61deec6ef651\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769833959,\"delay\":null}',0,NULL,1769833959,1769833959),
+(21,'default','{\"uuid\":\"a6c5b6b2-5029-48ff-93f4-3334c8f33983\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769834017,\"delay\":null}',0,NULL,1769834017,1769834017),
+(22,'default','{\"uuid\":\"60f78b6b-3fc0-4a55-918d-d2a5db67211d\",\"displayName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"maxExceptions\":null,\"failOnTimeout\":false,\"backoff\":null,\"timeout\":null,\"retryUntil\":null,\"data\":{\"commandName\":\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\",\"command\":\"O:33:\\\"Laravel\\\\Scout\\\\Jobs\\\\MakeSearchable\\\":2:{s:6:\\\"models\\\";O:45:\\\"Illuminate\\\\Contracts\\\\Database\\\\ModelIdentifier\\\":5:{s:5:\\\"class\\\";s:19:\\\"App\\\\Models\\\\Articles\\\";s:2:\\\"id\\\";a:29:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:8;i:7;i:9;i:8;i:10;i:9;i:11;i:10;i:12;i:11;i:13;i:12;i:14;i:13;i:15;i:14;i:16;i:15;i:17;i:16;i:18;i:17;i:19;i:18;i:20;i:19;i:21;i:20;i:22;i:21;i:23;i:22;i:24;i:23;i:25;i:24;i:26;i:25;i:27;i:26;i:28;i:27;i:29;i:28;i:30;}s:9:\\\"relations\\\";a:0:{}s:10:\\\"connection\\\";s:5:\\\"mysql\\\";s:15:\\\"collectionClass\\\";N;}s:10:\\\"connection\\\";s:8:\\\"database\\\";}\"},\"createdAt\":1769834486,\"delay\":null}',0,NULL,1769834486,1769834486);
+/*!40000 ALTER TABLE `jobs` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `migrations`
+--
+
+DROP TABLE IF EXISTS `migrations`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `migrations` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `migration` varchar(255) NOT NULL,
+ `batch` int(11) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `migrations`
+--
+
+LOCK TABLES `migrations` WRITE;
+/*!40000 ALTER TABLE `migrations` DISABLE KEYS */;
+/*!40000 ALTER TABLE `migrations` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `option`
+--
+
+DROP TABLE IF EXISTS `option`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `option` (
+ `k` varchar(255) NOT NULL,
+ `v` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`k`),
+ UNIQUE KEY `k` (`k`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `option`
+--
+
+LOCK TABLES `option` WRITE;
+/*!40000 ALTER TABLE `option` DISABLE KEYS */;
+INSERT INTO `option` VALUES
+('dog_limit','30');
+/*!40000 ALTER TABLE `option` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `password_reset_tokens`
+--
+
+DROP TABLE IF EXISTS `password_reset_tokens`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `password_reset_tokens` (
+ `email` varchar(255) NOT NULL,
+ `token` varchar(255) NOT NULL,
+ `created_at` timestamp NULL DEFAULT NULL,
+ PRIMARY KEY (`email`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `password_reset_tokens`
+--
+
+LOCK TABLES `password_reset_tokens` WRITE;
+/*!40000 ALTER TABLE `password_reset_tokens` DISABLE KEYS */;
+/*!40000 ALTER TABLE `password_reset_tokens` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `sessions`
+--
+
+DROP TABLE IF EXISTS `sessions`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `sessions` (
+ `id` varchar(255) NOT NULL,
+ `user_id` bigint(20) unsigned DEFAULT NULL,
+ `ip_address` varchar(45) DEFAULT NULL,
+ `user_agent` text DEFAULT NULL,
+ `payload` longtext NOT NULL,
+ `last_activity` int(11) NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `sessions_user_id_index` (`user_id`),
+ KEY `sessions_last_activity_index` (`last_activity`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `sessions`
+--
+
+LOCK TABLES `sessions` WRITE;
+/*!40000 ALTER TABLE `sessions` DISABLE KEYS */;
+INSERT INTO `sessions` VALUES
+('4wDk8oLxXxcc1ec81FFkzmEA7B1XnxwxAeibg2RA',NULL,'127.0.0.1','','YToyOntzOjY6Il90b2tlbiI7czo0MDoibTlsZnRTRUxnZ2FMNlZXUnZoRmZjQzZXUWNuOHdWRFZPQU9JWFp3USI7czo2OiJfZmxhc2giO2E6Mjp7czozOiJvbGQiO2E6MDp7fXM6MzoibmV3IjthOjA6e319fQ==',1770796010),
+('H6gerOjhSpvfaVoI850Wit0KWDKobktEs0pmTVUz',NULL,'127.0.0.1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3 Safari/605.1.15','YTozOntzOjY6Il90b2tlbiI7czo0MDoib3dMWEl2Q0pSNEc0R05xTEdqQVlkTXUxRmVGM2NiUHpuQll2OXhnbCI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MjQ6Imh0dHA6Ly9mbi1iLmxvYy9mcmVlbm9kZSI7czo1OiJyb3V0ZSI7czoxMzoiYXJ0aWNsZXMubGlzdCI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=',1770804442),
+('qnewggVDrZqiqXZEXOQ9I5RbTBTsWf3RjEhkjm7F',NULL,'127.0.0.1','','YToyOntzOjY6Il90b2tlbiI7czo0MDoiWVRhTDFCWDdHWXR3bXFyWlBtenBGY0ZxWGNCZWxpcjFhYUtkR3VQeCI7czo2OiJfZmxhc2giO2E6Mjp7czozOiJvbGQiO2E6MDp7fXM6MzoibmV3IjthOjA6e319fQ==',1770795582),
+('r3May3X9tUPh7997YKw6Dm6GrRIFrWF57eF16xTr',NULL,'127.0.0.1','','YToyOntzOjY6Il90b2tlbiI7czo0MDoiOTAzZEVza3pOMHRsSTFaTUNBSU1MRXFZcUl2V1VtNTNQNFhWYWpBcSI7czo2OiJfZmxhc2giO2E6Mjp7czozOiJvbGQiO2E6MDp7fXM6MzoibmV3IjthOjA6e319fQ==',1770796533),
+('V6y6YVIMJpxRJb1FNFYLSEXBSs1SBLL5fMbwynb3',NULL,'127.0.0.1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3 Safari/605.1.15','YTozOntzOjY6Il90b2tlbiI7czo0MDoiQlpZeHRIenZNbG13VmZIU2xOUDliS1dIVW9ZbGE4akdVc3NHbDVHSiI7czo5OiJfcHJldmlvdXMiO2E6Mjp7czozOiJ1cmwiO3M6MTU6Imh0dHA6Ly9mbi1iLmxvYyI7czo1OiJyb3V0ZSI7czoxMzoiYXJ0aWNsZXMuaG9tZSI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=',1770801403),
+('wTzOJU2pCja2CqJ9ItP3p4Lj5gTs5cSMbeyzZpUA',NULL,'127.0.0.1','','YToyOntzOjY6Il90b2tlbiI7czo0MDoiQXBkRmh4TlJoTzBJY0IxbUVyMjVnNjE1bE4xT3JwQVVRUUlMeG82QiI7czo2OiJfZmxhc2giO2E6Mjp7czozOiJvbGQiO2E6MDp7fXM6MzoibmV3IjthOjA6e319fQ==',1770796790);
+/*!40000 ALTER TABLE `sessions` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `tags`
+--
+
+DROP TABLE IF EXISTS `tags`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `tags` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `sName` varchar(50) NOT NULL,
+ `sSlug` varchar(50) NOT NULL,
+ `iArticleCount` int(11) unsigned DEFAULT 0,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `slug_unique` (`sSlug`),
+ KEY `iArticleCount` (`iArticleCount`)
+) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `tags`
+--
+
+LOCK TABLES `tags` WRITE;
+/*!40000 ALTER TABLE `tags` DISABLE KEYS */;
+INSERT INTO `tags` VALUES
+(5,'Shadowrocket','shadowrocket-7vf7o',2),
+(6,'Quantumult','quantumult-Ggc90',2),
+(7,'Clash','clash-wd81q',2),
+(8,'SSR','ssr-BjeEq',2),
+(9,'节点','jie-dian-yIt5z',2),
+(10,'订阅链接','ding-yue-lian-jie-ruNF0',2),
+(11,'免费节点','mian-fei-jie-dian-hOpYo',2),
+(12,'v2ray','v2ray-Pd4HR',2);
+/*!40000 ALTER TABLE `tags` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `users`
+--
+
+DROP TABLE IF EXISTS `users`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `users` (
+ `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+ `name` varchar(255) NOT NULL,
+ `email` varchar(255) NOT NULL,
+ `email_verified_at` timestamp NULL DEFAULT NULL,
+ `password` varchar(255) NOT NULL,
+ `remember_token` varchar(100) DEFAULT NULL,
+ `created_at` timestamp NULL DEFAULT NULL,
+ `updated_at` timestamp NULL DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `users_email_unique` (`email`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `users`
+--
+
+LOCK TABLES `users` WRITE;
+/*!40000 ALTER TABLE `users` DISABLE KEYS */;
+INSERT INTO `users` VALUES
+(1,'v2rayfreenode','v2rayfreenode',NULL,'111',NULL,NULL,NULL);
+/*!40000 ALTER TABLE `users` ENABLE KEYS */;
+UNLOCK TABLES;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+/*M!100616 SET NOTE_VERBOSITY=@OLD_NOTE_VERBOSITY */;
+
+-- Dump completed on 2026-02-11 18:12:42
diff --git a/app/Console/Commands/ClearDb.php b/app/Console/Commands/ClearDb.php
new file mode 100755
index 00000000..cfabc6e6
--- /dev/null
+++ b/app/Console/Commands/ClearDb.php
@@ -0,0 +1,40 @@
+info("开始清理过期数据...");
+
+ $this->articleLikes();
+
+ $this->info("数据清理完成 !");
+ }
+
+ private function articleLikes()
+ {
+ // 1. 确定 30 天前的时间点
+ $oThresholdDate = now()->subDays(30);
+
+ // 2. 执行删除:直接在数据库层面一锅端
+ // 药水哥提示:这样写只发一条 DELETE SQL,效率最高!
+ $iDeletedCount = ArticleLikes::where('created_at', '<', $oThresholdDate)->delete();
+
+ // 3. 给点反馈,这叫“开发者的温柔”
+ if ($iDeletedCount > 0) {
+ $this->warn("已成功清理 {$iDeletedCount} 条 30 天前的点赞记录!");
+ } else {
+ $this->info("点赞表很干净,没有过期数据。");
+ }
+ }
+
+}
diff --git a/app/Console/Commands/StatOrderLikes_meiyong.php b/app/Console/Commands/StatOrderLikes_meiyong.php
new file mode 100755
index 00000000..ba31e99c
--- /dev/null
+++ b/app/Console/Commands/StatOrderLikes_meiyong.php
@@ -0,0 +1,71 @@
+info("order-likes开始渲染...");
+//
+// $aOrderLikes = ArticleLikes::with(['oArticle' => function($query) {
+// $query->where('iStatus', 1); // 只拿发布的,草稿别出来丢人
+// }])
+// ->orderBy('created_at', 'desc')
+// ->limit(10) // 拿最近的 10 条点赞记录
+// ->get();
+//
+// $sHtml = View::make('components.order-likes', ['oOrderLikes' => $aOrderLikes])->render();
+//
+// $sFilePath = resource_path('views/components/generated-order-likes.blade.php');
+//
+// File::put($sFilePath, "\n" . $sHtml);
+//
+// $this->info("渲染完成 !");
+// }
+
+ public function handle(): void
+ {
+ $this->info("开始统计最近 7 天点赞排名并渲染...");
+
+ // 1. 获取 7 天前的时间点
+ $oStartDate = now()->subDays(30);
+
+ // 2. 高标准聚合查询
+ $aOrderLikes = ArticleLikes::select('iArticleId', \DB::raw('count(*) as iTotalLikes'))
+ ->where('created_at', '>=', $oStartDate) // 只要最近 7 天的
+ ->groupBy('iArticleId')
+ ->orderBy('iTotalLikes', 'desc') // 按点赞总数排
+ ->with(['oArticle' => function($query) {
+ $query->where('iStatus', 1); // 同样,草稿文章爬远点
+ }])
+ ->limit(10)
+ ->get()
+ ->filter(function($oItem) {
+ return $oItem->oArticle !== null; // 过滤掉万一被删了的文章
+ });
+
+ // 3. 渲染 HTML
+ // 药水哥提示:这里的变量名我改成了更加语义化的 aHotArticles
+ $sHtml = View::make('components.order-likes', ['oOrderLikes' => $aOrderLikes])->render();
+
+ // 4. 写入文件(保持你的风格)
+ $sFilePath = resource_path('views/components/generated-order-likes.blade.php');
+
+ // 增加一行注释,方便后期 debug 知道这玩意儿是什么时候生成的
+ $sComment = "toDateTimeString() . " */ ?>\n";
+ File::put($sFilePath, $sComment . $sHtml);
+
+ $this->info("7天点赞排名渲染完成 !");
+ }
+
+}
diff --git a/app/Console/Commands/StatTagsCloud.php b/app/Console/Commands/StatTagsCloud.php
new file mode 100755
index 00000000..dfb745b7
--- /dev/null
+++ b/app/Console/Commands/StatTagsCloud.php
@@ -0,0 +1,63 @@
+info("tags-cloud开始渲染...");
+
+ DB::transaction(function () {
+ // 1. 使用 JOIN 方式批量更新,iArticleCount 默认为 0
+ // 这种写法比子查询更符合数据库执行计划优化
+ DB::table('tags')->update(['iArticleCount' => 0]);
+
+ DB::statement("
+ UPDATE tags t
+ INNER JOIN (
+ SELECT iTagId, COUNT(*) as iTotal
+ FROM article_tag
+ GROUP BY iTagId
+ ) at ON t.id = at.iTagId
+ SET t.iArticleCount = at.iTotal
+ ");
+ });
+
+ // 2. 渲染视图并持久化
+ $this->renderToComponent();
+
+ $this->info("渲染完成!");
+ }
+
+ /**
+ * 高标准:将统计结果预渲染,减少运行时查询
+ */
+ private function renderToComponent(): void
+ {
+ // a 前缀,获取统计后的标签列表
+ $aTags = DB::table('tags')
+ ->where('iArticleCount', '>', 0)
+ ->orderByDesc('iArticleCount')
+ ->get()
+ ->toArray();
+
+ // 渲染 Blade 模板内容
+ // 假设你的模板在 resources/views/components/tags-cloud-content.blade.php
+ $sHtml = View::make('components.tags-cloud', ['aTags' => $aTags])->render();
+
+ // 将渲染好的 HTML 写入 resources 目录下的一个静态片段中
+ // 这样组件调用时直接 @include,性能起飞
+ $sFilePath = resource_path('views/components/generated-tags-cloud.blade.php');
+
+ File::put($sFilePath, "\n" . $sHtml);
+ }
+}
diff --git a/app/Console/Commands/SyncArticleLikes.php b/app/Console/Commands/SyncArticleLikes.php
new file mode 100755
index 00000000..3bfe25da
--- /dev/null
+++ b/app/Console/Commands/SyncArticleLikes.php
@@ -0,0 +1,78 @@
+everyFiveMinutes()
+ protected $signature = 'article:sync-likes';
+ protected $description = '高标准点赞:7天自动碎化 + 全年天级随机';
+
+ public function handle()
+ {
+ $iBurstCount = 0; // 记录本次执行爆发了多少文章
+ $iYearlyCount = 0; // 记录本次执行有多少文章中了全年奖
+
+ // 1. 【7天爆发】碎化注入逻辑
+ Articles::where('i7like', '>', 0)
+ ->where('iStatus', 1)
+ ->chunkById(100, function ($aArticles) use (&$iBurstCount) {
+ foreach ($aArticles as $oArticle) {
+ $iDaysPassed = $oArticle->created_at->diffInDays(now());
+ if ($iDaysPassed > 6) continue;
+
+ $iRemainingSlots = (7 - $iDaysPassed) * 24 * 12;
+ if ($iRemainingSlots <= 0) continue;
+
+ $iBaseAdd = (int)ceil($oArticle->i7like / $iRemainingSlots);
+
+ if (mt_rand(1, 100) <= 50) {
+ $iAdd = mt_rand(1, max(1, $iBaseAdd * 2));
+ $this->transferLikes($oArticle, 'i7like', $iAdd);
+
+ $this->info("ID [{$oArticle->id}] 爆发:注入 {$iAdd} 个赞,剩余库存 {$oArticle->i7like}");
+ $iBurstCount++;
+ }
+ }
+ });
+
+ // 2. 【全年增长】天级随机逻辑
+ $sLockKey = 'sync_yearly_likes_lock:' . now()->format('Ymd');
+ if (!Cache::has($sLockKey)) {
+ $this->warn("检测到今日尚未进行全年随机摇号,开始抽奖...");
+
+ Articles::where('i365like', '>', 0)
+ ->where('iStatus', 1)
+ ->chunkById(100, function ($aArticles) use (&$iYearlyCount) {
+ foreach ($aArticles as $oArticle) {
+ if (mt_rand(1, 365) <= $oArticle->i365like) {
+ $oArticle->increment('iLikeCount');
+ $this->line("ID [{$oArticle->id}] 全年:运气爆发,喜提 1 个赞");
+ $iYearlyCount++;
+ }
+ }
+ });
+
+ Cache::put($sLockKey, 1, now()->addDay());
+ }
+
+ $this->comment("本次任务结束:{$iBurstCount} 篇爆发增长,{$iYearlyCount} 篇全年喜提。");
+ }
+
+ /**
+ * 核心转移逻辑
+ */
+ private function transferLikes(Articles $oArticle, string $sField, int $iAmount): void
+ {
+ $iRealAdd = min($oArticle->$sField, $iAmount);
+ if ($iRealAdd > 0) {
+ $oArticle->increment('iLikeCount', $iRealAdd);
+ // 这里注意:increment/decrement 会同步更新 model 对象的内存值
+ $oArticle->decrement($sField, $iRealAdd);
+ }
+ }
+}
diff --git a/app/Http/Controllers/Api/CacheController.php b/app/Http/Controllers/Api/CacheController.php
new file mode 100755
index 00000000..2ce954a7
--- /dev/null
+++ b/app/Http/Controllers/Api/CacheController.php
@@ -0,0 +1,28 @@
+sTitle = time();
+ $o->save();
+
+ tt($o->toArray());
+ }
+}
diff --git a/app/Http/Controllers/Api/v1/ArticlesController.php b/app/Http/Controllers/Api/v1/ArticlesController.php
new file mode 100755
index 00000000..601556e3
--- /dev/null
+++ b/app/Http/Controllers/Api/v1/ArticlesController.php
@@ -0,0 +1,79 @@
+all();
+ $aArticle = $aData["article"];
+ $sArticleTitle = $aArticle["title"];
+ $sArticleTitleSub = $aArticle["title_sub"];
+ $sArticleContent = $aArticle["content"];
+ $aArticleTags = $aArticle["tags"];
+ $sSlug = 'fn'.date("Ymd");
+ $sImgAuthor = "tg_xiuren_a";
+ $i7like = $aArticle["7like"];
+
+ $oThumbNum = ArticleFreenodeThumbNum::firstOrCreate(["author_code" => $sImgAuthor]);
+ $iThumbNum = $oThumbNum->num;
+
+ $sImagesApi = "https://".config("path.url_resource_base")."/api/images/get/url-by-num";
+
+ $aApiArg = [
+ "sAuthorCode" => $sImgAuthor,
+ "iNum" => $iThumbNum+1,
+ ];
+ $sApiResult = HttpV2::make($sImagesApi, "post")->withToken()->setDataA($aApiArg)->send();
+ $aApiResult = json_decode($sApiResult, true);
+
+ if (!isset($aApiResult["isDone"]) || !$aApiResult["isDone"]) {
+ echo $sApiResult;
+ return response()->json($oFlow->fail("{$sObjName}的图片api调用失败"));
+ }
+
+ $sThumbPath = $aApiResult["aData"]["sFileUrl"];
+ $sThumbNumTrue = $aApiResult["aData"]["iTrueNum"];
+
+ $oCategories = Categories::where("sSlug", "freenode")->first();
+
+ $oArticle = Articles::updateOrCreate(
+ ['sSlug' => $sSlug],
+ [
+ 'sThumb' => $sThumbPath,
+ 'iCategoryId' => $oCategories->id,
+ 'sTitle' => $sArticleTitle,
+ 'sTitleSub' => $sArticleTitleSub,
+ 'sContent' => $sArticleContent,
+ 'i7like' => $i7like,
+ 'iStatus' => 1,
+ 'iUserId' => 1,
+ ],
+ );
+
+ (new TagService())->syncArticleTagsByName($oArticle, $aArticleTags);
+
+ ArticleFreenodeThumbNum::where("author_code", $sImgAuthor)->update(["num" => $sThumbNumTrue]);
+
+ $sArticleUrl = config("app.url")."/feenode/".$sSlug;
+
+ TeleSlave::notify()->send($sArticleUrl." 发布成功");
+
+ return response()->json($oFlow->done());
+ }
+}
diff --git a/app/Http/Controllers/Api/v1/Telegram/HookController.php b/app/Http/Controllers/Api/v1/Telegram/HookController.php
new file mode 100755
index 00000000..9836f7e2
--- /dev/null
+++ b/app/Http/Controllers/Api/v1/Telegram/HookController.php
@@ -0,0 +1,197 @@
+sCustomText = "/cacheTg#add__{$sGroupCode}"." ".$sUpdate;
+ }
+
+ $this->cmd();
+
+ } catch (\Throwable $e) {
+
+ $aDataTg = ThrowableHandler::make($e)->enableTrace()->fetch();
+ TelegramSlave::fail()->enableSlaveQueue(false)->setMsgA([
+ "msg" => $aDataTg,
+ "data" => $sUpdate,
+ ])->send();
+
+ $aDataCmd = $aDataTg;
+ $sDataCmd = json_encode($aDataCmd, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
+ $sDataCmd = str_replace("\\n", "
", $sDataCmd);
+ echo $sDataCmd;
+ exit;
+ }
+ }
+
+ public function cmd_ffq_article()
+ {
+ try {
+
+ $sUpdate = file_get_contents("php://input");
+ $aUpdate = json_decode($sUpdate, true);
+ $sText = $aUpdate["message"]["text"] ?? "没有text";
+ if (!str_starts_with($sText, '/')) {
+ // $this->sCustomCmd = "article";
+ // $this->sCustomFunc = "cache";
+ // $this->aCustomOption[1] = "ffq";
+ $this->sCustomText = "/article#cacheAdd__ffq_tg_a"." ".$sUpdate;
+ }
+
+ $this->cmd();
+
+ } catch (\Throwable $e) {
+
+ $aDataTg = ThrowableHandler::make($e)->enableTrace()->fetch();
+ TelegramSlave::fail()->enableSlaveQueue(false)->setMsgA([
+ "msg" => $aDataTg,
+ "data" => $sUpdate,
+ ])->send();
+
+ $aDataCmd = $aDataTg;
+ $sDataCmd = json_encode($aDataCmd, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
+ $sDataCmd = str_replace("\\n", "
", $sDataCmd);
+ echo $sDataCmd;
+ exit;
+ }
+ }
+
+ public function cmd()
+ {
+
+ try {
+
+ $oTGHttp = new TGHttp();
+
+ $oTGHttp->sApiToken = env('telegram_token');
+ $oTGHttp->sApiChatId = env('telegram_chatid');
+
+ $sUpdate = file_get_contents("php://input");
+
+ $aUpdate = json_decode($sUpdate, true);
+// @file_put_contents('/www/_tg/bot_log.txt', json_encode($aUpdate, JSON_PRETTY_PRINT));
+
+ $aData['chatId'] = (string) $aUpdate["message"]["chat"]["id"];
+ $aData['fromId'] = (string) $aUpdate["message"]["from"]["id"];
+
+ if ($this->sCustomText) {
+ $aUpdate["message"]["text"] = $this->sCustomText;
+ }
+
+ if (!isset($aUpdate["message"]["text"])) {
+ throw new \Exception(json_encode($aUpdate));
+ }
+
+ $sText = $aUpdate["message"]["text"];
+
+ // hook优先
+ // 非is_hook,并且,首字符非/
+ if ((!isset($aUpdate["is_hook"]) || $aUpdate["is_hook"] == false) && substr($sText, 0, 1) !== "/") {
+
+ $sHookKey = ModelHook::where("tg_user_id", $aData["fromId"])->first()?->key;
+
+ if ($sHookKey) {
+ if ($sText == "run") {
+ $sText = $sHookKey;
+ } else {
+ $sText = $sHookKey.$sText;
+ }
+ $aUpdate["is_hook"] = true;
+ }
+
+ }
+
+ @$aArg = explode(" ", $sText) ?? [];
+ @$aOption = explode("__", $aArg[0]) ?? [];
+
+ $sCmd = $this->cleanCmd($aOption[0]);
+
+ // 大于3个说明是hook或dove之类
+ $aCmd = explode("#", $sCmd);
+// if (count($aCmd) >= 3) {
+// $sHook = $aCmd[0];
+// $sClass = $sHook;
+// $sFunc = "go";
+// } else {
+ $sClass = $aCmd[0] ?? false;
+ $sFunc = $aCmd[1] ?? false;
+// }
+
+ if (strpos($sClass, "dove$") !== false) {
+ $sClass = "dove";
+ $sFunc = "go";
+ }
+
+ $sUClass = ucfirst($sClass);
+ $sUFunc = ucfirst($sFunc);
+
+ unset($aOption[0]);
+ unset($aArg[0]);
+
+ $aParams = [];
+ $aParams['aOption'] = $aOption;
+ $aParams['aArg'] = $aArg;
+
+ $sClassPath = "App\\Services\\Tg\\Hook\\Mod\\".$sClass;
+ $sUClassPath = "App\\Services\\Tg\\Hook\\Mod\\".$sUClass;
+
+ $oInstans = new $sUClassPath($aUpdate);
+ $r = $oInstans->$sFunc($aParams, $aUpdate);
+
+ $oTGHttp->send($r, $aUpdate);
+
+ echo $r;
+
+ } catch (\Throwable $e) {
+
+ $aDataTg = ThrowableHandler::make($e)->enableTrace()->fetch();
+ TelegramSlave::fail()->enableSlaveQueue(false)->setMsgA($aDataTg)->send();
+
+ $aDataCmd = $aDataTg;
+ $aDataCmd["_update"] = $aUpdate;
+ $sDataCmd = json_encode($aDataCmd, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
+ $sDataCmd = str_replace("\\n", "
", $sDataCmd);
+ echo $sDataCmd;
+ exit;
+
+ // old
+// $sMessage = "错误(文件: " . $e->getFile() . ",行: " . $e->getLine() . "): " . $e->getMessage();
+// $oTGHttp->send($sMessage, $sUpdate);
+// //Http::response(200, 'error'); 注释的
+ // old end
+
+
+ }
+ }
+
+ private function cleanCmd($input) {
+
+ $input = str_replace('\\', '', $input);
+ $input = str_replace('/', '', $input);
+
+ return $input;
+ }
+
+}
+
diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php
new file mode 100755
index 00000000..75dde6ab
--- /dev/null
+++ b/app/Http/Controllers/Controller.php
@@ -0,0 +1,8 @@
+oArticlesService = $oService;
+ }
+
+ public function search(Request $oRequest, string $sKeyword)
+ {
+ $xData = $this->oArticlesService->search($sKeyword, 'view');
+ return view('pages.articles.default.index', $xData);
+ }
+
+ public function like(int $iArticleId, Request $oRequest)
+ {
+ // 1. 获取/生成指纹
+ $sFingerprint = $oRequest->cookie('visitor_token')
+ ?? md5($oRequest->ip() . $oRequest->userAgent());
+
+ // 2. 调用 Service
+ $aResult = $this->oArticlesService->like($iArticleId, $oRequest->ip(), $sFingerprint);
+
+ if (!$aResult['status']) {
+ return response()->json($aResult);
+ }
+
+ // 3. 成功后下发持久 Cookie
+ return response()->json($aResult)
+ ->withCookie(cookie()->forever('visitor_token', $sFingerprint));
+ }
+
+ public function listByTag(Request $oRequest, string $sSlug)
+ {
+ $xData = $this->oArticlesService->getTagArticles($sSlug, 'view');
+ return view('pages.articles.default.index', $xData);
+ }
+
+ public function list(Request $oRequest, string $sSlug1, string $sSlug2 = null)
+ {
+ $sSlug = $sSlug2 ?? $sSlug1;
+ $xData = $this->oArticlesService->getCategoryArticles($sSlug, 'view');
+ return view('pages.articles.default.index', $xData);
+ }
+
+ public function show(string $sArticleSlug, Request $oRequest)
+ {
+ $sFingerprint = $oRequest->cookie('visitor_token')
+ ?? md5($oRequest->ip() . $oRequest->userAgent());
+
+ $xData = $this->oArticlesService->getArticle($sArticleSlug, $oRequest->ip(), $sFingerprint);
+
+// $xData["siteUrl"] = config("app.url");
+
+ $sViewPath = 'pages.articles.default.show';
+//
+// if ($xData["oArticle"]->oCategory->sSlug == "freenode") {
+// $sViewPath = 'pages.articles.freenode.show';
+// }
+
+ return view($sViewPath, $xData);
+ }
+}
+
diff --git a/app/Http/Controllers/Web/TagsController.php b/app/Http/Controllers/Web/TagsController.php
new file mode 100755
index 00000000..f9fe365a
--- /dev/null
+++ b/app/Http/Controllers/Web/TagsController.php
@@ -0,0 +1,26 @@
+articles()
+// ->with(['category', 'user']) // 预加载作者和分类,优雅!
+// ->where('iStatus', 1) // 只看发布状态的
+// ->orderByDesc('created_at')
+// ->paginate(15);
+//
+// return view('tag.show', [
+// 'oTag' => $oTag,
+// 'aArticles' => $aArticles
+// ]);
+ }
+}
diff --git a/app/Http/Middleware/ApiCheckToken.php b/app/Http/Middleware/ApiCheckToken.php
new file mode 100755
index 00000000..7f8b702f
--- /dev/null
+++ b/app/Http/Middleware/ApiCheckToken.php
@@ -0,0 +1,25 @@
+bearerToken();
+ $sLocalToken = (string) env('token_base', false);
+
+ // 严丝合缝的校验
+ if (!$sIncomingToken || $sIncomingToken !== $sLocalToken) {
+ return response()->json(['msg' => 'token error'], 401);
+ }
+
+ return $next($oRequest);
+ }
+}
diff --git a/app/Models/ArticleFreenodeThumbNum.php b/app/Models/ArticleFreenodeThumbNum.php
new file mode 100755
index 00000000..1c71af0f
--- /dev/null
+++ b/app/Models/ArticleFreenodeThumbNum.php
@@ -0,0 +1,12 @@
+ 'array',
+// ];
+
+ public function oArticle()
+ {
+ return $this->belongsTo(Articles::class, 'iArticleId', 'id');
+ }
+
+}
diff --git a/app/Models/Articles.php b/app/Models/Articles.php
new file mode 100755
index 00000000..1e0f0697
--- /dev/null
+++ b/app/Models/Articles.php
@@ -0,0 +1,113 @@
+created_at,防止它还没被实例化成 Carbon 对象
+ $oDate = \Carbon\Carbon::parse($this->created_at);
+ $oNow = \Carbon\Carbon::now();
+
+ // 2. 计算小时差(强制转整数)
+ $iHours = (int)$oDate->diffInHours($oNow);
+
+ if ($iHours < 1) {
+ // 不足 1 小时,看看是不是不足 1 分钟
+ $iMinutes = (int)$oDate->diffInMinutes($oNow);
+ return $iMinutes < 1 ? '刚刚' : $iMinutes . '分钟前';
+ }
+
+ if ($iHours < 24) {
+ return $iHours . '小时前';
+ }
+
+ // 3. 计算天数差(强制转整数)
+ $iDays = (int)$oDate->diffInDays($oNow);
+ if ($iDays < 30) {
+ return $iDays . '天前';
+ }
+
+ // 超过一个月直接显示日期
+ return $oDate->format('Y-m-d');
+ });
+ }
+
+ public function shouldBeSearchable(): bool
+ {
+ return (int)$this->iStatus === 1;
+ }
+
+ public function searchableAs(): string
+ {
+ return 'articles';
+ }
+
+ public function toSearchableArray(): array
+ {
+ // 药水哥原则:字段要精准,类型要死磕
+ return [
+ 'id' => (int) $this->id,
+ 'iCategoryId' => (int) $this->iCategoryId,
+ 'sCategoryName' => (string) ($this->oCategory->sName ?? 'none'),
+ 'sCategorySlug' => (string) ($this->oCategory->sSlug ?? 'none'),
+ 'sTitle' => (string) $this->sTitle,
+ 'sTitleSub' => (string) $this->sTitleSub,
+ 'sSlug' => (string) $this->sSlug,
+ 'sContent' => (string) mb_substr(strip_tags($this->sContent), 0, 500),
+ 'iStatus' => (int) $this->iStatus,
+ 'iIsTop' => (int) $this->iIsTop,
+ 'updated_at' => (int) $this->updated_at->timestamp,
+ ];
+ }
+
+ protected static function booted()
+ {
+ static::saved(function () {
+ ResponseCache::forget('/'); // 要改成具体文章
+ });
+
+ static::deleted(function () {
+ ResponseCache::forget('/'); // 要改成具体文章
+ });
+ }
+
+
+
+ public function oTags(): BelongsToMany
+ {
+ return $this->belongsToMany(
+ Tags::class,
+ 'article_tag',
+ 'iArticleId',
+ 'iTagId'
+ );
+ }
+
+ public function oCategory(): BelongsTo {
+ return $this->belongsTo(Categories::class, 'iCategoryId', 'id');
+ }
+
+ public function oUser()
+ {
+ return $this->belongsTo(User::class, 'iUserId', 'id');
+ }
+
+}
+
diff --git a/app/Models/Categories.php b/app/Models/Categories.php
new file mode 100755
index 00000000..06c2f211
--- /dev/null
+++ b/app/Models/Categories.php
@@ -0,0 +1,49 @@
+ 'array',
+ ];
+
+ protected $touches = ['oArticles'];
+
+ public function aArticles(): HasMany {
+ return $this->hasMany(Articles::class, 'iCategoryId', 'id');
+ }
+
+ public function aChildren()
+ {
+ return $this->hasMany(Categories::class, 'iParentId', 'id')->orderBy('iSort', 'desc');
+ }
+
+ public function oParent()
+ {
+ return $this->belongsTo(Categories::class, 'iParentId', 'id');
+ }
+
+ protected static function booted()
+ {
+ static::saved(fn() => Cache::forget('global_nav_tree'));
+ static::deleted(fn() => Cache::forget('global_nav_tree')); // 删除时也要清,这才叫严谨!
+ }
+
+ public static function getGlobalNavTree()
+ {
+ return self::where('iParentId', 0)
+ ->where('iStatus', 1)
+ ->with(['aChildren' => fn($q) => $q->where('iStatus', 1)->orderBy('iSort', 'desc')])
+ ->orderBy('iSort', 'desc')
+ ->get();
+ }
+
+}
diff --git a/app/Models/DogOption.php b/app/Models/DogOption.php
new file mode 100755
index 00000000..fa0fe677
--- /dev/null
+++ b/app/Models/DogOption.php
@@ -0,0 +1,43 @@
+where("k", $k)->first()?->v;
+ return $v;
+ }
+
+ public static function _list($sDogName)
+ {
+ $oSelf = self::where("dog_name", $sDogName)->get();
+
+ return self::_filterList($oSelf);
+ }
+
+ public static function _filter($oOption)
+ {
+ $arr = [];
+ $arr[$oOption->dog_name."#".$oOption->k] = $oOption->v;
+
+ return $arr;
+ }
+
+ public static function _filterList($oOption)
+ {
+ $arr = [];
+ foreach ($oOption as $oOptionRow) {
+ $arr[] = self::_filter($oOptionRow);
+ }
+
+ return $arr;
+ }
+
+}
diff --git a/app/Models/Option.php b/app/Models/Option.php
new file mode 100755
index 00000000..12f753ec
--- /dev/null
+++ b/app/Models/Option.php
@@ -0,0 +1,47 @@
+first()?->v;
+
+ return $v;
+ }
+
+ public static function _list()
+ {
+ $oSelf = self::get();
+
+ return self::_filterList($oSelf);
+ }
+
+ public static function _filter($oOption)
+ {
+ $arr = [];
+ $arr[$oOption->k] = $oOption->v;
+
+ return $arr;
+ }
+
+ public static function _filterList($oOption)
+ {
+ $arr = [];
+ foreach ($oOption as $oOptionRow) {
+ $arr[] = self::_filter($oOptionRow);
+ }
+
+ return $arr;
+ }
+
+}
diff --git a/app/Models/Tags.php b/app/Models/Tags.php
new file mode 100755
index 00000000..250caba1
--- /dev/null
+++ b/app/Models/Tags.php
@@ -0,0 +1,26 @@
+belongsToMany(
+ Articles::class, // 关联的文章模型
+ 'article_tag', // 中间表名
+ 'iTagId', // 中间表中指向当前表(tags)的外键
+ 'iArticleId' // 中间表中指向目标表(articles)的外键
+ );
+ }
+}
diff --git a/app/Models/User.php b/app/Models/User.php
new file mode 100755
index 00000000..46105135
--- /dev/null
+++ b/app/Models/User.php
@@ -0,0 +1,54 @@
+ */
+ use HasFactory, Notifiable;
+
+ /**
+ * The attributes that are mass assignable.
+ *
+ * @var list
+ */
+ protected $fillable = [
+ 'name',
+ 'email',
+ 'password',
+ ];
+
+ /**
+ * The attributes that should be hidden for serialization.
+ *
+ * @var list
+ */
+ protected $hidden = [
+ 'password',
+ 'remember_token',
+ ];
+
+ /**
+ * Get the attributes that should be cast.
+ *
+ * @return array
+ */
+ protected function casts(): array
+ {
+ return [
+ 'email_verified_at' => 'datetime',
+ 'password' => 'hashed',
+ ];
+ }
+
+ public function aArticles(): HasMany
+ {
+ return $this->hasMany(Articles::class, 'iUserId', 'id');
+ }
+}
diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php
new file mode 100755
index 00000000..e1237765
--- /dev/null
+++ b/app/Providers/AppServiceProvider.php
@@ -0,0 +1,28 @@
+ 'App\Models\Gems',
+// 'Articles' => 'App\Models\Articles',
+// ]);
+ }
+}
diff --git a/app/Providers/ArticleOrderLikesProvider.php b/app/Providers/ArticleOrderLikesProvider.php
new file mode 100755
index 00000000..baa75b94
--- /dev/null
+++ b/app/Providers/ArticleOrderLikesProvider.php
@@ -0,0 +1,28 @@
+with('oOrderLikes', $aHotArticles);
+
+ });
+ }
+}
diff --git a/app/Providers/NavServiceProvider.php b/app/Providers/NavServiceProvider.php
new file mode 100755
index 00000000..d9d5e0ae
--- /dev/null
+++ b/app/Providers/NavServiceProvider.php
@@ -0,0 +1,30 @@
+with('aNavs', $aNavs);
+ });
+
+ }
+}
diff --git a/app/Services/ArticlesService.php b/app/Services/ArticlesService.php
new file mode 100755
index 00000000..4d5aeef1
--- /dev/null
+++ b/app/Services/ArticlesService.php
@@ -0,0 +1,277 @@
+ 0) {
+ // 随机把剩下的点赞塞进后 6 天的坑位里
+ for ($i = 0; $i < $iRemaining; $i++) {
+ $iRandomDay = mt_rand(1, 6);
+ $aPlan[$iRandomDay]++;
+ }
+ }
+
+ // 返回匈牙利命名法下的 json 字符串
+ return json_encode($aPlan);
+ }
+
+ /**
+ * 第二步:执行点赞任务 (建议每小时跑一次)
+ * 只负责把今天该加的赞加进去
+ */
+ public function executeLikeTask(Article $oArticle): void
+ {
+ if (empty($oArticle->sLikePlan)) return;
+
+ $aPlan = json_decode($oArticle->sLikePlan, true);
+ $iDaysPassed = $oArticle->created_at->diffInDays(now());
+
+ // 如果已经超过7天,或者计划里没这一天,直接撤退
+ if ($iDaysPassed > 6 || !isset($aPlan[$iDaysPassed])) {
+ return;
+ }
+
+ $iShouldHaveAdded = $aPlan[$iDaysPassed];
+
+ // 重点:为了不让点赞在凌晨一瞬间加上去,我们可以配合小时数
+ // 比如现在是 14 点,我们应该加到今天总量的 14/24
+ $iHour = (int) date('H');
+ $iCurrentTarget = (int) floor($iShouldHaveAdded * ($iHour / 24));
+
+ // 这里需要一个逻辑记录今天已经加了多少,或者直接根据小时计算增量
+ // 简单处理:我们每天分 24 次把 $iShouldHaveAdded 加完
+ // 为保简洁,这里展示核心逻辑更新:
+ if ($iShouldHaveAdded > 0) {
+ // 算出每小时平均加几个,剩下的随机掉落
+ $iAddToday = $this->calculateHourlyIncrement($iShouldHaveAdded, $iHour);
+ // 这里更新 i7like 字段
+ // 注意:i7like 应该是这篇文章总共通过这个逻辑加了多少赞
+ // ... 具体的数据库 Update 逻辑
+ }
+ }
+
+ /**
+ * 365天自动点赞:高标准随机触发
+ */
+ public function applyYearlyGrowth(Article $oArticle): void
+ {
+ $iYearlyTarget = 10; // 哪怕一年只要 10 个
+
+ // 计算今天中奖的概率:10 / 365
+ // 我们放大一万倍来摇号
+ $iProbability = (int)(($iYearlyTarget / 365) * 10000);
+ $iMagicNumber = mt_rand(1, 10000);
+
+ if ($iMagicNumber <= $iProbability) {
+ // 中奖了,加 1 个赞
+ $oArticle->increment('i365like');
+ }
+ }
+
+ public function like(int $iArticleId, string $sIp, string $sFingerprint): array
+ {
+ // 1. 检查是否已经点过
+ $bExists = ArticleLikes::where('iArticleId', $iArticleId)
+ ->where(function ($q) use ($sIp, $sFingerprint) {
+ $q->where('sIp', $sIp)
+ ->orWhere('sFingerprint', $sFingerprint);
+ })->exists();
+
+ if ($bExists) {
+ return ['status' => false, 'code' => 200, 'msg' => '感谢支持,点过赞了。'];
+ }
+
+ // 2. 事务扣杀
+ try {
+ // 定义一个变量来接收最新的点赞数
+ $iNewLikeCount = 0;
+
+ \DB::transaction(function () use ($iArticleId, $sIp, $sFingerprint, &$iNewLikeCount) {
+ ArticleLikes::create([
+ 'iArticleId' => $iArticleId,
+ 'sIp' => $sIp,
+ 'sFingerprint' => $sFingerprint
+ ]);
+
+ // 执行增加并直接获取最新的模型实例
+ $oArticle = Articles::where('id', $iArticleId);
+ $oArticle->increment('iLikeCount');
+
+ // 拿到自增后的最新数字
+ $iNewLikeCount = $oArticle->value('iLikeCount');
+ });
+
+ CacheService::updateOrderLikes();
+
+ return [
+ 'status' => true,
+ 'code' => 200,
+ 'msg' => '感谢支持!',
+ 'iLikeCount' => $iNewLikeCount // 药水哥绝杀:把热腾腾的数字发回去
+ ];
+ } catch (\Exception $e) {
+ \Log::error("点赞失败: " . $e->getMessage());
+ return ['status' => false, 'code' => 500, 'msg' => '系统打了个盹,稍后再试。'];
+ }
+ }
+
+ public function search(string $sKeywords, string $sResultType)
+ {
+ if (empty($sKeywords)) {
+ return [];
+ }
+
+ $sKeywords = strip_tags(trim($sKeywords));
+
+ $oArticles = Articles::search($sKeywords)
+ ->options([
+ 'attributesToHighlight' => ['sTitle', 'sContent', 'sCategoryName'],
+ // 1. 把 attributesToSnippet 改成 attributesToCrop
+ 'attributesToCrop' => ['sContent'],
+ // 2. 设置裁剪后的长度(单位是字符,按需调整)
+ 'cropLength' => 100,
+ 'highlightPreTag' => '',
+ 'highlightPostTag' => '',
+ ])
+ ->orderByDesc('iIsTop')
+ ->paginate(config('app.page_limit'));
+
+ $oArticles->getCollection()->transform(function ($oArticle) {
+
+ $aMeta = $oArticle->scoutMetadata();
+ $aFormatted = $aMeta['_formatted'] ?? [];
+
+ if (!empty($aFormatted)) {
+ $oArticle->sTitle = $aFormatted['sTitle'] ?? $oArticle->sTitle;
+ $oArticle->sContent = $aFormatted['sContent'] ?? $oArticle->sContent;
+
+ if (isset($aFormatted['sCategoryName'])) {
+ $oArticle->sCategoryName = $aFormatted['sCategoryName'];
+ $oArticle->setRelation('oCategory', (object)[
+ 'sName' => $aFormatted['sCategoryName'],
+ 'sSlug' => $oArticle->sCategorySlug ?? ''
+ ]);
+ }
+ }
+
+ return $oArticle;
+ });
+
+ if ($sResultType === "ajax") {
+ $sHtml = '';
+ foreach ($oArticles as $oArticle) {
+ $sHtml .= view('components.article-item', ['oArticle' => $oArticle])->render();
+ }
+ $xResult = $sHtml;
+ } else {
+ $xResult = [
+ 'oArticles' => $oArticles,
+ ];
+ }
+
+ return $xResult;
+ }
+
+ public function getTagArticles(string $sSlug, string $sResultType)
+ {
+ $oTags = Tags::where('sSlug', $sSlug)->firstOrFail();
+
+ $oArticles = $oTags->oArticles()
+ ->where('iStatus', 1) // 只拿已发布的
+ ->with(['oCategory']) // 预加载关联,拒绝 N+1
+ ->orderByDesc('iIsTop') // 置顶优先
+ ->orderByDesc('created_at') // 最新优先
+ ->paginate(config('app.page_limit')); // 必须分页,否则数据多了会爆内存
+
+ if ($sResultType === "ajax") {
+ $sHtml = '';
+ foreach ($oArticles as $oArticle) {
+ $sHtml .= view('components.article-item', ['oArticle' => $oArticle])->render();
+ }
+ $xResult = $sHtml;
+ } else {
+ $xResult = [
+ 'oArticles' => $oArticles,
+ ];
+ }
+
+ return $xResult;
+ }
+
+ public function getCategoryArticles(string $sSlug, string $sResultType)
+ {
+ $oCategory = Categories::where('sSlug', $sSlug)->firstOrFail();
+
+ if ($oCategory->iShowChildren) {
+ $aCategoryIds = Categories::where('iParentId', $oCategory->id)
+ ->pluck('id')
+ ->push($oCategory->id)
+ ->toArray();
+ } else {
+ $aCategoryIds = [$oCategory->id];
+ }
+
+ $oArticles = Articles::whereIn('iCategoryId', $aCategoryIds)
+ ->with(['oUser', 'oCategory'])
+ ->orderBy('iIsTop', 'desc')
+ ->orderBy('created_at', 'desc')
+ ->simplePaginate(config('app.page_limit'));
+
+ if ($sResultType === "ajax") {
+ $sHtml = '';
+ foreach ($oArticles as $oArticle) {
+ $sHtml .= view('components.article-item', ['oArticle' => $oArticle])->render();
+ }
+ $aResult = $sHtml;
+ } else {
+ $aResult = [
+ 'oCategory' => $oCategory,
+ 'oArticles' => $oArticles,
+ ];
+ }
+
+ return $aResult;
+ }
+
+ public function getArticle(string $sArticleSlug, string $sIp, string $sFingerprint)
+ {
+ $oArticle = Articles::where('sSlug', $sArticleSlug)
+ ->where('iStatus', 1)
+ ->with(['oCategory.oParent', 'oTags'])
+ ->firstOrFail();
+
+ $oArticle->bIsLiked = ArticleLikes::where('iArticleId', $oArticle->id)
+ ->where(function($q) use ($sIp, $sFingerprint) {
+ $q->where('sIp', $sIp)
+ ->orWhere('sFingerprint', $sFingerprint);
+ })->exists();
+
+// return $oArticle;
+ return [
+ 'oArticle' => $oArticle
+ ];
+ }
+}
diff --git a/app/Services/CacheService.php b/app/Services/CacheService.php
new file mode 100755
index 00000000..bfe887b9
--- /dev/null
+++ b/app/Services/CacheService.php
@@ -0,0 +1,68 @@
+ 'article_order_likes',
+ ];
+
+// public static function updateOrderLikes(): array
+// {
+// $oStartDate = now()->subDays(30);
+//
+// $aHotArticles = ArticleLikes::select('iArticleId', \DB::raw('count(*) as iTotalLikes'))
+// ->where('created_at', '>=', $oStartDate)
+// ->groupBy('iArticleId')
+// ->orderBy('iTotalLikes', 'desc')
+// ->with(['oArticle' => function($oQuery) {
+// $oQuery->where('iStatus', 1);
+// }])
+// ->limit(10)
+// ->get()
+// ->filter(fn($oItem) => $oItem->oArticle !== null)
+// ->toArray(); // 存入缓存建议转成数组,性能更稳
+//
+// // 存入缓存,永久保存(直到下一次更新)
+// Cache::forever(self::CACHE_KEYS['article_order_likes'], $aHotArticles);
+//
+// return $aHotArticles;
+// }
+
+ public static function updateOrderLikes(): array
+ {
+ // 1. 获取最近点赞的文章ID流
+ // 使用 max(id) 或 max(created_at) 来确保每个文章只出现一次,且取的是它最后一次被点赞的时间
+ $aHotArticles = ArticleLikes::select('iArticleId', \DB::raw('MAX(created_at) as sLatestLikeTime'))
+ ->whereHas('oArticle', function($oQuery) {
+ $oQuery->where('iStatus', 1); // 只看发布状态的文章
+ })
+ ->groupBy('iArticleId')
+ ->orderBy('sLatestLikeTime', 'desc') // 按最后一次点赞时间倒序
+ ->limit(10)
+ ->with('oArticle') // 预加载文章详情
+ ->get()
+ ->map(function($oItem) {
+ // 格式化输出,把文章对象和点赞时间揉在一起
+ return [
+ 'iArticleId' => $oItem->iArticleId,
+ 'sLatestLikeTime' => $oItem->sLatestLikeTime,
+ 'oArticle' => $oItem->oArticle
+ ];
+ })
+ ->toArray();
+
+ // 2. 存入缓存
+ Cache::forever(self::CACHE_KEYS['article_order_likes'], $aHotArticles);
+
+ return $aHotArticles;
+ }
+
+}
diff --git a/app/Services/TagService.php b/app/Services/TagService.php
new file mode 100755
index 00000000..bc4c73fa
--- /dev/null
+++ b/app/Services/TagService.php
@@ -0,0 +1,70 @@
+oTags()->detach();
+ return;
+ }
+
+ $oPinyin = new Pinyin();
+
+ // 1. 处理标签:不存在则创建
+ $aTagIds = collect($asTagNames)
+ ->filter()
+ ->unique()
+ ->map(function ($sName) use ($oPinyin) {
+ // 修正:sName作为查找条件
+ $oTag = Tags::firstOrCreate(
+ ['sName' => trim($sName)],
+ [
+ // 生成拼音 Slug,例如:药水哥 -> yao-shui-ge
+ 'sSlug' => Str::slug($oPinyin->permalink($sName)) . '-' . Str::random(5)
+ ]
+ );
+ return $oTag->id;
+ })
+ ->all();
+
+ // 2. 数据库事务处理
+ DB::transaction(function () use ($oArticle, $aTagIds) {
+ // 获取变更前的标签ID,用于后续精准更新计数
+ $aOldTagIds = $oArticle->oTags()->pluck('id')->toArray();
+
+ // 同步中间表
+ $oArticle->oTags()->sync($aTagIds);
+
+ // 3. 高标准:精准更新受影响标签的 iArticleCount
+ $aAffectedTagIds = array_unique(array_merge($aOldTagIds, $aTagIds));
+ if (!empty($aAffectedTagIds)) {
+ $this->refreshTagCounts($aAffectedTagIds);
+ }
+ });
+ }
+
+ /**
+ * 精准刷新指定标签的文章计数
+ */
+ protected function refreshTagCounts(array $aTagIds): void
+ {
+ foreach ($aTagIds as $iTagId) {
+ $iCount = DB::table('article_tag')->where('iTagId', $iTagId)->count();
+ Tags::where('id', $iTagId)->update(['iArticleCount' => $iCount]);
+ }
+ }
+}
diff --git a/app/Services/Tg/Hook/Dog.php b/app/Services/Tg/Hook/Dog.php
new file mode 100755
index 00000000..a0dd2e5f
--- /dev/null
+++ b/app/Services/Tg/Hook/Dog.php
@@ -0,0 +1,1052 @@
+oDog->_setDogName("hub"); // 必须,me用,option用
+// $this->oDog->_setPrimaryKey("id"); // 可选,默认id
+// $this->oDog->_setStrField(["content"]); // 可选,指定长文本字段
+// $this->oDog->_setInFormat(["type"]); // 可选,zero^int,^date,^dateFull
+// $this->oDog->_setOutFormat(["time" => "date"]); // 可选,date,dateFull
+
+class Dog extends Mod\Base {
+
+ public $oModelSelf;
+ public $sPrimaryKey = "id";
+ public $iStrMaxLen;
+ public $aStrField = [];
+ public $aInFormat = [];
+ public $aOutFormat = [];
+ public $sDogName;
+ private $aMsg = [];
+ public $aSelectField = [];
+ public $aHideField = [];
+ public $aJsonField = [];
+
+ public function __construct($oModelSelf = false)
+ {
+ $this->_setModel($oModelSelf);
+ }
+
+ //// 定义系列
+
+ // 必须,关联option和me那些
+ public function _setDogName($sDogName)
+ {
+ $this->sDogName = $sDogName;
+ }
+
+ // 必须,使用的model
+ public function _setModel($oModelSelf)
+ {
+ $this->oModelSelf = $oModelSelf;
+ }
+
+ // str字段的最大长度
+ public function _setStrMaxLen($iStrMaxLen)
+ {
+ $this->iStrMaxLen = $iStrMaxLen;
+ }
+
+ public function _setJsonField($aJsonField)
+ {
+ $this->aJsonField = $aJsonField;
+ }
+
+ // 隐藏某些字段[id,name]
+ public function _setHideField($aHideField = [])
+ {
+ $this->aHideField = $aHideField;
+ }
+
+ // 选择性取某些字段[id,name]
+ public function _setSelectField($aSelectField = [])
+ {
+ $this->aSelectField = $aSelectField;
+ }
+
+ // 设置长字符串字段
+ public function _setStrField($aStrField)
+ {
+ $this->iStrMaxLen = ModelDogOption::_hit($this->sDogName, "str_len_max");
+
+ if (!$this->iStrMaxLen) {
+ $this->iStrMaxLen = 60;
+ $this->aMsg["警告882"] = "需要设置dog的option的str_len_max,临时设为60。";
+ }
+
+ $this->aStrField = $aStrField;
+ }
+
+ // 设置主键
+ public function _setPrimaryKey($key)
+ {
+ $this->sPrimaryKey = $key;
+ }
+
+ // 写入数据时格式化某些字段 [transfer_enable => gb]
+ public function _setInFormat($aInFormat)
+ {
+ $this->aInFormat = $aInFormat;
+ }
+
+ // 输出数据时格式化某些字段 [transfer_enable => gb]
+ public function _setOutFormat($aOutFormat)
+ {
+ $this->aOutFormat = $aOutFormat;
+ }
+
+ //// 定义系列 end
+
+ //// option 系列
+ public function option($aParam)
+ {
+
+ $aOption = ModelDogOption::_list($this->sDogName);
+
+ return $this->toJson($aOption);
+ }
+
+ public function optionAdd($aParam)
+ {
+ $k = $aParam["aOption"][1] ?? false;
+ $v = $aParam["aArg"][1] ?? false;
+
+ if ($k == "?") {
+ return "#optionAdd {k} {v}";
+ }
+
+ if (!$k) {
+ return "需要k";
+ }
+
+ if (!$v) {
+ return "需要v";
+ }
+
+ $oOption = new ModelDogOption();
+ $oOption->dog_name = $this->sDogName;
+ $oOption->k = $k;
+ $oOption->v = $v;
+ $oOption->save();
+
+ return $this->toJson(ModelDogOption::_filter($oOption));
+ }
+
+ public function optionSet($aParam)
+ {
+ $k = $aParam["aOption"][1] ?? false;
+ $v = $aParam["aArg"][1] ?? false;
+
+ if ($v == "?") {
+ return "#optionSet__{k} {v}";
+ }
+
+ if (!$k) {
+ return "需要k";
+ }
+
+ if (!$v) {
+ return "需要v";
+ }
+
+ $oOption = ModelDogOption::where("dog_name", $this->sDogName)->where("k", $k)->first();
+
+ if (!$oOption) {
+ return "没找到这个";
+ }
+
+ $oOption->v = $v;
+ $oOption->save();
+
+ return $this->toJson(ModelDogOption::_filter($oOption));
+ }
+
+ public function optionDel($aParam)
+ {
+ $k = $aParam["aArg"][1] ?? false;
+ $is_done = $aParam["is_done"] ?? false;
+
+ if ($k == "?") {
+ return "#optionDel {k}";
+ }
+
+ if (!$k) {
+ return "需要k";
+ }
+
+ $oOption = ModelDogOption::where("dog_name", $this->sDogName)->where("k", $k)->first();
+
+ if (!$oOption) {
+ return "没找到这个";
+ }
+
+ if ($is_done === false) {
+
+ $sMsg = "匹配以下,确认用optionDelDone()。";
+ $sOption = $this->toJson($oOption);
+
+ return $sMsg."\n\n".$sOption;
+
+ } else if ($is_done === true) {
+
+ $r = $oOption->delete();
+
+ return $r;
+ }
+ }
+
+ public function optionDelDone($aParam)
+ {
+ $aParam["is_done"] = true;
+
+ return $this->optionDel($aParam);
+ }
+ //// option 系列 end
+
+ //// 辅助系列
+// private function filterList($oSelfList)
+// {
+// foreach ($oSelfList as &$oSelfListRow) {
+// $oSelfListRow = $this->filterRow($oSelfListRow);
+// }
+//
+// return $oSelfList;
+// }
+
+ private function meToStr_list($oMe)
+ {
+ $str = "";
+ $i = 0;
+ foreach ($oMe as $oMeRow) {
+ if ($i !== 0) {
+ $str .= "\n\n";
+ }
+ $str .= $this->meToStr($oMeRow);
+ $i++;
+ }
+
+ return $str;
+ }
+
+ private function meToStr($oMe)
+ {
+ $str = $oMe->id.":".$oMe->rag;
+
+ return $str;
+ }
+ //// 辅助系列 end
+
+ //// json系列
+// private function
+ //// json系列end
+
+ //// me系列
+ public function me()
+ {
+ $oMe = ModelMe::where("class", $this->sDogName)->first();
+
+ if (!$oMe) {
+ return "空";
+ }
+
+ return $oMe->rag;
+ }
+
+ public function meEdit($aParam)
+ {
+ $aValue = $aParam["aArg"] ?? false;
+
+ $sValue = implode(" ", $aValue);
+
+ if ($sValue == "?") {
+ return "/meEdit {value}";
+ }
+
+ $aWhere = [
+ "class" => $this->sDogName,
+ ];
+
+ $aValue = [
+ "rag" => $sValue,
+ ];
+
+ $oMe = ModelMe::updateOrCreate($aWhere, $aValue);
+
+ return $this->me();
+ }
+ //// me系列 end
+
+// private function filterRow($oSelfRow)
+// {
+//
+// foreach ($this->aStrField as $v) {
+// $oSelfRow->{$v} = $this->subStr($oSelfRow->{$v});
+// }
+//
+// foreach ($this->aJsonField as $v) {
+// $oSelfRow->{$v} = json_decode($oSelfRow->{$v});
+// }
+//
+// return $oSelfRow;
+// }
+
+ private function subStr($input) {
+
+ if (!$input) {
+ return "";
+ }
+
+ if (mb_strlen($input, 'UTF-8') > (int) $this->iStrMaxLen) {
+
+ return mb_substr($input, 0, (int) $this->iStrMaxLen, 'UTF-8')."……";
+
+ }
+
+ return $input;
+ }
+
+ public function list($aParam)
+ {
+ return $this->page($aParam);
+ }
+
+ public function limit($aParam)
+ {
+ if (($aParam["aArg"][1] ?? false) == "?") {
+ return "#limit {skip} {take}";
+ }
+
+ $iSkip = $aParam["aArg"][1] ?? 0;
+ $iTake = $aParam["aArg"][2] ?? false;
+
+ if (!$iTake) {
+ $iTake = ModelOption::_hit("dog_limit");
+ }
+
+ if (!$iTake) {
+ return "需要option表里的dog_limit";
+ }
+
+ $oSelf = $this->oModelSelf->skip($iSkip)->take($iTake)->get();
+
+ return $this->toJson($oSelf);
+ }
+
+ public function page($aParam)
+ {
+ $iPage = $aParam["aArg"][1] ?? 1;
+
+ $aParam = [];
+ $aParam["aOption"][2] = $iPage;
+
+ return $this->find($aParam);
+ }
+
+ public function add($aParam)
+ {
+ $sField = $aParam["aOption"][1] ?? false;
+ $sValue = $aParam["aArg"][1] ?? false;
+
+ if ($sValue == "?") {
+ return "#add__{field} {value}";
+ }
+
+ if (!$sValue) {
+ return "需要value";
+ }
+
+ if (!$sField) {
+ return "需要field";
+ }
+
+ $this->oModelSelf->$sField = $sValue;
+
+ $this->oModelSelf->save();
+
+ $aParam = [];
+ $aParam["aOption"][1] = $this->sPrimaryKey;
+ $aParam["aArg"][1] = $this->oModelSelf->{$this->sPrimaryKey};
+
+ return $this->find($aParam);
+ }
+
+ public function like($aParam)
+ {
+
+ $aParam["is_like"] = true;
+
+ return $this->find($aParam);
+
+ }
+
+ public function clone($aParam)
+ {
+ $sWhereValue = $aParam['aArg'][1] ?? false;
+ $sWhereField = $aParam["aOption"][1] ?? $this->sPrimaryKey;
+ $sWhereFieldType = $aParam["aOption"][2] ?? "int";
+
+ if ($sWhereValue == "?") {
+ return "#clone__[whereField]__[whereFieldType(:int,str)] [whereValue]";
+// return "#clone__{keyType?int:int,str,int自增str随机} {whereValue}";
+ }
+
+ if (!$sWhereField) {
+ return "需要field";
+ }
+
+ if (!$sWhereValue) {
+ return "需要value";
+ }
+
+ // 查找文章
+ $oModelSelf = $this->oModelSelf->where($sWhereField, $sWhereValue)->first();
+
+ if (!$oModelSelf) {
+ return "没找到这个";
+ }
+
+ $oModelSelfNew = $oModelSelf->replicate();
+ if ($sWhereFieldType == "str") {
+ $oModelSelfNew->$sWhereField = $oModelSelfNew->{$sWhereField}."-clone".rand(0, 9999);
+ }
+ $oModelSelfNew->save();
+
+ $aParam = [];
+ $aParam["aOption"][1] = $sWhereField;
+ $aParam["aArg"][1] = $oModelSelfNew->$sWhereField;
+
+ return $this->find($aParam);
+ }
+
+ private function _getLimit()
+ {
+ $iLimit = ModelDogOption::_hit($this->sDogName, "limit");
+
+ if (!$iLimit) {
+ $iLimit = ModelOption::_hit("dog_limit");
+ }
+
+ if (!$iLimit) {
+// throw new \Exception("需要option里的dog_limit");
+ $iLimit = 30;
+ $this->aMsg["警告881"] = "需要option里的dog_limit,临时设为30。";
+ }
+
+ return $iLimit;
+ }
+
+ public function find($aParam)
+ {
+ $sField = $aParam["aOption"][1] ?? $this->sPrimaryKey;
+ $sValue = $aParam["aArg"][1] ?? "_all";
+ $iPage = $aParam["aOption"][2] ?? 1;
+ $isLike = $aParam["is_like"] ?? false;
+ $sHitField = $aParam["sHitField"] ?? false;
+
+ if ($sValue == "?") {
+ return "#find__{field?primaryKey}__{page?1} {value?_all}";
+ }
+
+ $iLimit = $this->_getLimit();
+
+ if ($sValue === "_all" ) {
+
+ $oSelf = $this->oModelSelf;
+
+ } else if ($isLike === true) {
+
+ $oSelf = $this->oModelSelf->where($sField, "like", "%".$sValue."%");
+
+ } else {
+
+ $oSelf = $this->oModelSelf->where($sField, $sValue);
+
+ }
+
+ $oSelf = $oSelf->paginate($iLimit, ['*'], 'page', $iPage);
+
+ if ($oSelf->isEmpty()) {
+ return "没找到这个";
+ }
+
+ // hit必然单体
+// if ($sHitField) {
+// return $oSelf->items()[0]->$sHitField;
+// }
+
+ $aData = $this->toDataList($oSelf);
+
+ if ($sHitField) {
+ if (in_array($sHitField, $this->aStrField)) {
+ $aData = $oSelf->items()[0]->$sHitField;
+ } else {
+ $aData = $aData[0][$sHitField];
+ }
+ }
+
+ return $this->toJson($aData);
+ }
+
+
+ private function toDataList($oSelf)
+ {
+ $aSelf = $oSelf->toArray();
+
+ $aMsg = [];
+
+ // 说明是分页
+ if (isset($aSelf["data"])) {
+ $aData = $aSelf["data"];
+ } else {
+ $aData = $aSelf;
+ }
+
+ $iCount = $aSelf["total"] ?? 0;
+ $iPagePer = $aSelf["per_page"] ?? 0;
+ $iPage = $aSelf["current_page"] ?? 0;
+ $iPageTotal = $aSelf["last_page"] ?? 0;
+
+ if ($iPageTotal > 1) {
+ if ($iPage) {
+ $this->aMsg["页"]["页当前"] = $iPage;
+ }
+
+ if ($iPageTotal) {
+ $this->aMsg["页"]["页总数"] = $iPageTotal;
+ }
+
+ if ($iPagePer) {
+ $this->aMsg["页"]["行每页"] = $iPagePer;
+ }
+
+ if ($iCount) {
+ $this->aMsg["页"]["行总数"] = $iCount;
+ }
+ }
+
+ $aData = $this->filterDataList($aData);
+// $aData = $this->dataInsterMsgList($aData);
+
+ return $aData;
+ }
+
+ public function toJson($aData)
+ {
+ if (is_string($aData)) {
+ return $aData;
+ }
+
+ if ($this->aMsg && !is_string($aData)) {
+ if (is_object($aData)) {
+ $aData = $aData->toArray();
+ }
+ array_unshift($aData, $this->aMsg);
+ }
+
+ return parent::toJson($aData);
+ }
+
+ private function dataInsterMsgList($aData, $aMsg)
+ {
+ if ($aMsg) {
+ array_unshift($aData, $aMsg);
+ }
+
+ return $aData;
+ }
+
+ private function dataInsterMsg($aData, $aMsg)
+ {
+ $aDataNew = [];
+
+ if ($aMsg) {
+ $aDataNew[] = $aMsg;
+ $aDataNew[] = $aData;
+ } else {
+ $aDataNew = $aData;
+ }
+
+ return $aDataNew;
+ }
+
+ private function toData($oSelf)
+ {
+ if (!is_array($oSelf)) {
+ $aData = $oSelf->toArray();
+ } else {
+ $aData = $oSelf;
+ }
+
+ $aData = $this->filterData($aData);
+
+ return $aData;
+ }
+
+ private function filterDataList($aData)
+ {
+ foreach ($aData as &$aDataRow) {
+ $aDataRow = $this->filterData($aDataRow);
+ }
+
+ return $aData;
+ }
+
+ private function filterData($aData)
+ {
+ if ($this->aSelectField) {
+ $aDataNew = [];
+ foreach ($this->aSelectField as $sSelectField) {
+ $aDataNew[$sSelectField] = $aData[$sSelectField];
+ }
+ $aData = $aDataNew;
+ }
+
+ if ($this->aHideField) {
+ foreach ($this->aHideField as $sHideField) {
+ unset($aData[$sHideField]);
+ }
+ }
+
+ foreach ($this->aStrField as $sStrField) {
+ $aData[$sStrField] = $this->subStr($aData[$sStrField] ?? '');
+ }
+
+ foreach ($this->aJsonField as $sJsonField) {
+ $aData[$sJsonField] = json_decode($aData[$sJsonField] ?? '');
+ }
+
+ foreach ($this->aOutFormat as $sFormatField => $sFormatType) {
+ if ($sFormatType == "date") {
+ $aData[$sFormatField] = date("Y-m-d", (int) $aData[$sFormatField]);
+ } else if ($sFormatType == "dateFull") {
+ $aData[$sFormatField] = date("Y-m-d", (int) $aData[$sFormatField]);
+ } else if ($sFormatType == "gb") {
+ $aData[$sFormatField] = round($aData[$sFormatField] / 1073741824, 2)."gb";
+ }
+ }
+
+ return $aData;
+ }
+
+ public function kv($aParam)
+ {
+ $k = $aParam["aOption"][1] ?? false;
+ $v = $aParam["aArg"][1] ?? false;
+
+ if ($v == "?") {
+ return "#kv__{k} {v}";
+ }
+
+ $aParam = [];
+ $aParam["aOption"][1] = $k;
+ $aParam["aOption"][2] = "v";
+ $aParam["aArg"][1] = $v;
+
+ return $this->set($aParam);
+ }
+
+ public function arrUnset($aParam)
+ {
+ $aParam["sCmd"] = "unset";
+ return $this->arrSet($aParam);
+ }
+
+ public function arrSet($aParam)
+ {
+ $sWhereValue = $aParam["aOption"][1] ?? '';
+ $sUpdField = $aParam["aOption"][2] ?? '';
+ $sUpdKey = $aParam["aOption"][3] ?? '';
+ $sUpdValue = $aParam["aArg"][1] ?? '';
+ $sCmd = $aParam["sCmd"] ?? 'set';
+
+ if ($sUpdValue == "?") {
+ return "#arrSet__[sWhereValue]__[sUpdField]__[?sUpdKey] [?sUpdValue]";
+ }
+
+ if (!$sWhereValue) {
+ return "需要whereValue";
+ }
+
+ if (!$sUpdField) {
+ return "需要sWhereValue";
+ }
+
+ if (!$sUpdKey) {
+// return "需要sUpdKey";
+ }
+
+ if (!$sUpdValue) {
+ if ($sCmd == "set") {
+ return "需要sUpdValue";
+ }
+ }
+
+ $oModelSelf = $this->oModelSelf->where($this->sPrimaryKey, $sWhereValue)->first();
+
+ if (!$oModelSelf) {
+ return "没找到";
+ }
+
+ $sArr = $oModelSelf->$sUpdField ?? "[]";
+ $aArr = json_decode($sArr, true);
+ $aArrNew = $aArr;
+
+ if ($sCmd == "set") {
+ if ($sUpdKey) {
+ $aArrNew[$sUpdKey] = $sUpdValue;
+ } else {
+ $aArrNew[] = $sUpdValue;
+ }
+ } else if ($sCmd == "unset") {
+ if (!$sUpdKey) {
+ return "需要sUpdKey";
+ }
+ if (isset($aArrNew[$sUpdKey])) {
+ unset($aArrNew[$sUpdKey]);
+ }
+ }
+
+ $sArrNew = json_encode($aArrNew);
+ $oModelSelf->$sUpdField = $sArrNew ?? "[]";
+ $r = $oModelSelf->save();
+
+ if (!$r) {
+ return "save失败?";
+ }
+
+ $a = json_decode($oModelSelf->$sUpdField);
+
+ return $this->toJson($a);
+ }
+
+ public function schemaAdd($aParam)
+ {
+ if (($aParam["aArg"][1] ?? false) == "?") {
+ return "#jsonAdd {json}";
+ }
+
+ $aJson = $aParam["aArg"] ?? false;
+ $sJson = implode(" ", $aJson);
+
+ if (!$sJson) {
+ return "需要json";
+ }
+
+ $aJson = json_decode($sJson, true);
+
+ foreach ($aJson as $k => $v) {
+ $this->oModelSelf->$k = $this->inFormat($k, $v);
+ }
+
+ $this->oModelSelf->save();
+
+ $aParam = [];
+ $aParam["aArg"][1] = $this->oModelSelf->{$this->sPrimaryKey};
+
+ return $this->find($aParam);
+ }
+
+ public function schemaSet($aParam)
+ {
+ $sWhereValue = $aParam["aOption"][1] ?? false;
+ $aJson = $aParam["aArg"] ?? false;
+ $sJson = implode(" ", $aJson);
+
+ if ($sJson == "?") {
+ return "#setJson__{whereValue} {json} | 绑定主键 单体";
+ }
+
+ if (!$sWhereValue) {
+ return "需要whereValue";
+ }
+
+ if (!$sJson) {
+ return "需要json";
+ }
+
+ $oModelSelf = $this->oModelSelf->where($this->sPrimaryKey, $sWhereValue)->first();
+
+ if (!$oModelSelf) {
+ return "没找到这个";
+ }
+
+ $aJson = json_decode($sJson, true);
+
+ foreach ($aJson as $k => $v) {
+ $v = $this->inFormat($k, $v);
+ $oModelSelf->$k = $v;
+ }
+
+ $oModelSelf->save();
+
+ $aParam = [];
+ $aParam["aArg"][1] = $oModelSelf->{$this->sPrimaryKey};
+
+ return $this->find($aParam);
+ }
+
+ public function schemaGet($aParam)
+ {
+ $sWhereValue = $aParam["aArg"][1] ?? false;
+ $sWhereField = $aParam["aOption"][1] ?? $this->sPrimaryKey;
+
+ if ($sWhereValue == "?") {
+ return "#jsonGet__{whereFile?primary} {whereValue}";
+ }
+
+ if (!$sWhereValue) {
+ return "需要whereValue";
+ }
+
+ $oSelf = $this->oModelSelf->where($sWhereField, $sWhereValue)->first();
+
+ if (!$oSelf) {
+ return "没找到这个";
+ }
+
+ return $this->toJson($oSelf);
+ }
+
+ public function likeSet($aParam)
+ {
+ if (($aParam["aArg"][1] ?? false) == "?") {
+ return "原set走like匹配,慎用";
+ }
+
+ $aParam["is_like"] = true;
+
+ return $this->set($aParam);
+ }
+
+ public function likeSetDone($aParam)
+ {
+ if (($aParam["aArg"][1] ?? false) == "?") {
+ return "原set走like匹配,慎用";
+ }
+
+ $aParam["is_like"] = true;
+ $aParam["is_like_done"] = true;
+
+ return $this->set($aParam);
+ }
+
+ public function set($aParam)
+ {
+ $sSetValue = $aParam["aArg"] ?? false;
+ $sSetValue = implode(" ", $sSetValue);
+ $bIsLike = $aParam["is_like"] ?? false;
+ $bIsLikeDone = $aParam["is_like_done"] ?? false;
+
+ if ($sSetValue == "?") {
+ $tmp = "#set__{whereField}__{WhereValue}__{setField} {setValue} | 多条";
+ $tmp .= "\n\n";
+ $tmp .= "#set__{whereValue}__{setField} {setValue} | 主键";
+ return $tmp;
+ }
+
+ // 有第三参数说明是findSet模式
+ if (isset($aParam["aOption"][3])) {
+ $sWhereField = $aParam["aOption"][1] ?? false;
+ $sWhereValue = $aParam["aOption"][2] ?? false;
+ $sSetField = $aParam["aOption"][3] ?? false;
+ $sMod = "findSet";
+ } else {
+ $sWhereField = $this->sPrimaryKey;
+ $sWhereValue = $aParam["aOption"][1] ?? false;
+ $sSetField = $aParam["aOption"][2] ?? false;
+ $sMod = "set";
+ }
+
+ if (!$sWhereField) {
+ return "需要whereField";
+ }
+
+ if (!$sWhereValue) {
+ return "需要whereValue";
+ }
+
+ if (!$sSetField) {
+ return "需要setField";
+ }
+
+ if ($bIsLike === false) {
+ $oSelf = $this->oModelSelf->where($sWhereField, $sWhereValue)->get();
+ } else if ($bIsLike === true) {
+
+ $oSelf = $this->oModelSelf->where($sWhereField, "like", "%".$sWhereValue."%")->get();
+
+ if ($bIsLikeDone === false) {
+
+ $sMsg = "匹配以下数据,确认修改用likeSetDone()。";
+
+ $sSelfStr = $this->toJson($oSelf);
+
+ return $sMsg."\n\n".$sSelfStr;
+ }
+
+ } else {
+ return "??????????????";
+ }
+
+ if ($oSelf->isEmpty()) {
+ return "没找到这个";
+ }
+
+ $sSetValue = $this->inFormat($sSetField, $sSetValue);
+ $i = 0;
+ foreach ($oSelf as $oSelfRow) {
+ $oSelfRow->$sSetField = $sSetValue;
+ $oSelfRow->save();
+ $i++;
+ }
+
+ if ($i == 1) {
+ $aParam = [];
+ $aParam["aOption"][1] = $this->sPrimaryKey;
+ $aParam["aArg"][1] = $oSelfRow->{$this->sPrimaryKey};
+ return $this->find($aParam);
+ }
+
+ return "影响".$i."条数据";
+ }
+
+ private function inFormat($sSetField, $sSetValue) {
+
+ if (in_array($sSetField, $this->aInFormat)) {
+ $sSetValue = $this->mapInFormat($sSetValue);
+ }
+
+ return $sSetValue;
+ }
+
+ private function mapInFormat($sValue)
+ {
+ $aValue = explode("^", $sValue, 2);
+
+ if (!isset($aValue[1])) {
+ return $sValue;
+ }
+
+ $sValueQian = $aValue[0];
+ $sValueHou = $aValue[1];
+
+ if ($sValueHou == "int") {
+
+ if ($sValueQian == "zero") {
+ $sValueQian = 0;
+ }
+
+ } else if ($sValueHou == "dayToDate") {
+
+ $sValueQian = date("Y-m-d H:i:s", strtotime("+{$sValueQian} days"));
+
+ } else if ($sValueHou == "dateNow") {
+ $sValueQian = date("Y-m-d");
+ } else if ($sValueHou == "dateTimeNow") {
+ $sValueQian = date("Y-m-d H:i:s");
+ } else if ($sValueHou == "gb") {
+ $sValueQian = $sValueQian * 1073741824;
+ }
+
+ return $sValueQian;
+ }
+
+ public function delDone($aParam)
+ {
+ $aParam["is_done"] = true;
+
+ return $this->del($aParam);
+ }
+
+ public function del($aParam)
+ {
+ $sField = $aParam["aOption"][1] ?? $this->sPrimaryKey;
+ $sValue = $aParam["aArg"][1] ?? false;
+ $bIsDone = $aParam["is_done"] ?? false;
+
+ if ($sValue == "?") {
+ return "#del__{field?默认primaryKey} {value}";
+ }
+
+ $oSelf = $this->oModelSelf->where($sField, $sValue)->get();
+
+ if ($oSelf->isEmpty()) {
+ return "没找到这个";
+ }
+
+ if ($bIsDone == true) {
+
+ $i = 0;
+ foreach ($oSelf as $oSelfRow) {
+ $ii = $oSelfRow->delete();
+ $i = $i + $ii;
+ }
+
+ return "删除".$i."条数据";
+ }
+
+ $sMsg = "匹配以下数据,确认删除使用delDone()。\n\n";
+ $sStr = $this->toJson($oSelf);
+
+ return $sMsg.$sStr;
+ }
+
+ public function hit($aParam)
+ {
+ $sHitField = $aParam["aOption"][1] ?? false;
+ $sWhereField = $aParam["aOption"][2] ?? $this->sPrimaryKey;
+ $sWhereValue = $aParam["aArg"][1] ?? false;
+
+ if ($sWhereValue == "?") {
+ return "#hit__{hitField}__{whereField?primaryKey} {whereValue}";
+ }
+
+ if (!$sWhereValue) {
+ return "需要value";
+ }
+
+ $aParam = [];
+ $aParam["sHitField"] = $sHitField;
+ $aParam["aOption"][1] = $sWhereField;
+ $aParam["aArg"][1] = $sWhereValue;
+
+ return $this->find($aParam);
+ }
+
+ public function content($aParam)
+ {
+ $sWhereField = $aParam["aOption"][1] ?? $this->sPrimaryKey;
+ $sValue = $aParam["aArg"][1] ?? false;
+
+ if ($sValue == "?") {
+ return "#content__{whereField?primaryKey} {whereValue}";
+ }
+
+ if (!$sValue) {
+ return "需要value";
+ }
+
+ $aParam = [];
+ $aParam["aOption"][1] = "content";
+ $aParam["aOption"][2] = $sWhereField;
+ $aParam["aArg"][1] = $sValue;
+
+ return $this->hit($aParam);
+ }
+
+ public function table()
+ {
+ $sTable = $this->oModelSelf->getTable();
+
+ $columns = \DB::select("SHOW CREATE TABLE `{$sTable}`");
+
+ return $columns[0]->{"Create Table"};
+ }
+
+}
diff --git a/app/Services/Tg/Hook/Mod/Base.php b/app/Services/Tg/Hook/Mod/Base.php
new file mode 100755
index 00000000..4033f24c
--- /dev/null
+++ b/app/Services/Tg/Hook/Mod/Base.php
@@ -0,0 +1,57 @@
+oHttp = new Http();
+ $this->oTGHttp = new TGHttp();
+// $this->oTGHttp->sApiToken = env("telegram_token");
+// $this->oTGHttp->sApiChatId = env("telegram_chatid");
+ }
+
+ public function toJson($aData)
+ {
+ return json_encode($aData, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
+ }
+
+ public function eachSendTg($aData)
+ {
+ foreach ($aData as $row) {
+ $this->oTGHttp->sendToTG(json_encode($row, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
+ }
+
+ $this->oHttp::response(200, 'ok');
+ }
+
+// protected function cmdGood($sCmd) {
+//
+// $sCmdNew = "";
+// switch ($sCmd) {
+// case "user":
+// $sCmdNew = "user_name";
+// break;
+// case "project":
+// $sCmdNew = "project_name";
+// break;
+// case "code":
+// $sCmdNew = "sale_code";
+// break;
+// case "condition":
+// $sCmdNew = "cron_condition";
+// break;
+// default:
+// $sCmdNew = $sCmd;
+// break;
+// }
+//
+// return $sCmdNew;
+//
+// }
+
+}
diff --git a/app/Services/Tg/Hook/Mod/Console.php b/app/Services/Tg/Hook/Mod/Console.php
new file mode 100755
index 00000000..ef91ed7e
--- /dev/null
+++ b/app/Services/Tg/Hook/Mod/Console.php
@@ -0,0 +1,48 @@
+oDog = new Dog(new ModelOption());
+// $this->oDog->_setPrimaryKey("k"); // 可选,默认id
+ $this->oDog->_setDogName("console"); // 必须
+ }
+
+ public function __call($sName, $aArg)
+ {
+ return $this->oDog->$sName($aArg[0]);
+ }
+
+ public function call($aParam)
+ {
+ $sName = $aParam["aArg"][1] ?? '';
+
+ if ($sName == "?") {
+ return "call [sName] 案例:stat:tags-count";
+ }
+
+ if (!$sName) {
+ return "需要name";
+ }
+
+ $iExitCode = Artisan::call($sName);
+ $sOutput = Artisan::output();
+
+ return $sOutput;
+ }
+
+ public function t()
+ {
+ echo 11;
+ exit;
+ }
+
+}
diff --git a/app/Services/Tg/Hook/Mod/Option.php b/app/Services/Tg/Hook/Mod/Option.php
new file mode 100755
index 00000000..b163ac81
--- /dev/null
+++ b/app/Services/Tg/Hook/Mod/Option.php
@@ -0,0 +1,49 @@
+oDog = new Dog(new ModelOption());
+ $this->oDog->_setPrimaryKey("k"); // 可选,默认id
+ $this->oDog->_setDogName("option"); // 必须
+ }
+
+ public function __call($sName, $aArg)
+ {
+ return $this->oDog->$sName($aArg[0]);
+ }
+
+// public function Pause($aParam)
+// {
+// $v = $aParam['aArg'][1];
+//
+// // 获取第一个匹配的选项
+// $oOption = ModelOption::where("type", "pause")->first();
+//
+// // 检查是否找到了选项
+// if ($oOption) {
+// $oOption->value = $v;
+//
+// // 保存并返回结果
+// return json_encode($oOption->save());
+// }
+//
+// // 如果没有找到选项,返回一个错误信息
+// return json_encode(['error' => 'Option not found']);
+// }
+//
+// public function List()
+// {
+// $aOptionList = ModelOption::all()->toArray();
+//
+// return json_encode($aOptionList, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+// }
+
+}
diff --git a/app/Services/Tg/Http.php b/app/Services/Tg/Http.php
new file mode 100755
index 00000000..7dd479e1
--- /dev/null
+++ b/app/Services/Tg/Http.php
@@ -0,0 +1,108 @@
+sApiToken = env('telegram_token');
+ $this->sApiChatId = env('telegram_chatid');
+ }
+
+ public function send($sMsg = "msg空", $aUpdate = [])
+ {
+
+ $bSendTg = true;
+
+ $sShell = $aUpdate["shell"] ?? false;
+ $bIsDove = $aUpdate["is_dove"] ?? false;
+
+ if ($sShell == "cmd") {
+ $bSendTg = false;
+ }
+
+ if ($bIsDove == true) {
+ $bSendTg = false;
+ }
+
+ if (env("is_loc") == true) {
+ $bSendTg = false;
+ }
+
+ if (is_array($sMsg)) {
+ if ($bSendTg) {
+ foreach ($sMsg as $sMsgRow) {
+ $this->sendTg($sMsgRow);
+ }
+ } else {
+ echo json_encode($sMsg, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+ }
+ } else {
+ if ($bSendTg) {
+ $this->sendTg($sMsg);
+ } else {
+ echo $sMsg;
+ }
+ }
+
+ if ($bSendTg) {
+ TomHttp::response(200);
+ } else {
+ exit;
+ }
+
+ }
+
+ private function sendTg($sMsg)
+ {
+ $oHttp = new TomHttp();
+ $oHttp->sMethod = "post";
+ $oHttp->sToUrl = "https://api.telegram.org/bot$this->sApiToken/sendMessage";
+// $oHttp->bIsJson = true;
+ $oHttp->aData = [
+ "chat_id" => $this->sApiChatId,
+ "text" => $sMsg
+ ];
+
+ $oHttp->send();
+ }
+
+ public function sendToTG($sMsg, $aUpdate = [])
+ {
+
+ if (isset($aUpdate["shell"]) && $aUpdate["shell"] == "cmd") {
+
+ echo $sMsg;
+
+ } else if (isset($aUpdate["is_dove"]) && $aUpdate["is_dove"] == true) {
+
+ echo $sMsg;
+
+ } else {
+
+ if (env("is_loc") == true) {
+ echo $sMsg;
+ } else {
+ $oHttp = new TomHttp();
+ $oHttp->sMethod = "post";
+ $oHttp->sToUrl = "https://api.telegram.org/bot$this->sApiToken/sendMessage";
+ // $oHttp->bIsJson = true;
+ $oHttp->aData = [
+ "chat_id" => $this->sApiChatId,
+ "text" => $sMsg
+ ];
+
+ $oHttp->send();
+ }
+
+ }
+
+ }
+
+
+}
diff --git a/app/Services/TomTool/Flow.php b/app/Services/TomTool/Flow.php
new file mode 100755
index 00000000..7f2aa38e
--- /dev/null
+++ b/app/Services/TomTool/Flow.php
@@ -0,0 +1,425 @@
+fail("kkkkkkk");
+
+ 进阶:
+ Flow::make("name")->noDone()->msg("哟哟哟哟哟哟")->sendTg()->fetch();
+
+ 业务:
+ step()
+ msg()
+ data()
+ aData()
+ jData()
+ sData()
+ code()
+ put()
+ merge()
+ toDone()
+ noDone()
+ step("start")
+
+ action:
+ reset()
+ done(?$msg)
+ fail(?$msg, ?$aParentResult)
+ sendTg() 伪action
+ fetch() or get()
+ fetchAll() or geAll()
+
+ set:
+ enableTg();
+ parent($aParentResult);
+
+ with:
+ withTraceId();
+ withTimestamp();
+ withStep();
+
+ 判断:
+ ::isDone($aResult);
+ ::isFail($aResult);
+
+ */
+
+class Flow
+{
+ protected array $aStep = [];
+ protected array $aParent = [];
+ protected bool $isToTg = false;
+ protected bool $isToTgOne = false;
+ protected array $aResult = [
+ 'isDone' => false,
+ ];
+ protected string $sName;
+ private bool $isChain = false;
+
+ public function __construct(string $name = 'none')
+ {
+ $this->sName = $name;
+ $this->aStep[] = "{$this->sName}::start";
+ }
+
+ // new
+ public static function make(string $name = 'none'): self
+ {
+ return new self($name);
+ }
+
+ // new
+ public static function start($sName = 'none')
+ {
+ $oInstance = new self($sName);
+ $oInstance->isChain = true;
+ return $oInstance;
+ }
+
+ // option
+ public function enableTg(bool $flag = true): self
+ {
+ $this->isToTg = $flag;
+ return $this;
+ }
+
+ // option
+ public function enableTgOne(bool $flag = true): self
+ {
+ $this->enableTg(true);
+ $this->isToTgOne = $flag;
+ return $this;
+ }
+
+ // option
+ public function parent(array $aParentResult): self
+ {
+ $this->aParent = $aParentResult;
+ return $this;
+ }
+
+ // data
+ public function step(string $step): self
+ {
+ $this->aStep[] = "{$this->sName}::{$step}";
+ return $this;
+ }
+
+ // data
+ public function msg($msg = "msg未设置"): self
+ {
+ if (is_array($msg)) {
+ $msg = json_encode($msg);
+ }
+ $this->put('sMsg', $msg);
+ return $this;
+ }
+
+ // data
+ public function aData(array $data): self
+ {
+ $this->put('aData', $data);
+ return $this;
+ }
+
+ // data
+ public function aDataPut($k, $v)
+ {
+ $this->aResult["aData"][$k] = $v;
+ return $this;
+ }
+
+ // data
+ public function sData(string $data): self
+ {
+ $this->put('sData', $data);
+ return $this;
+ }
+
+ // data
+ public function code(string $code): self
+ {
+ $this->put('sCode', $code);
+ return $this;
+ }
+
+ // data
+ public function put(string $key, mixed $value, $sDataKey = ''): self
+ {
+ if ($sDataKey) {
+ $this->aResult[$sDataKey][$key] = $value;
+ } else {
+ $this->aResult[$key] = $value;
+ }
+
+ return $this;
+ }
+
+ // data
+ public function merge(array $data): self
+ {
+ foreach ($data as $k => $v) {
+ $this->put($k, $v);
+ }
+ return $this;
+ }
+
+ // data
+ public function setDone(bool $b = true): self
+ {
+ $this->aResult['isDone'] = $b;
+ return $this;
+ }
+
+ // data
+ public function setFail(string $step = ''): self
+ {
+ if ($step) {
+ $this->step($step);
+ }
+ $this->aResult['isDone'] = false;
+ return $this;
+ }
+
+ // with
+ public function withTraceId(string $id = null): self
+ {
+ $this->aResult['sTraceId'] = $id ?? uniqid('trace_', true);
+ return $this;
+ }
+
+ // with
+ public function withTimestamp(): self
+ {
+ $this->aResult['sTimestamp'] = (new \DateTime())->format(\DateTime::ATOM);
+ return $this;
+ }
+
+ // with
+ public function withStep(bool $flag = true): self
+ {
+ if ($flag) {
+ $this->withParentStep();
+ $this->aResult['aStep'] = $this->aStep;
+ } else {
+ unset($this->aResult['aStep']);
+ }
+ return $this;
+ }
+
+ // action
+ public function reset(): self
+ {
+ $this->aStep = [$this->sName . '::start'];
+ $this->aParent = [];
+ $this->isToTg = false;
+ $this->isToTgOne = false;
+ $this->aResult = ['isDone' => false];
+ return $this;
+ }
+
+ // action
+ public function done(mixed $msg = null)
+ {
+ $this->setDone();
+ if ($msg) {
+ $this->msg($msg);
+ }
+ return $this->get();
+ }
+
+ // action
+ public function fail(mixed $msg = null, array $aParentResult = [])
+ {
+ $this->setFail('fail');
+ if ($aParentResult) {
+ $this->aParent = $aParentResult;
+ }
+ if ($msg) {
+ $this->msg($msg);
+ }
+ return $this->getFull();
+ }
+
+ // action
+// public function sendTg() // 伪装成非set
+// {
+// $this->enableTgOne();
+// return $this;
+// }
+
+ // action
+ public function sendTg($sBotCode = 'base', $sChatCode = 'base')
+ {
+
+ }
+
+ public function getDataA()
+ {
+ return $this->aResult["aData"] ?? [];
+ }
+
+ public function getDataS()
+ {
+ return (string) $this->aResult["sData"] ?? '';
+ }
+
+ public function getDataI()
+ {
+ return (int) $this->aResult["iData"] ?? 0;
+ }
+
+ public function getDataB()
+ {
+ return (bool) $this->aResult["bData"] ?? false;
+ }
+
+ public function getDataX()
+ {
+ return $this->aResult["xData"] ?? '';
+ }
+
+ public function setDataA(array $aData): self
+ {
+ $this->aData($aData);
+ return $this;
+ }
+
+ public function setDataB(bool $bData): self
+ {
+ $this->aResult["bData"] = $bData;
+ return $this;
+ }
+
+ public function setDataS(string $sData): self
+ {
+ $this->aResult["sData"] = $sData;
+ return $this;
+ }
+
+ public function setDataI(int $iData): self
+ {
+ $this->aResult["iData"] = $iData;
+ return $this;
+ }
+
+ public function setDataX($xData): self
+ {
+ $this->aResult["xData"] = $xData;
+ return $this;
+ }
+
+ public function getResult(): array
+ {
+ return $this->aResult;
+ }
+
+ // action
+ public function get()
+ {
+ if ($this->isToTg) {
+ $this->_sendTg();
+ }
+
+ if ($this->isToTgOne) {
+ $this->isToTg = false;
+ $this->isToTgOne = false;
+ }
+
+ if ($this->isChain) {
+ return $this;
+ }
+
+ return $this->aResult;
+ }
+
+ // action
+ public function getFull()
+ {
+ $this->withStep();
+ return $this->get();
+ }
+
+ // action
+ public function toArray()
+ {
+ return $this->aResult;
+ }
+
+ // action
+ public function toJson($bFormat = true)
+ {
+ if ($bFormat === true) {
+ return json_encode($this->aResult, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+ } else {
+ return json_encode($this->aResult);
+ }
+ }
+
+ // helper
+ public function isDone()
+ {
+ return $this->aResult["isDone"] ?? false;
+ }
+
+ // helper
+ public function isFail()
+ {
+ return !$this->isDone();
+ }
+
+ // helper
+ public static function isDoneResult(array $aResult): bool
+ {
+ return $aResult['isDone'] ?? false;
+ }
+
+ // helper
+ public static function isFailResult(array $aResult): bool
+ {
+ return !self::isDoneResult($aResult);
+ }
+
+ // shell
+ public function fetch()
+ {
+ return $this->get();
+ }
+
+ // shell
+ public function fetchAll()
+ {
+ return $this->getFull();
+ }
+
+ private function _sendTg()
+ {
+ TelegramVdb::make()->dataArr($this->aResult)->save();
+ }
+
+ protected function addStepParent(): void
+ {
+ $this->aStep[] = $this->aParent;
+ }
+
+ protected function withParentStep(): void
+ {
+ if ($this->aParent) {
+ $this->addStepParent();
+ }
+ }
+}
diff --git a/app/Services/TomTool/Http.php b/app/Services/TomTool/Http.php
new file mode 100755
index 00000000..cf07df25
--- /dev/null
+++ b/app/Services/TomTool/Http.php
@@ -0,0 +1,93 @@
+sToUrl = $sUrl;
+ }
+
+ // 初始化 cURL 会话
+ $ch = curl_init();
+
+ // 设置请求 URL
+ curl_setopt($ch, CURLOPT_URL, $this->sToUrl);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回响应而不是输出
+
+ // 根据请求方法设置 cURL 选项
+ switch (strtolower($this->sMethod)) {
+ case 'post':
+ curl_setopt($ch, CURLOPT_POST, true); // 设置为 POST 请求
+ if ($this->bIsJson) {
+ curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($this->aData)); // 设置 POST 数据为 JSON
+ curl_setopt($ch, CURLOPT_HTTPHEADER, [
+ 'Content-Type: application/json', // 设置内容类型为 JSON
+ 'Content-Length: ' . strlen(json_encode($this->aData)) // 设置内容长度
+ ]);
+ } else {
+ curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($this->aData)); // 设置 POST 数据为普通表单格式
+ }
+ break;
+
+ case 'put':
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); // 设置为 PUT 请求
+ if ($this->bIsJson) {
+ curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($this->aData)); // 设置 PUT 数据为 JSON
+ curl_setopt($ch, CURLOPT_HTTPHEADER, [
+ 'Content-Type: application/json', // 设置内容类型为 JSON
+ 'Content-Length: ' . strlen(json_encode($this->aData)) // 设置内容长度
+ ]);
+ } else {
+ curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($this->aData)); // 设置 PUT 数据为普通表单格式
+ }
+ break;
+
+ case 'get':
+ // 默认使用 GET 请求
+ curl_setopt($ch, CURLOPT_HTTPGET, true); // 设置为 GET 请求
+ curl_setopt($ch, CURLOPT_URL, $this->sToUrl . '?' . http_build_query($this->aData)); // 设置请求 URL
+ if ($this->bIsJson) {
+ curl_setopt($ch, CURLOPT_HTTPHEADER, [
+ 'Accept: application/json' // 设置接受的内容类型为 JSON
+ ]);
+ }
+ break;
+ }
+
+ // 禁用 SSL 验证
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 不验证对等证书
+ curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 不验证主机名
+
+ // 执行 cURL 请求
+ $response = curl_exec($ch);
+
+ // 检查是否有错误
+ if (curl_errno($ch)) {
+ return 'Error: ' . curl_error($ch);
+ }
+
+ // 关闭 cURL 会话
+ curl_close($ch);
+
+ // 返回响应
+ return $response;
+ }
+
+ public static function response($iCode, $sMsg = '')
+ {
+ http_response_code($iCode);
+ echo $sMsg;
+ exit;
+ }
+}
diff --git a/app/Services/TomTool/HttpV2.php b/app/Services/TomTool/HttpV2.php
new file mode 100755
index 00000000..4cc18ca1
--- /dev/null
+++ b/app/Services/TomTool/HttpV2.php
@@ -0,0 +1,203 @@
+send()
+
+ 进阶:
+ HttpV2::make($url, "get")->setDataA($aData)->enableJsonAs()->enableAsync()->optMethod("get")->send();
+
+ action:
+ send()
+
+ data:
+ xData()
+ sData()
+ jData()
+ sData()
+
+ set:
+ optMethod()
+ enableJsonAs()
+ enableJsonSend()
+ enableJsonReturn()
+
+ @note:
+ 默认关闭 SSL 验证(适用于开发环境),生产环境建议开启
+ 异步模式下不会返回响应内容,仅快速触发请求
+
+ */
+
+
+class HttpV2
+{
+ protected string $method;
+ protected $data = [];
+ protected string $url;
+ protected bool $sendJson = false;
+ protected bool $returnJson = false;
+ protected bool $async = false;
+ // 匈牙利命名法,仅新增一个 token 变量
+ protected string $sToken = '';
+
+ public static function make(string $url, string $method = 'post'): self
+ {
+ $instance = new self();
+ $instance->url = $url;
+ $instance->optMethod($method);
+ return $instance;
+ }
+
+ public function optMethod(string $method): self
+ {
+ $this->method = strtolower($method);
+ return $this;
+ }
+
+ /**
+ * 新增:支持携带 Token
+ * 如果不传值,默认从环境变量 token_base 获取
+ */
+ public function withToken(?string $sToken = null): self
+ {
+ $this->sToken = $sToken ?? (string)env('token_base', false);
+ return $this;
+ }
+
+ public function setDataX($xData)
+ {
+ $this->setData($xData);
+ return $this;
+ }
+
+ public function setDataA($aData)
+ {
+ $this->setData($aData);
+ return $this;
+ }
+
+ public function setDataS($sData)
+ {
+ $this->setData($sData);
+ return $this;
+ }
+
+ public function setData($xData)
+ {
+ $this->data = $xData;
+ return $this;
+ }
+
+ public function enableJsonSend(bool $flag = true): self
+ {
+ $this->sendJson = $flag;
+ return $this;
+ }
+
+ public function enableJsonReturn(bool $flag = true): self
+ {
+ $this->returnJson = $flag;
+ return $this;
+ }
+
+ public function enableJsonAs(): self
+ {
+ $this->sendJson = true;
+ $this->returnJson = true;
+ return $this;
+ }
+
+ public function enableAsync(bool $flag = true): self
+ {
+ $this->async = $flag;
+ return $this;
+ }
+
+ public function send(): string
+ {
+ $oFlow = Flow::make("HttpV2::send");
+
+ $ch = curl_init();
+ $headers = [];
+
+ // --- 核心嵌入:如果 sToken 有值且不是 false,塞进 Header ---
+ if ($this->sToken && $this->sToken !== 'false') {
+ $headers[] = 'Authorization: Bearer ' . $this->sToken;
+ }
+
+ // 构建 URL 和请求体 (完全保留原样)
+ if ($this->method === 'get') {
+ $url = $this->url . '?' . http_build_query($this->data);
+ curl_setopt($ch, CURLOPT_URL, $url);
+ curl_setopt($ch, CURLOPT_HTTPGET, true);
+ } else {
+ curl_setopt($ch, CURLOPT_URL, $this->url);
+ $payload = $this->sendJson ? json_encode($this->data) : http_build_query($this->data);
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
+
+ if ($this->method === 'post') {
+ curl_setopt($ch, CURLOPT_POST, true);
+ } else {
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, strtoupper($this->method));
+ }
+
+ if ($this->sendJson) {
+ $headers[] = 'Content-Type: application/json';
+ $headers[] = 'Content-Length: ' . strlen($payload);
+ }
+ }
+
+ if ($this->returnJson) {
+ $headers[] = 'Accept: application/json';
+ }
+
+ if (!empty($headers)) {
+ curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
+ }
+
+ // SSL 设置 (完全保留原样)
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+ curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
+
+ // 异步发送 (完全保留原样)
+ if ($this->async) {
+ curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);
+ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 200);
+ curl_setopt($ch, CURLOPT_NOSIGNAL, true);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
+ curl_exec($ch);
+ curl_close($ch);
+ return 'sent';
+ }
+
+ // 阻塞执行 (完全保留原样)
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+ $response = curl_exec($ch);
+
+ if (curl_errno($ch)) {
+ $error = curl_error($ch);
+ curl_close($ch);
+ throw new Exception("cURL Error: {$error}");
+ }
+
+ curl_close($ch);
+
+ return $response;
+ }
+}
diff --git a/app/Services/TomTool/Map.php b/app/Services/TomTool/Map.php
new file mode 100755
index 00000000..7d68dd3b
--- /dev/null
+++ b/app/Services/TomTool/Map.php
@@ -0,0 +1,26 @@
+sBotCode = $sBotCode;
+ $oInstance->sChatCode = $sChatCode;
+ return $oInstance;
+ }
+
+ public function setBotCode(string $sBotCode): self
+ {
+ $this->sBotCode = $sBotCode;
+ return $this;
+ }
+
+ public function setChatCode(string $sChatCode): self
+ {
+ $this->sChatCode = $sChatCode;
+ return $this;
+ }
+
+ public function setBotToken(string $sBotToken): self
+ {
+ $this->sBotToken = $sBotToken;
+ return $this;
+ }
+
+ public function setChatId(int $iChatId): self
+ {
+ $this->iChatId = $iChatId;
+ return $this;
+ }
+
+ public function setMsgS(string $sMsg): self
+ {
+ $this->sMsg = $sMsg;
+ return $this;
+ }
+
+ public function setPhotoUrl(string $sPhotoUrl, int $iPhotoWidth = 0, int $iPhotoHeight = 0): self
+ {
+ $this->sPhotoUrl = $sPhotoUrl;
+ $this->iPhotoWidth = $iPhotoWidth;
+ $this->iPhotoHeight = $iPhotoHeight;
+ return $this;
+ }
+
+ public function setType(string $sType): self
+ {
+ $this->sType = $sType;
+ return $this;
+ }
+
+ public function setFileUrl(string $sFileUrl = '', string $sFileName = ''): self
+ {
+ $this->sFileUrl = $sFileUrl;
+ $this->sFileName = $sFileName;
+ return $this;
+ }
+
+ public function send($sMsg = ''): Flow
+ {
+ if ($sMsg) {
+ $this->sMsg = $sMsg;
+ }
+
+ if (!$this->sMsg) {
+// throw new \Exception("未设置msg");
+ }
+
+ $this->keyBegin();
+
+ if ($this->enableQueue) {
+ $aData = $this->buildDataTom();
+ $oFlow = ServiceHttpQueue::start("telegram_local")->arg($aData)->save();
+ } else {
+ $oFlow = ServiceTelegramSdk::start()
+ ->setBotToken($this->sBotToken)
+ ->setChatId($this->iChatId)
+ ->setMsgS($this->sMsg)
+ ->setPhotoUrl($this->sPhotoUrl, $this->iPhotoWidth, $this->iPhotoHeight)
+ ->setFileUrl($this->sFileUrl, $this->sFileName)
+ ->setType($this->sType)
+ ->send();
+ }
+
+ return $oFlow;
+ }
+
+ private function keyBegin()
+ {
+ if (!$this->bKeyBegin) {
+ if (!$this->sBotToken) {
+ $this->sBotToken = ModelTelegramKey::botTokenByCode($this->sBotCode);
+ }
+
+ if (!$this->iChatId) {
+ $this->iChatId = ModelTelegramKey::chatIdByCode($this->sChatCode);
+ }
+
+ if (!$this->sBotToken || !$this->iChatId) {
+ throw new \RuntimeException("botToken或chatId没找到,botCode={$this->sBotCode},chatCode={$this->sChatCode}");
+ }
+
+ $this->bKeyBegin = true;
+ }
+ }
+
+ private function buildDataTom(): array
+ {
+ return [
+ "sBotCode" => $this->sBotCode ?? '',
+ "sChatCode" => $this->sChatCode ?? '',
+ "sBotToken" => $this->sBotToken ?? '',
+ "iChatId" => $this->iChatId ?? '',
+ "sPhotoUrl" => $this->sPhotoUrl ?? '',
+ "iPhotoWidth" => $this->iPhotoWidth,
+ "iPhotoHeight" => $this->iPhotoHeight,
+ "sFileUrl" => $this->sFileUrl,
+ "sFileName" => $this->sFileName,
+ "sMsg" => $this->sMsg ?? '',
+ "sType" => $this->sType ?? '',
+ ];
+ }
+
+
+}
diff --git a/app/Services/TomTool/Telegram/Sdk.php b/app/Services/TomTool/Telegram/Sdk.php
new file mode 100755
index 00000000..b022dd6d
--- /dev/null
+++ b/app/Services/TomTool/Telegram/Sdk.php
@@ -0,0 +1,215 @@
+oApi = new Api($sBotToken);
+ $this->sBotToken = $sBotToken;
+ return $this;
+ }
+
+ public function setChatId($iChatId)
+ {
+ $this->iChatId = $iChatId;
+ return $this;
+ }
+
+ public function setMsgS($sMsg = '')
+ {
+ $this->sMsg = $sMsg;
+ return $this;
+ }
+
+ public function setPhotoUrl($sUrl = '', $iPhotoWidth = 0, $iPhotoHeight = 0)
+ {
+ $this->sPhotoUrl = $sUrl;
+ $this->iPhotoWidth = $iPhotoWidth;
+ $this->iPhotoHeight = $iPhotoHeight;
+ return $this;
+ }
+
+ public function setFileUrl($sFileUrl = '', $sFileName = '')
+ {
+ $this->sFileUrl = $sFileUrl;
+ $this->sFileName = $sFileName;
+ return $this;
+ }
+
+ public function setType($sType)
+ {
+ if ($sType) {
+ $this->sMsgFormatType = $sType;
+ }
+
+ return $this;
+ }
+
+ public function send()
+ {
+ $oFlow = Flow::start("tg_sdk_send");
+
+ $this->msgFormat();
+
+// try {
+
+ if ($this->sPhotoUrl) {
+ $r = $this->oApi->sendPhoto($this->sMsgFormat);
+ } else if ($this->sFileUrl) {
+ $r = $this->oApi->sendDocument($this->sMsgFormat);
+ } else {
+ $r = $this->oApi->sendMessage($this->sMsgFormat);
+ }
+
+ if (!($r && $r->getMessageId())) {
+ return $oFlow->fail($r);
+ }
+// } catch (TelegramSDKException $e) {
+// return $oFlow->fail(['error' => $e->getMessage()]);
+// }
+
+ return $oFlow->done();
+ }
+
+ public function getMsgFormat()
+ {
+ $this->msgFormat();
+
+ return $this->sMsgFormat;
+ }
+
+ public function msgFormat()
+ {
+ if (!in_array($this->sMsgFormatType, self::ALLOWED_FORMATS, true)) {
+ throw new \RuntimeException("不支持的格式类型: {$this->sMsgFormatType}");
+ }
+
+ $method = 'msgFormat_' . $this->sMsgFormatType;
+ $this->sMsgFormat = $this->$method();
+
+ if ($this->sPhotoUrl) {
+
+ $oManager = new ImageManager(new Driver());
+
+ $sTempPath = $_ENV['dir_base'].'public/upload';
+ $sTempPath .= "/tg_output.png";
+
+ $sImg = file_get_contents($this->sPhotoUrl);
+ $oImage = $oManager->read($sImg);
+
+ if ($this->iPhotoWidth && $this->iPhotoHeight) {
+ $oImage = $oImage->cover($this->iPhotoWidth, $this->iPhotoHeight);
+ }
+
+ $oImage->toJpg(80)->save($sTempPath);
+
+ $photo = InputFile::create($sTempPath, date("Y-m-d").'.jpg');
+
+ $this->sMsgFormat["photo"] = $photo;
+
+ $this->sMsgFormat["caption"] = $this->sMsgFormat["text"];
+ unset($this->sMsgFormat["text"]);
+
+ } else if ($this->sFileUrl) {
+
+ if (!$this->sFileName) {
+ $sFileName = date("Y-m-d H:i:s").'.txt';
+ } else {
+ $sFileName = $this->sFileName;
+ }
+
+ $sFile = InputFile::create($this->sFileUrl, $sFileName);
+
+ $this->sMsgFormat["document"] = $sFile;
+ $this->sMsgFormat["caption"] = $this->sMsgFormat["text"];
+ unset($this->sMsgFormat["text"]);
+
+ }
+
+ return $this;
+ }
+
+ private function msgFormat_none()
+ {
+ return [
+ 'chat_id' => $this->iChatId,
+ 'text' => $this->sMsg,
+ 'parse_mode' => '',
+ 'disable_web_page_preview' => false,
+ 'reply_to_message_id' => null,
+ 'reply_markup' => null,
+ ];
+ }
+
+ private function msgFormat_html()
+ {
+ return [
+ 'chat_id' => $this->iChatId,
+ 'text' => strip_tags($this->sMsg, [
+ 'b', 'strong', 'i', 'em', 'u', 'ins', 's', 'strike', 'del', 'span', 'tg-spoiler', 'a', 'tg-emoji',
+ 'code', 'pre',
+ ]),
+ 'parse_mode' => 'HTML',
+ 'disable_web_page_preview' => false,
+ 'reply_to_message_id' => null,
+ 'reply_markup' => null,
+ ];
+ }
+
+ private function msgFormat_markdown()
+ {
+ return [
+ 'chat_id' => $this->iChatId,
+ 'text' => $this->sMsg,
+ 'parse_mode' => 'Markdown',
+ 'disable_web_page_preview' => false,
+ 'reply_to_message_id' => null,
+ 'reply_markup' => null,
+ ];
+ }
+
+ private function msgFormat_markdownV2()
+ {
+ return [
+ 'chat_id' => $this->iChatId,
+ 'text' => $this->sMsg,
+ 'parse_mode' => 'MarkdownV2',
+ 'disable_web_page_preview' => false,
+ 'reply_to_message_id' => null,
+ 'reply_markup' => null,
+ ];
+ }
+
+}
diff --git a/app/Services/TomTool/Telegram/Slave.php b/app/Services/TomTool/Telegram/Slave.php
new file mode 100755
index 00000000..75dc21b3
--- /dev/null
+++ b/app/Services/TomTool/Telegram/Slave.php
@@ -0,0 +1,361 @@
+sBotCode = $sBotCode;
+ $oInstance->sChatCode = $sChatCode;
+ $oInstance->enableSend = filter_var($_ENV["tg_send_enable"] ?? true, FILTER_VALIDATE_BOOLEAN);
+ return $oInstance;
+ }
+
+ // new
+ public static function log(string $sChatCode = 'admin'): self
+ {
+ return self::start("log", $sChatCode);
+ }
+
+ // new
+ public static function warn(string $sChatCode = 'admin'): self
+ {
+ return self::start("warn", $sChatCode);
+ }
+
+ // new
+ public static function fail(string $sChatCode = 'admin'): self
+ {
+ return self::start("fail", $sChatCode);
+ }
+
+ // new
+ public static function notify(string $sChatCode = 'admin'): self
+ {
+ return self::start("fail", $sChatCode);
+ }
+
+
+ // opt
+ public function enableAsync(bool $b = true): self
+ {
+ $this->enableAsync = $b;
+ return $this;
+ }
+
+ // opt
+ public function enableDetail(bool $b = true): self
+ {
+ $this->enableDetail = $b;
+ return $this;
+ }
+
+ // opt
+ public function enableSlaveQueue(bool $b = true): self
+ {
+ $this->enableSlaveQueue = $b;
+ return $this;
+ }
+
+ // opt
+ public function enableMaster(bool $b = true): self
+ {
+ $this->enableMaster = $b;
+ return $this;
+ }
+
+ // opt
+ public function enableMasterQueue(bool $b = true): self
+ {
+ $this->enableMasterQueue = $b;
+ return $this;
+ }
+
+ // set
+ public function setPhotoUrl(string $sPhotoUrl, int $iWidth = 0, int $iHeight = 0): self
+ {
+ $this->sPhotoUrl = $sPhotoUrl;
+ $this->iPhotoWidth = $iWidth;
+ $this->iPhotoHeight = $iHeight;
+ return $this;
+ }
+
+ // set
+ public function setFileUrl(string $sFileUrl, string $sFileName = ''): self
+ {
+ $this->sFileUrl = $sFileUrl;
+ $this->sFileName = $sFileName;
+ return $this;
+ }
+
+ // set
+ public function setType(string $sType): self
+ {
+ $this->sType = $sType;
+ return $this;
+ }
+
+ // set
+ public function setMsgS(string $sMsg = ''): self
+ {
+ if ($this->enableDetail) {
+ $sMsg = "[ ".$this->getEnvSiteCode()." | ".date("d:H:i:s")." ] ".$sMsg;
+ }
+
+ $this->sMsg = $sMsg;
+
+ return $this;
+ }
+
+ // set
+ public function setMsgA(array $aMsg = []): self
+ {
+ $aMsgNew = $aMsg;
+
+ if ($this->enableDetail) {
+ $aMsgNew = [];
+ $aMsgNew["site_code"] = $this->getEnvSiteCode();
+ $aMsgNew["date"] = date("Y-m-d H:i:s");
+ $aMsgNew["data"] = $aMsg;
+ }
+
+ $this->sMsg = json_encode($aMsgNew, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
+
+ return $this;
+ }
+
+ // set
+ public function setBotCode(string $sBotCode): self
+ {
+ $this->sBotCode = $sBotCode;
+ return $this;
+ }
+
+ // set
+ public function setChatCode(string $sChatCode): self
+ {
+ $this->sChatCode = $sChatCode;
+ return $this;
+ }
+
+ // set
+ public function setBotToken(string $sBotToken): self
+ {
+ $this->sBotToken = $sBotToken;
+ return $this;
+ }
+
+ // set
+ public function setChatId(int $iChatId): self
+ {
+ $this->iChatId = $iChatId;
+ return $this;
+ }
+
+ // action
+ public function send($xMsg = ''): Flow
+ {
+ if ($this->enableSend == false) {
+ $oFlow = Flow::start();
+ return $oFlow->done("不发送");
+ }
+
+ if ($xMsg) {
+ if (is_array($xMsg)) {
+ $this->setMsgA($xMsg);
+ } else {
+ $this->setMsgS($xMsg);
+ }
+ }
+
+ if (!$this->sMsg) {
+// throw new \Exception("未设置msg");
+ }
+
+ if ($this->enableMaster) {
+ $oFlow = $this->_send_master();
+ } else {
+ $oFlow = $this->_send_local();
+ }
+
+ return $oFlow;
+ }
+
+ // action
+ public function sendMaster($xMsg = ''): Flow
+ {
+ $this->enableMaster(true);
+ return $this->send($xMsg);
+ }
+
+ // action
+ public function sendLocal($xMsg = ''): Flow
+ {
+ $this->enableMaster(false);
+ return $this->send($xMsg);
+ }
+
+ private function _send_master(): Flow
+ {
+ $aData = $this->buildDataTom();
+
+ if ($this->enableSlaveQueue) {
+ $oFlow = ServiceHttpQueue::start("telegram_master")->arg($aData)->save();
+ } else {
+
+ $oFlow = Flow::start("_send_master");
+ $sUrlMaSterBase = $_ENV["url_master_base"] ?? "";
+
+ if (!$sUrlMaSterBase) {
+ throw new \Exception("未设置env的url_master_base");
+ }
+
+ $sUrlMasterPost = "https://".$sUrlMaSterBase."/api/telegram/post";
+
+ try {
+
+ $oHttpV2 = HttpV2::make($sUrlMasterPost);
+
+ if ($this->enableAsync) {
+ $oHttpV2 = $oHttpV2->enableAsync();
+ }
+
+ $r = $oHttpV2->enableJsonAs()->setData($aData)->send();
+
+ if ($this->enableAsync) {
+ return $oFlow->sData("async")->done("async");
+ } else {
+ $a = json_decode($r, true);
+ $isDone = $a["isDone"] ?? false;
+
+ if ($isDone) {
+ return $oFlow->done();
+ } else {
+ return $oFlow->fail($r);
+ }
+
+ }
+
+ } catch (\Throwable $e) {
+ $oFlow = $oFlow->fail($e->getMessage());
+ }
+ }
+
+ return $oFlow;
+ }
+
+ // 直接从本地发到tg,几乎用不上,都走master了
+ private function _send_local(): Flow
+ {
+ if ($this->enableSlaveQueue) {
+ $aData = $this->buildDataTom();
+ $oFlow = ServiceHttpQueue::start("telegram_local")->arg($aData)->save();
+ } else {
+ $oFlow = ServiceTelegramSdk::start($this->sBotToken, $this->iChatId)->setMsgS($this->sMsg)->send();
+ }
+
+ return $oFlow;
+ }
+
+ private function buildDataTom(): array
+ {
+ return [
+ "sBotCode" => $this->sBotCode ?? '',
+ "sChatCode" => $this->sChatCode ?? '',
+ "sBotToken" => $this->sBotToken ?? '',
+ "iChatId" => $this->iChatId ?? '',
+ "enableMasterQueue" => $this->enableMasterQueue ?? '',
+ "enableMaster" => $this->enableMaster,
+ "sMsg" => $this->sMsg ?? '',
+ "sPhotoUrl" => $this->sPhotoUrl ?? '',
+ "iPhotoWidth" => $this->iPhotoWidth ?? 0,
+ "iPhotoHeight" => $this->iPhotoHeight ?? 0,
+ "sType" => $this->sType ?? '',
+ "sFileUrl" => $this->sFileUrl ?? '',
+ "sFileName" => $this->sFileName ?? '',
+ ];
+ }
+
+ private function getEnvSiteCode(): string
+ {
+ $sEnvSiteCode = $_ENV["site_code"] ?? "未设置env的site_code";
+
+ return $sEnvSiteCode;
+ }
+
+}
diff --git a/app/Services/TomTool/TelegramV2.php b/app/Services/TomTool/TelegramV2.php
new file mode 100755
index 00000000..35bdbe2f
--- /dev/null
+++ b/app/Services/TomTool/TelegramV2.php
@@ -0,0 +1,121 @@
+setToken($sToken);
+
+ $this->setTo($sTo);
+
+// $this->bot = new Api($this->sToken);
+ }
+
+ public function setMsgType($sMsgType)
+ {
+ $this->sMsgType = $sMsgType;
+ }
+
+ public function setTo($xTo, $sType = "code")
+ {
+ $iChatId = $xTo;
+
+ if ($sType == "code") {
+// $sEnvKey = "tgChat_".$xTo;
+ $iChatId = $_ENV['tgChat'][$iChatId];
+ }
+
+ $this->iTo = $iChatId;
+ }
+
+ public function setToken($xToken, $sType = "code")
+ {
+ $sToken = $xToken;
+
+ if ($sType == "code") {
+// $sEnvKey = "tgToken_".$xToken;
+ $sToken = $_ENV['tgToken'][$sToken];
+ }
+
+ $this->sToken = $sToken;
+
+ $this->bot = new Api($this->sToken);
+ }
+
+ public function send($sMsg, $sMsgType = 'str')
+ {
+ if ($sMsgType == "arr") {
+ $sMsg = json_encode($sMsg, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
+ }
+
+ if ($this->sMsgType === false) {
+ $sendMessage = [
+ 'chat_id' => $this->iTo,
+ 'text' => $sMsg,
+ 'parse_mode' => '',
+ 'disable_web_page_preview' => false,
+ 'reply_to_message_id' => null,
+ 'reply_markup' => null,
+ ];
+ } else if ($this->sMsgType === "html") {
+ $sendMessage = [
+ 'chat_id' => $this->iTo,
+ 'text' => strip_tags(
+ $sMsg,
+ ['b', 'strong', 'i', 'em', 'u', 'ins', 's', 'strike','del', 'span','tg-spoiler', 'a', 'tg-emoji',
+ 'code', 'pre',
+ ]
+ ),
+ 'parse_mode' => 'HTML',
+ 'disable_web_page_preview' => false,
+ 'reply_to_message_id' => null,
+ 'reply_markup' => null,
+ ];
+ } else if ($this->sMsgType === "markdown") {
+ $sendMessage = [
+ 'chat_id' => $this->iTo,
+ 'text' => $sMsg,
+ 'parse_mode' => 'Markdown',
+ 'disable_web_page_preview' => false,
+ 'reply_to_message_id' => null,
+ 'reply_markup' => null,
+ ];
+ } else if ($this->sMsgType === "markdownV2") {
+ $sendMessage = [
+ 'chat_id' => $this->iTo,
+ 'text' => $sMsg,
+ 'parse_mode' => 'MarkdownV2',
+ 'disable_web_page_preview' => false,
+ 'reply_to_message_id' => null,
+ 'reply_markup' => null,
+ ];
+ } else {
+ $sendMessage = [
+ 'chat_id' => $this->iTo,
+ 'text' => $sMsg,
+ 'parse_mode' => '',
+ 'disable_web_page_preview' => false,
+ 'reply_to_message_id' => null,
+ 'reply_markup' => null,
+ ];
+ }
+
+ return $this->bot->sendMessage($sendMessage);
+ }
+
+}
diff --git a/app/Services/TomTool/TelegramVdb_rengle.php b/app/Services/TomTool/TelegramVdb_rengle.php
new file mode 100755
index 00000000..55a8bfe6
--- /dev/null
+++ b/app/Services/TomTool/TelegramVdb_rengle.php
@@ -0,0 +1,362 @@
+save($sData)
+
+ 进阶:
+ TelegramVdb::make()->dataArr($aData)->setFormat("html")->save();
+ TelegramVdb::make()->setFormat()->data($xData)->toJson()->save();
+
+ data:
+ data[Arr/Str/Json]($data)
+ data($aData)->toJson()
+
+ action:
+ save()
+
+ set:
+ setChatCode($code)
+ setBotCode($code)
+ setChatId($id) 覆盖code
+ setBotToken($token) 覆盖code
+ setFormat($type)
+ enableDate()
+
+ */
+
+final class TelegramVdb
+{
+ public $sBotCode;
+ public $sChatCode;
+ public $sBotToken = null;
+ public $iChatId = null;
+ public $sMsg = '';
+ public $sMsgFormat = '';
+ public $sMsgFormatType = 'none';
+ public $bEnableDate = false;
+ private $bKeyBegin = false;
+ public $sClient = "master";
+
+ private const ALLOWED_FORMATS = ['none', 'html', 'markdown', 'markdownV2'];
+
+ public static function log()
+ {
+ return self::make("log", "admin");
+ }
+
+ public static function warn()
+ {
+ return self::make("warn", "admin");
+ }
+
+ public static function fail()
+ {
+ return self::make("fail", "admin");
+ }
+
+ public static function notify()
+ {
+ return self::make("notify", "admin");
+ }
+
+ public static function make($sBotCode = "base", $sChatCode = "base")
+ {
+ $oInstance = new self();
+ $oInstance->sBotCode = $sBotCode;
+ $oInstance->sChatCode = $sChatCode;
+ return $oInstance;
+ }
+
+ public function send($sMsg = '')
+ {
+ return $this->_ok($sMsg, true);
+ }
+
+ public function save($sMsg = '')
+ {
+ return $this->_ok($sMsg);
+ }
+
+ private function sendNow()
+ {
+ $oResult = Flow::make("send");
+ $oBot = new Api($this->sBotToken);
+
+ $r = $oBot->sendMessage($this->sMsgFormat);
+
+ if ($r->isOk()){
+ return $oResult->done();
+ } else {
+ return $oResult->fail("send失败");
+ }
+ }
+
+ private function HttpQueueSave()
+ {
+ $aTelegramArg = [
+ "bot_token" => $this->sBotToken,
+ "chat_id" => $this->iChatId,
+ "msg" => $this->sMsgFormat,
+ ];
+
+ $aReturn = ServiceHttpQueue::start("telegram")->arg($aTelegramArg)->save()->getResult();
+
+ return $aReturn;
+ }
+
+ public function _ok($sMsg = '', $bSendNow = false)
+ {
+ $bTgSendEnable = $_ENV["tg_send_enable"] ?? false;
+ if (!$bTgSendEnable) {
+ return false;
+ }
+
+ $oResult = Flow::make("save");
+
+ $this->keyBegin();
+
+ if ($sMsg) {
+ if (is_array($sMsg)) {
+ $this->aData($sMsg);
+ } else {
+ $this->sData($sMsg);
+ }
+ }
+
+ $this->msgFormat();
+
+ if ($bSendNow) {
+ $aReturn = $this->sendNow();
+ } else {
+ $aReturn = $this->HttpQueueSave();
+ }
+
+ $this->sMsg = '';
+
+ return $aReturn;
+ }
+
+ public function enableDate($b = true)
+ {
+ $this->bEnableDate = $b;
+ return $this;
+ }
+
+ public function data($xData)
+ {
+ $this->sMsg = $xData;
+ return $this;
+ }
+
+ public function jData($sMsg = '')
+ {
+ $this->dataJson($sMsg);
+ return $this;
+ }
+
+ public function aData($sMsg = [])
+ {
+ $this->dataArr($sMsg);
+ return $this;
+ }
+
+ public function sData($sMsg = '')
+ {
+ $this->dataStr($sMsg);
+ return $this;
+ }
+
+ public function toJson()
+ {
+ $this->withDateArr();
+ $this->sMsg = json_encode($this->sMsg, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
+ return $this;
+ }
+
+ public function dataStr($sMsg = '')
+ {
+ $this->withDateStr();
+ $this->sMsg = $sMsg;
+ return $this;
+ }
+
+ public function dataArr($sMsg = [])
+ {
+ $this->withDateArr();
+ $this->sMsg = json_encode($sMsg, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
+ return $this;
+ }
+
+ public function dataJson($sMsg = '')
+ {
+ $this->dataStr($sMsg);
+ return $this;
+ }
+
+ private function withDateArr()
+ {
+ if ($this->bEnableDate) {
+ $this->sMsg["date"] = date("Y-m-d H:i:s");
+ }
+ }
+
+ private function withDateStr()
+ {
+ if ($this->bEnableDate) {
+ $this->sMsg = '['.date("Y-m-d H:i:s").'] '.$this->sMsg;
+ }
+ }
+
+ public function setFormat($sMsgFormatType = "none")
+ {
+ $this->sMsgFormatType = $sMsgFormatType;
+ return $this;
+ }
+
+ public function setBotCode($sBotCode)
+ {
+ $this->sBotCode = $sBotCode;
+ $this->bKeyBegin = false;
+ return $this;
+ }
+
+ public function setChatCode($sChatCode)
+ {
+ $this->sChatCode = $sChatCode;
+ $this->bKeyBegin = false;
+ return $this;
+ }
+
+ public function setBotToken($sBotToken)
+ {
+ $this->sBotToken = $sBotToken;
+ return $this;
+ }
+
+ public function setChatId($iChatId)
+ {
+ $this->iChatId = $iChatId;
+ return $this;
+ }
+
+ private function keyBegin()
+ {
+ if (!$this->bKeyBegin) {
+ if (!$this->sBotToken) {
+ $this->sBotToken = $this->botTokenByCode();
+ }
+
+ if (!$this->iChatId) {
+ $this->iChatId = $this->chatIdByCode();
+ }
+
+ if (!$this->sBotToken || !$this->iChatId) {
+ throw new \RuntimeException("botToken或chatId没找到,botCode={$this->sBotCode},chatCode={$this->sChatCode}");
+ }
+
+ $this->bKeyBegin = true;
+ }
+
+ return $this;
+ }
+
+ private function msgFormat()
+ {
+ if (!in_array($this->sMsgFormatType, self::ALLOWED_FORMATS, true)) {
+ throw new \RuntimeException("不支持的格式类型: {$this->sMsgFormatType}");
+ }
+
+ $method = 'msgFormat_' . $this->sMsgFormatType;
+ $this->$method();
+
+ return $this;
+ }
+
+ private function botTokenByCode()
+ {
+ return ModelTelegramKey::botTokenByCode($this->sBotCode);
+ }
+
+ private function chatIdByCode()
+ {
+ return ModelTelegramKey::chatIdByCode($this->sChatCode);
+ }
+
+ private function msgFormat_none()
+ {
+ $this->sMsgFormat = [
+ 'chat_id' => $this->iChatId,
+ 'text' => $this->sMsg,
+ 'parse_mode' => '',
+ 'disable_web_page_preview' => false,
+ 'reply_to_message_id' => null,
+ 'reply_markup' => null,
+ ];
+
+ return $this;
+ }
+
+ private function msgFormat_html()
+ {
+ $this->sMsgFormat = [
+ 'chat_id' => $this->iChatId,
+ 'text' => strip_tags($this->sMsg, [
+ 'b', 'strong', 'i', 'em', 'u', 'ins', 's', 'strike', 'del', 'span', 'tg-spoiler', 'a', 'tg-emoji',
+ 'code', 'pre',
+ ]),
+ 'parse_mode' => 'HTML',
+ 'disable_web_page_preview' => false,
+ 'reply_to_message_id' => null,
+ 'reply_markup' => null,
+ ];
+
+ return $this;
+ }
+
+ private function msgFormat_markdown()
+ {
+ $this->sMsgFormat = [
+ 'chat_id' => $this->iChatId,
+ 'text' => $this->sMsg,
+ 'parse_mode' => 'Markdown',
+ 'disable_web_page_preview' => false,
+ 'reply_to_message_id' => null,
+ 'reply_markup' => null,
+ ];
+
+ return $this;
+ }
+
+ private function msgFormat_markdownV2()
+ {
+ $this->sMsgFormat = [
+ 'chat_id' => $this->iChatId,
+ 'text' => $this->sMsg,
+ 'parse_mode' => 'MarkdownV2',
+ 'disable_web_page_preview' => false,
+ 'reply_to_message_id' => null,
+ 'reply_markup' => null,
+ ];
+
+ return $this;
+ }
+}
diff --git a/app/Services/TomTool/ThrowableHandler.php b/app/Services/TomTool/ThrowableHandler.php
new file mode 100755
index 00000000..03fc2f5d
--- /dev/null
+++ b/app/Services/TomTool/ThrowableHandler.php
@@ -0,0 +1,130 @@
+toArr();
+
+ action:
+ fetch() or get()
+
+ set:
+ enableTg()
+ enableTrace()
+ setMaxDepth()
+
+ */
+
+class ThrowableHandler
+{
+ protected bool $tgEnable = false;
+ protected bool $showTrace = false;
+ protected int $maxDepth = 3;
+ protected ThrowableBase $e;
+
+ public static function make(ThrowableBase $e): self
+ {
+ $oInstance = new self();
+ $oInstance->e = $e;
+ return $oInstance;
+ }
+
+ public function fetch()
+ {
+ return $this->get();
+ }
+
+ public function get(): array
+ {
+ $data = $this->buildExceptionData($this->e, 0);
+
+ if ($this->tgEnable) {
+ $this->sendTelegram($data);
+ }
+
+ return $data;
+ }
+
+ public function toArr(): array
+ {
+ return $this->get();
+ }
+
+ public function toJson(): string
+ {
+ return json_encode($this->get(), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+ }
+
+ public function enableTg(bool $enable = true): self
+ {
+ $this->tgEnable = $enable;
+ return $this;
+ }
+
+ public function enableTrace(bool $enable = true): self
+ {
+ $this->showTrace = $enable;
+ return $this;
+ }
+
+ public function setMaxDepth(int $depth): self
+ {
+ $this->maxDepth = max(1, $depth);
+ return $this;
+ }
+
+ protected function buildExceptionData(ThrowableBase $e, int $depth): array
+ {
+ $data = [
+ 'message' => $e->getMessage(),
+ 'file' => $e->getFile(),
+ 'line' => $e->getLine(),
+ ];
+
+ $code = $e->getCode();
+ if ($code !== null && $code !== 0) {
+ $data['code'] = $code;
+ }
+
+ if ($this->showTrace) {
+ $filteredTrace = array_filter($e->getTrace(), function ($frame) {
+ return empty($frame['file']) || !str_contains($frame['file'], '/vendor/');
+ });
+
+ $traceLines = [];
+ foreach ($filteredTrace as $frame) {
+ $file = $frame['file'] ?? '[internal]';
+ $line = $frame['line'] ?? '';
+ $func = isset($frame['class'], $frame['function'])
+ ? "{$frame['class']}{$frame['type']}{$frame['function']}"
+ : ($frame['function'] ?? '[unknown]');
+ $traceLines[] = "{$file}:{$line} {$func}()";
+ }
+
+ $data['trace'] = implode("\n", $traceLines);
+ }
+
+ if ($depth < $this->maxDepth && $e->getPrevious() instanceof ThrowableBase) {
+ $data['previous'] = $this->buildExceptionData($e->getPrevious(), $depth + 1);
+ }
+
+ return $data;
+ }
+
+ protected function sendTelegram(array $data): void
+ {
+ TelegramVdb::make()->aData($data)->save();
+ }
+}
+
diff --git a/app/Services/TomTool/Tom.php b/app/Services/TomTool/Tom.php
new file mode 100755
index 00000000..807e6cc7
--- /dev/null
+++ b/app/Services/TomTool/Tom.php
@@ -0,0 +1,21 @@
+", $sData);
+
+ return $sData;
+ }
+}
diff --git a/artisan b/artisan
new file mode 100755
index 00000000..c35e31d6
--- /dev/null
+++ b/artisan
@@ -0,0 +1,18 @@
+#!/usr/bin/env php
+handleCommand(new ArgvInput);
+
+exit($status);
diff --git a/bootstrap/app.php b/bootstrap/app.php
new file mode 100755
index 00000000..434c33df
--- /dev/null
+++ b/bootstrap/app.php
@@ -0,0 +1,25 @@
+withRouting(
+ web: __DIR__.'/../routes/web.php',
+ commands: __DIR__.'/../routes/console.php',
+ health: '/up',
+ )
+ ->withMiddleware(function (Middleware $middleware) {
+ $middleware->prepend(\Spatie\ResponseCache\Middlewares\CacheResponse::class);
+ $middleware->alias([
+ 'doCache' => \Spatie\ResponseCache\Middlewares\CacheResponse::class,
+ ]);
+
+ $middleware->validateCsrfTokens(except: [
+ 'api/*',
+ ]);
+ })
+ ->withExceptions(function (Exceptions $exceptions) {
+ //
+ })->create();
diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore
new file mode 100755
index 00000000..d6b7ef32
--- /dev/null
+++ b/bootstrap/cache/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/bootstrap/providers.php b/bootstrap/providers.php
new file mode 100755
index 00000000..f2631ed4
--- /dev/null
+++ b/bootstrap/providers.php
@@ -0,0 +1,7 @@
+=5.0.0"
+ },
+ "require-dev": {
+ "doctrine/dbal": "^4.0.0",
+ "nesbot/carbon": "^2.71.0 || ^3.0.0",
+ "phpunit/phpunit": "^10.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Carbon\\Doctrine\\": "src/Carbon/Doctrine/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "KyleKatarn",
+ "email": "kylekatarnls@gmail.com"
+ }
+ ],
+ "description": "Types to use Carbon in Doctrine",
+ "keywords": [
+ "carbon",
+ "date",
+ "datetime",
+ "doctrine",
+ "time"
+ ],
+ "support": {
+ "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues",
+ "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/kylekatarnls",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/Carbon",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-02-09T16:56:22+00:00"
+ },
+ {
+ "name": "dflydev/dot-access-data",
+ "version": "v3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dflydev/dflydev-dot-access-data.git",
+ "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f",
+ "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f",
+ "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.3"
+ },
+ "time": "2024-07-08T12:26:09+00:00"
+ },
+ {
+ "name": "doctrine/inflector",
+ "version": "2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/inflector.git",
+ "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b",
+ "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12.0 || ^13.0",
+ "phpstan/phpstan": "^1.12 || ^2.0",
+ "phpstan/phpstan-phpunit": "^1.4 || ^2.0",
+ "phpstan/phpstan-strict-rules": "^1.6 || ^2.0",
+ "phpunit/phpunit": "^8.5 || ^12.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Inflector\\": "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": "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.1.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%2Finflector",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-10T19:31:58+00:00"
+ },
+ {
+ "name": "doctrine/lexer",
+ "version": "3.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/lexer.git",
+ "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
+ "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^10.5",
+ "psalm/plugin-phpunit": "^0.18.3",
+ "vimeo/psalm": "^5.21"
+ },
+ "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.1"
+ },
+ "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": "2024-02-05T11:56:58+00:00"
+ },
+ {
+ "name": "dragonmantank/cron-expression",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dragonmantank/cron-expression.git",
+ "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/d61a8a9604ec1f8c3d150d09db6ce98b32675013",
+ "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.2|^8.3|^8.4|^8.5"
+ },
+ "replace": {
+ "mtdowling/cron-expression": "^1.0"
+ },
+ "require-dev": {
+ "phpstan/extension-installer": "^1.4.3",
+ "phpstan/phpstan": "^1.12.32|^2.1.31",
+ "phpunit/phpunit": "^8.5.48|^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "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.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/dragonmantank",
+ "type": "github"
+ }
+ ],
+ "time": "2025-10-31T18:51:33+00:00"
+ },
+ {
+ "name": "egulias/email-validator",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/egulias/EmailValidator.git",
+ "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa",
+ "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/lexer": "^2.0 || ^3.0",
+ "php": ">=8.1",
+ "symfony/polyfill-intl-idn": "^1.26"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.2",
+ "vimeo/psalm": "^5.12"
+ },
+ "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.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/egulias",
+ "type": "github"
+ }
+ ],
+ "time": "2025-03-06T22:45:56+00:00"
+ },
+ {
+ "name": "fruitcake/php-cors",
+ "version": "v1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruitcake/php-cors.git",
+ "reference": "38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379",
+ "reference": "38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1",
+ "symfony/http-foundation": "^5.4|^6.4|^7.3|^8"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^2",
+ "phpunit/phpunit": "^9",
+ "squizlabs/php_codesniffer": "^4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-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.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://fruitcake.nl",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/barryvdh",
+ "type": "github"
+ }
+ ],
+ "time": "2025-12-03T09:33:47+00:00"
+ },
+ {
+ "name": "graham-campbell/result-type",
+ "version": "v1.1.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/GrahamCampbell/Result-Type.git",
+ "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/e01f4a821471308ba86aa202fed6698b6b695e3b",
+ "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0",
+ "phpoption/phpoption": "^1.9.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5.41 || ^9.6.22 || ^10.5.45 || ^11.5.7"
+ },
+ "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.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-12-27T19:43:20+00:00"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "7.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4",
+ "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "guzzlehttp/promises": "^2.3",
+ "guzzlehttp/psr7": "^2.8",
+ "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.2",
+ "ext-curl": "*",
+ "guzzle/client-integration-tests": "3.0.2",
+ "php-http/message-factory": "^1.1",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20",
+ "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
+ }
+ },
+ "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.10.0"
+ },
+ "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": "2025-08-23T22:36:01+00:00"
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "481557b130ef3790cf82b713667b43030dc9c957"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957",
+ "reference": "481557b130ef3790cf82b713667b43030dc9c957",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "phpunit/phpunit": "^8.5.44 || ^9.6.25"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "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/2.3.0"
+ },
+ "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": "2025-08-22T14:34:08+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "2.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "21dc724a0583619cd1652f673303492272778051"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051",
+ "reference": "21dc724a0583619cd1652f673303492272778051",
+ "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.2",
+ "http-interop/http-factory-tests": "0.9.0",
+ "phpunit/phpunit": "^8.5.44 || ^9.6.25"
+ },
+ "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.8.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": "2025-08-23T21:21:41+00:00"
+ },
+ {
+ "name": "guzzlehttp/uri-template",
+ "version": "v1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/uri-template.git",
+ "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/uri-template/zipball/4f4bbd4e7172148801e76e3decc1e559bdee34e1",
+ "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0",
+ "symfony/polyfill-php80": "^1.24"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "phpunit/phpunit": "^8.5.44 || ^9.6.25",
+ "uri-template/tests": "1.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "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.5"
+ },
+ "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": "2025-08-22T14:27:06+00:00"
+ },
+ {
+ "name": "http-interop/http-factory-guzzle",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/http-interop/http-factory-guzzle.git",
+ "reference": "c2c859ceb05c3f42e710b60555f4c35b6a4a3995"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/c2c859ceb05c3f42e710b60555f4c35b6a4a3995",
+ "reference": "c2c859ceb05c3f42e710b60555f4c35b6a4a3995",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/psr7": "^1.7||^2.0",
+ "php": ">=7.3",
+ "psr/http-factory": "^1.0"
+ },
+ "provide": {
+ "psr/http-factory-implementation": "^1.0"
+ },
+ "require-dev": {
+ "http-interop/http-factory-tests": "^0.9",
+ "phpunit/phpunit": "^9.5"
+ },
+ "suggest": {
+ "guzzlehttp/psr7": "Includes an HTTP factory starting in version 2.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Factory\\Guzzle\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "An HTTP Factory using Guzzle PSR7",
+ "keywords": [
+ "factory",
+ "http",
+ "psr-17",
+ "psr-7"
+ ],
+ "support": {
+ "issues": "https://github.com/http-interop/http-factory-guzzle/issues",
+ "source": "https://github.com/http-interop/http-factory-guzzle/tree/1.2.1"
+ },
+ "time": "2025-12-15T11:28:16+00:00"
+ },
+ {
+ "name": "laravel/framework",
+ "version": "v12.47.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/framework.git",
+ "reference": "ab8114c2e78f32e64eb238fc4b495bea3f8b80ec"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/framework/zipball/ab8114c2e78f32e64eb238fc4b495bea3f8b80ec",
+ "reference": "ab8114c2e78f32e64eb238fc4b495bea3f8b80ec",
+ "shasum": ""
+ },
+ "require": {
+ "brick/math": "^0.11|^0.12|^0.13|^0.14",
+ "composer-runtime-api": "^2.2",
+ "doctrine/inflector": "^2.0.5",
+ "dragonmantank/cron-expression": "^3.4",
+ "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.3",
+ "guzzlehttp/guzzle": "^7.8.2",
+ "guzzlehttp/uri-template": "^1.0",
+ "laravel/prompts": "^0.3.0",
+ "laravel/serializable-closure": "^1.3|^2.0",
+ "league/commonmark": "^2.7",
+ "league/flysystem": "^3.25.1",
+ "league/flysystem-local": "^3.25.1",
+ "league/uri": "^7.5.1",
+ "monolog/monolog": "^3.0",
+ "nesbot/carbon": "^3.8.4",
+ "nunomaduro/termwind": "^2.0",
+ "php": "^8.2",
+ "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": "^7.2.0",
+ "symfony/error-handler": "^7.2.0",
+ "symfony/finder": "^7.2.0",
+ "symfony/http-foundation": "^7.2.0",
+ "symfony/http-kernel": "^7.2.0",
+ "symfony/mailer": "^7.2.0",
+ "symfony/mime": "^7.2.0",
+ "symfony/polyfill-php83": "^1.33",
+ "symfony/polyfill-php84": "^1.33",
+ "symfony/polyfill-php85": "^1.33",
+ "symfony/process": "^7.2.0",
+ "symfony/routing": "^7.2.0",
+ "symfony/uid": "^7.2.0",
+ "symfony/var-dumper": "^7.2.0",
+ "tijsverkoyen/css-to-inline-styles": "^2.2.5",
+ "vlucas/phpdotenv": "^5.6.1",
+ "voku/portable-ascii": "^2.0.2"
+ },
+ "conflict": {
+ "tightenco/collect": "<5.5.33"
+ },
+ "provide": {
+ "psr/container-implementation": "1.1|2.0",
+ "psr/log-implementation": "1.0|2.0|3.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/concurrency": "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/json-schema": "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/reflection": "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",
+ "spatie/once": "*"
+ },
+ "require-dev": {
+ "ably/ably-php": "^1.0",
+ "aws/aws-sdk-php": "^3.322.9",
+ "ext-gmp": "*",
+ "fakerphp/faker": "^1.24",
+ "guzzlehttp/promises": "^2.0.3",
+ "guzzlehttp/psr7": "^2.4",
+ "laravel/pint": "^1.18",
+ "league/flysystem-aws-s3-v3": "^3.25.1",
+ "league/flysystem-ftp": "^3.25.1",
+ "league/flysystem-path-prefixing": "^3.25.1",
+ "league/flysystem-read-only": "^3.25.1",
+ "league/flysystem-sftp-v3": "^3.25.1",
+ "mockery/mockery": "^1.6.10",
+ "opis/json-schema": "^2.4.1",
+ "orchestra/testbench-core": "^10.8.1",
+ "pda/pheanstalk": "^5.0.6|^7.0.0",
+ "php-http/discovery": "^1.15",
+ "phpstan/phpstan": "^2.0",
+ "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1",
+ "predis/predis": "^2.3|^3.0",
+ "resend/resend-php": "^0.10.0|^1.0",
+ "symfony/cache": "^7.2.0",
+ "symfony/http-client": "^7.2.0",
+ "symfony/psr-http-message-bridge": "^7.2.0",
+ "symfony/translation": "^7.2.0"
+ },
+ "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.322.9).",
+ "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).",
+ "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|^6.0).",
+ "fakerphp/faker": "Required to generate fake data using the fake() helper (^1.23).",
+ "filp/whoops": "Required for friendly error pages in development (^2.14.3).",
+ "laravel/tinker": "Required to use the tinker console command (^2.0).",
+ "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).",
+ "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).",
+ "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.25.1).",
+ "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)",
+ "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).",
+ "mockery/mockery": "Required to use mocking (^1.6).",
+ "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).",
+ "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).",
+ "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).",
+ "predis/predis": "Required to use the predis connector (^2.3|^3.0).",
+ "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).",
+ "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0|^1.0).",
+ "symfony/cache": "Required to PSR-6 cache bridge (^7.2).",
+ "symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).",
+ "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.2).",
+ "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.2).",
+ "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.2).",
+ "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.2)."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "12.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Illuminate/Collections/functions.php",
+ "src/Illuminate/Collections/helpers.php",
+ "src/Illuminate/Events/functions.php",
+ "src/Illuminate/Filesystem/functions.php",
+ "src/Illuminate/Foundation/helpers.php",
+ "src/Illuminate/Log/functions.php",
+ "src/Illuminate/Reflection/helpers.php",
+ "src/Illuminate/Support/functions.php",
+ "src/Illuminate/Support/helpers.php"
+ ],
+ "psr-4": {
+ "Illuminate\\": "src/Illuminate/",
+ "Illuminate\\Support\\": [
+ "src/Illuminate/Macroable/",
+ "src/Illuminate/Collections/",
+ "src/Illuminate/Conditionable/",
+ "src/Illuminate/Reflection/"
+ ]
+ }
+ },
+ "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": "2026-01-13T15:29:06+00:00"
+ },
+ {
+ "name": "laravel/prompts",
+ "version": "v0.3.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/prompts.git",
+ "reference": "5c41bf0555b7cfefaad4e66d3046675829581ac4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/prompts/zipball/5c41bf0555b7cfefaad4e66d3046675829581ac4",
+ "reference": "5c41bf0555b7cfefaad4e66d3046675829581ac4",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": "^2.2",
+ "ext-mbstring": "*",
+ "php": "^8.1",
+ "symfony/console": "^6.2|^7.0"
+ },
+ "conflict": {
+ "illuminate/console": ">=10.17.0 <10.25.0",
+ "laravel/framework": ">=10.17.0 <10.25.0"
+ },
+ "require-dev": {
+ "illuminate/collections": "^10.0|^11.0|^12.0",
+ "mockery/mockery": "^1.5",
+ "pestphp/pest": "^2.3|^3.4|^4.0",
+ "phpstan/phpstan": "^1.12.28",
+ "phpstan/phpstan-mockery": "^1.1.3"
+ },
+ "suggest": {
+ "ext-pcntl": "Required for the spinner to be animated."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "0.3.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/helpers.php"
+ ],
+ "psr-4": {
+ "Laravel\\Prompts\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Add beautiful and user-friendly forms to your command-line applications.",
+ "support": {
+ "issues": "https://github.com/laravel/prompts/issues",
+ "source": "https://github.com/laravel/prompts/tree/v0.3.9"
+ },
+ "time": "2026-01-07T21:00:29+00:00"
+ },
+ {
+ "name": "laravel/scout",
+ "version": "v10.23.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/scout.git",
+ "reference": "ef12fcef311421fe9f2e2425416daa17c45b8ae1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/scout/zipball/ef12fcef311421fe9f2e2425416daa17c45b8ae1",
+ "reference": "ef12fcef311421fe9f2e2425416daa17c45b8ae1",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/bus": "^9.0|^10.0|^11.0|^12.0",
+ "illuminate/contracts": "^9.0|^10.0|^11.0|^12.0",
+ "illuminate/database": "^9.0|^10.0|^11.0|^12.0",
+ "illuminate/http": "^9.0|^10.0|^11.0|^12.0",
+ "illuminate/pagination": "^9.0|^10.0|^11.0|^12.0",
+ "illuminate/queue": "^9.0|^10.0|^11.0|^12.0",
+ "illuminate/support": "^9.0|^10.0|^11.0|^12.0",
+ "php": "^8.0",
+ "symfony/console": "^6.0|^7.0"
+ },
+ "conflict": {
+ "algolia/algoliasearch-client-php": "<3.2.0|>=5.0.0"
+ },
+ "require-dev": {
+ "algolia/algoliasearch-client-php": "^3.2|^4.0",
+ "meilisearch/meilisearch-php": "^1.0",
+ "mockery/mockery": "^1.0",
+ "orchestra/testbench": "^7.31|^8.36|^9.15|^10.8",
+ "php-http/guzzle7-adapter": "^1.0",
+ "phpstan/phpstan": "^1.10",
+ "typesense/typesense-php": "^4.9.3"
+ },
+ "suggest": {
+ "algolia/algoliasearch-client-php": "Required to use the Algolia engine (^3.2).",
+ "meilisearch/meilisearch-php": "Required to use the Meilisearch engine (^1.0).",
+ "typesense/typesense-php": "Required to use the Typesense engine (^4.9)."
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Laravel\\Scout\\ScoutServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-master": "10.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laravel\\Scout\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "Laravel Scout provides a driver based solution to searching your Eloquent models.",
+ "keywords": [
+ "algolia",
+ "laravel",
+ "search"
+ ],
+ "support": {
+ "issues": "https://github.com/laravel/scout/issues",
+ "source": "https://github.com/laravel/scout"
+ },
+ "time": "2026-01-28T03:55:17+00:00"
+ },
+ {
+ "name": "laravel/serializable-closure",
+ "version": "v2.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/serializable-closure.git",
+ "reference": "7581a4407012f5f53365e11bafc520fd7f36bc9b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/7581a4407012f5f53365e11bafc520fd7f36bc9b",
+ "reference": "7581a4407012f5f53365e11bafc520fd7f36bc9b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "illuminate/support": "^10.0|^11.0|^12.0",
+ "nesbot/carbon": "^2.67|^3.0",
+ "pestphp/pest": "^2.36|^3.0|^4.0",
+ "phpstan/phpstan": "^2.0",
+ "symfony/var-dumper": "^6.2.0|^7.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.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": "2026-01-08T16:22:46+00:00"
+ },
+ {
+ "name": "laravel/tinker",
+ "version": "v2.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/tinker.git",
+ "reference": "3d34b97c9a1747a81a3fde90482c092bd8b66468"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/tinker/zipball/3d34b97c9a1747a81a3fde90482c092bd8b66468",
+ "reference": "3d34b97c9a1747a81a3fde90482c092bd8b66468",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0",
+ "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0",
+ "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0",
+ "php": "^7.2.5|^8.0",
+ "psy/psysh": "^0.11.1|^0.12.0",
+ "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0|^8.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "~1.3.3|^1.4.2",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^8.5.8|^9.3.3|^10.0"
+ },
+ "suggest": {
+ "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)."
+ },
+ "type": "library",
+ "extra": {
+ "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.11.0"
+ },
+ "time": "2025-12-19T19:16:45+00:00"
+ },
+ {
+ "name": "league/commonmark",
+ "version": "2.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/commonmark.git",
+ "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/4efa10c1e56488e658d10adf7b7b7dcd19940bfb",
+ "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb",
+ "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.31.1",
+ "commonmark/commonmark.js": "0.31.1",
+ "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 || ^10.5.9 || ^11.0.0",
+ "scrutinizer/ocular": "^1.8.1",
+ "symfony/finder": "^5.3 | ^6.0 | ^7.0",
+ "symfony/process": "^5.4 | ^6.0 | ^7.0",
+ "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0",
+ "unleashedtech/php-coding-standard": "^3.1.1",
+ "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0"
+ },
+ "suggest": {
+ "symfony/yaml": "v2.3+ required if using the Front Matter extension"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.9-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": "2025-11-26T21:48:24+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.30.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/flysystem.git",
+ "reference": "5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277",
+ "reference": "5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277",
+ "shasum": ""
+ },
+ "require": {
+ "league/flysystem-local": "^3.0.0",
+ "league/mime-type-detection": "^1.0.0",
+ "php": "^8.0.2"
+ },
+ "conflict": {
+ "async-aws/core": "<1.19.0",
+ "async-aws/s3": "<1.14.0",
+ "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 || ^2.0",
+ "async-aws/simple-s3": "^1.1 || ^2.0",
+ "aws/aws-sdk-php": "^3.295.10",
+ "composer/semver": "^3.0",
+ "ext-fileinfo": "*",
+ "ext-ftp": "*",
+ "ext-mongodb": "^1.3|^2",
+ "ext-zip": "*",
+ "friendsofphp/php-cs-fixer": "^3.5",
+ "google/cloud-storage": "^1.23",
+ "guzzlehttp/psr7": "^2.6",
+ "microsoft/azure-storage-blob": "^1.1",
+ "mongodb/mongodb": "^1.2|^2",
+ "phpseclib/phpseclib": "^3.0.36",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^9.5.11|^10.0",
+ "sabre/dav": "^4.6.0"
+ },
+ "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.30.2"
+ },
+ "time": "2025-11-10T17:13:11+00:00"
+ },
+ {
+ "name": "league/flysystem-local",
+ "version": "3.30.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/flysystem-local.git",
+ "reference": "ab4f9d0d672f601b102936aa728801dd1a11968d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/ab4f9d0d672f601b102936aa728801dd1a11968d",
+ "reference": "ab4f9d0d672f601b102936aa728801dd1a11968d",
+ "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": {
+ "source": "https://github.com/thephpleague/flysystem-local/tree/3.30.2"
+ },
+ "time": "2025-11-10T11:23:37+00:00"
+ },
+ {
+ "name": "league/mime-type-detection",
+ "version": "1.16.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/mime-type-detection.git",
+ "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9",
+ "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9",
+ "shasum": ""
+ },
+ "require": {
+ "ext-fileinfo": "*",
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^3.2",
+ "phpstan/phpstan": "^0.12.68",
+ "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0"
+ },
+ "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.16.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/frankdejonge",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/league/flysystem",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-21T08:32:55+00:00"
+ },
+ {
+ "name": "league/uri",
+ "version": "7.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/uri.git",
+ "reference": "8d587cddee53490f9b82bf203d3a9aa7ea4f9807"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/uri/zipball/8d587cddee53490f9b82bf203d3a9aa7ea4f9807",
+ "reference": "8d587cddee53490f9b82bf203d3a9aa7ea4f9807",
+ "shasum": ""
+ },
+ "require": {
+ "league/uri-interfaces": "^7.7",
+ "php": "^8.1",
+ "psr/http-factory": "^1"
+ },
+ "conflict": {
+ "league/uri-schemes": "^1.0"
+ },
+ "suggest": {
+ "ext-bcmath": "to improve IPV4 host parsing",
+ "ext-dom": "to convert the URI into an HTML anchor tag",
+ "ext-fileinfo": "to create Data URI from file contennts",
+ "ext-gmp": "to improve IPV4 host parsing",
+ "ext-intl": "to handle IDN host with the best performance",
+ "ext-uri": "to use the PHP native URI class",
+ "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain",
+ "league/uri-components": "Needed to easily manipulate URI objects components",
+ "league/uri-polyfill": "Needed to backport the PHP URI extension for older versions of PHP",
+ "php-64bit": "to improve IPV4 host parsing",
+ "rowbot/url": "to handle WHATWG URL",
+ "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "7.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Uri\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ignace Nyamagana Butera",
+ "email": "nyamsprod@gmail.com",
+ "homepage": "https://nyamsprod.com"
+ }
+ ],
+ "description": "URI manipulation library",
+ "homepage": "https://uri.thephpleague.com",
+ "keywords": [
+ "URN",
+ "data-uri",
+ "file-uri",
+ "ftp",
+ "hostname",
+ "http",
+ "https",
+ "middleware",
+ "parse_str",
+ "parse_url",
+ "psr-7",
+ "query-string",
+ "querystring",
+ "rfc2141",
+ "rfc3986",
+ "rfc3987",
+ "rfc6570",
+ "rfc8141",
+ "uri",
+ "uri-template",
+ "url",
+ "ws"
+ ],
+ "support": {
+ "docs": "https://uri.thephpleague.com",
+ "forum": "https://thephpleague.slack.com",
+ "issues": "https://github.com/thephpleague/uri-src/issues",
+ "source": "https://github.com/thephpleague/uri/tree/7.7.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/nyamsprod",
+ "type": "github"
+ }
+ ],
+ "time": "2025-12-07T16:02:06+00:00"
+ },
+ {
+ "name": "league/uri-interfaces",
+ "version": "7.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/uri-interfaces.git",
+ "reference": "62ccc1a0435e1c54e10ee6022df28d6c04c2946c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/62ccc1a0435e1c54e10ee6022df28d6c04c2946c",
+ "reference": "62ccc1a0435e1c54e10ee6022df28d6c04c2946c",
+ "shasum": ""
+ },
+ "require": {
+ "ext-filter": "*",
+ "php": "^8.1",
+ "psr/http-message": "^1.1 || ^2.0"
+ },
+ "suggest": {
+ "ext-bcmath": "to improve IPV4 host parsing",
+ "ext-gmp": "to improve IPV4 host parsing",
+ "ext-intl": "to handle IDN host with the best performance",
+ "php-64bit": "to improve IPV4 host parsing",
+ "rowbot/url": "to handle WHATWG URL",
+ "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "7.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Uri\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ignace Nyamagana Butera",
+ "email": "nyamsprod@gmail.com",
+ "homepage": "https://nyamsprod.com"
+ }
+ ],
+ "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI",
+ "homepage": "https://uri.thephpleague.com",
+ "keywords": [
+ "data-uri",
+ "file-uri",
+ "ftp",
+ "hostname",
+ "http",
+ "https",
+ "parse_str",
+ "parse_url",
+ "psr-7",
+ "query-string",
+ "querystring",
+ "rfc3986",
+ "rfc3987",
+ "rfc6570",
+ "uri",
+ "url",
+ "ws"
+ ],
+ "support": {
+ "docs": "https://uri.thephpleague.com",
+ "forum": "https://thephpleague.slack.com",
+ "issues": "https://github.com/thephpleague/uri-src/issues",
+ "source": "https://github.com/thephpleague/uri-interfaces/tree/7.7.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/nyamsprod",
+ "type": "github"
+ }
+ ],
+ "time": "2025-12-07T16:03:21+00:00"
+ },
+ {
+ "name": "meilisearch/meilisearch-php",
+ "version": "v1.16.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/meilisearch/meilisearch-php.git",
+ "reference": "f9f63e0e7d12ffaae54f7317fa8f4f4dfa8ae7b6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/meilisearch/meilisearch-php/zipball/f9f63e0e7d12ffaae54f7317fa8f4f4dfa8ae7b6",
+ "reference": "f9f63e0e7d12ffaae54f7317fa8f4f4dfa8ae7b6",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "^7.4 || ^8.0",
+ "php-http/discovery": "^1.7",
+ "psr/http-client": "^1.0",
+ "symfony/polyfill-php81": "^1.33"
+ },
+ "require-dev": {
+ "http-interop/http-factory-guzzle": "^1.2.0",
+ "php-cs-fixer/shim": "^3.59.3",
+ "phpstan/phpstan": "^2.0",
+ "phpstan/phpstan-deprecation-rules": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpunit/phpunit": "^9.5 || ^10.5",
+ "symfony/http-client": "^5.4|^6.0|^7.0"
+ },
+ "suggest": {
+ "guzzlehttp/guzzle": "Use Guzzle ^7 as HTTP client",
+ "http-interop/http-factory-guzzle": "Factory for guzzlehttp/guzzle",
+ "symfony/http-client": "Use Symfony Http client"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "MeiliSearch\\": "src/",
+ "Meilisearch\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Clémentine Urquizar",
+ "email": "clementine@meilisearch.com"
+ },
+ {
+ "name": "Bruno Casali",
+ "email": "bruno@meilisearch.com"
+ },
+ {
+ "name": "Laurent Cazanove",
+ "email": "lau.cazanove@gmail.com"
+ },
+ {
+ "name": "Tomas Norkūnas",
+ "email": "norkunas.tom@gmail.com"
+ }
+ ],
+ "description": "PHP wrapper for the Meilisearch API",
+ "keywords": [
+ "api",
+ "client",
+ "instant",
+ "meilisearch",
+ "php",
+ "search"
+ ],
+ "support": {
+ "issues": "https://github.com/meilisearch/meilisearch-php/issues",
+ "source": "https://github.com/meilisearch/meilisearch-php/tree/v1.16.1"
+ },
+ "time": "2025-09-18T10:15:45+00:00"
+ },
+ {
+ "name": "monolog/monolog",
+ "version": "3.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/monolog.git",
+ "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/b321dd6749f0bf7189444158a3ce785cc16d69b0",
+ "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0",
+ "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.0",
+ "guzzlehttp/guzzle": "^7.4.5",
+ "guzzlehttp/psr7": "^2.2",
+ "mongodb/mongodb": "^1.8 || ^2.0",
+ "php-amqplib/php-amqplib": "~2.4 || ^3",
+ "php-console/php-console": "^3.1.8",
+ "phpstan/phpstan": "^2",
+ "phpstan/phpstan-deprecation-rules": "^2",
+ "phpstan/phpstan-strict-rules": "^2",
+ "phpunit/phpunit": "^10.5.17 || ^11.0.7",
+ "predis/predis": "^1.1 || ^2",
+ "rollbar/rollbar": "^4.0",
+ "ruflin/elastica": "^7 || ^8",
+ "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.10.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Seldaek",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-01-02T08:56:05+00:00"
+ },
+ {
+ "name": "nesbot/carbon",
+ "version": "3.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/CarbonPHP/carbon.git",
+ "reference": "bdb375400dcd162624531666db4799b36b64e4a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/bdb375400dcd162624531666db4799b36b64e4a1",
+ "reference": "bdb375400dcd162624531666db4799b36b64e4a1",
+ "shasum": ""
+ },
+ "require": {
+ "carbonphp/carbon-doctrine-types": "<100.0",
+ "ext-json": "*",
+ "php": "^8.1",
+ "psr/clock": "^1.0",
+ "symfony/clock": "^6.3.12 || ^7.0 || ^8.0",
+ "symfony/polyfill-mbstring": "^1.0",
+ "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0"
+ },
+ "provide": {
+ "psr/clock-implementation": "1.0"
+ },
+ "require-dev": {
+ "doctrine/dbal": "^3.6.3 || ^4.0",
+ "doctrine/orm": "^2.15.2 || ^3.0",
+ "friendsofphp/php-cs-fixer": "^v3.87.1",
+ "kylekatarnls/multi-tester": "^2.5.3",
+ "phpmd/phpmd": "^2.15.0",
+ "phpstan/extension-installer": "^1.4.3",
+ "phpstan/phpstan": "^2.1.22",
+ "phpunit/phpunit": "^10.5.53",
+ "squizlabs/php_codesniffer": "^3.13.4"
+ },
+ "bin": [
+ "bin/carbon"
+ ],
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Carbon\\Laravel\\ServiceProvider"
+ ]
+ },
+ "phpstan": {
+ "includes": [
+ "extension.neon"
+ ]
+ },
+ "branch-alias": {
+ "dev-2.x": "2.x-dev",
+ "dev-master": "3.x-dev"
+ }
+ },
+ "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/CarbonPHP/carbon/issues",
+ "source": "https://github.com/CarbonPHP/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": "2025-12-02T21:04:28+00:00"
+ },
+ {
+ "name": "nette/schema",
+ "version": "v1.3.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/schema.git",
+ "reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/schema/zipball/2befc2f42d7c715fd9d95efc31b1081e5d765004",
+ "reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004",
+ "shasum": ""
+ },
+ "require": {
+ "nette/utils": "^4.0",
+ "php": "8.1 - 8.5"
+ },
+ "require-dev": {
+ "nette/tester": "^2.5.2",
+ "phpstan/phpstan-nette": "^2.0@stable",
+ "tracy/tracy": "^2.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Nette\\": "src"
+ },
+ "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.3.3"
+ },
+ "time": "2025-10-30T22:57:59+00:00"
+ },
+ {
+ "name": "nette/utils",
+ "version": "v4.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/utils.git",
+ "reference": "c99059c0315591f1a0db7ad6002000288ab8dc72"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/utils/zipball/c99059c0315591f1a0db7ad6002000288ab8dc72",
+ "reference": "c99059c0315591f1a0db7ad6002000288ab8dc72",
+ "shasum": ""
+ },
+ "require": {
+ "php": "8.2 - 8.5"
+ },
+ "conflict": {
+ "nette/finder": "<3",
+ "nette/schema": "<1.2.2"
+ },
+ "require-dev": {
+ "jetbrains/phpstorm-attributes": "^1.2",
+ "nette/tester": "^2.5",
+ "phpstan/phpstan-nette": "^2.0@stable",
+ "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()"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Nette\\": "src"
+ },
+ "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.1.1"
+ },
+ "time": "2025-12-22T12:14:32+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v5.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82",
+ "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": ">=7.4"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-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/v5.7.0"
+ },
+ "time": "2025-12-06T11:56:16+00:00"
+ },
+ {
+ "name": "nunomaduro/termwind",
+ "version": "v2.3.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nunomaduro/termwind.git",
+ "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/6fb2a640ff502caace8e05fd7be3b503a7e1c017",
+ "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": "^8.2",
+ "symfony/console": "^7.3.6"
+ },
+ "require-dev": {
+ "illuminate/console": "^11.46.1",
+ "laravel/pint": "^1.25.1",
+ "mockery/mockery": "^1.6.12",
+ "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.1.3",
+ "phpstan/phpstan": "^1.12.32",
+ "phpstan/phpstan-strict-rules": "^1.6.2",
+ "symfony/var-dumper": "^7.3.5",
+ "thecodingmachine/phpstan-strict-rules": "^1.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Termwind\\Laravel\\TermwindServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-2.x": "2.x-dev"
+ }
+ },
+ "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/v2.3.3"
+ },
+ "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": "2025-11-20T02:34:59+00:00"
+ },
+ {
+ "name": "overtrue/pinyin",
+ "version": "5.3.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/overtrue/pinyin.git",
+ "reference": "03d8697763c32595f54c855911bc77abf00fea14"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/overtrue/pinyin/zipball/03d8697763c32595f54c855911bc77abf00fea14",
+ "reference": "03d8697763c32595f54c855911bc77abf00fea14",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.2"
+ },
+ "require-dev": {
+ "brainmaestro/composer-git-hooks": "^3.0",
+ "friendsofphp/php-cs-fixer": "^3.2",
+ "laravel/pint": "^1.10",
+ "nunomaduro/termwind": "^1.0|^2.0",
+ "phpunit/phpunit": "^10.0|^11.2"
+ },
+ "bin": [
+ "bin/pinyin"
+ ],
+ "type": "library",
+ "extra": {
+ "hooks": {
+ "pre-push": [
+ "composer pint",
+ "composer test"
+ ],
+ "pre-commit": [
+ "composer pint",
+ "composer test"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Overtrue\\Pinyin\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "overtrue",
+ "email": "anzhengchao@gmail.com",
+ "homepage": "http://github.com/overtrue"
+ }
+ ],
+ "description": "Chinese to pinyin translator.",
+ "homepage": "https://github.com/overtrue/pinyin",
+ "keywords": [
+ "Chinese",
+ "Pinyin",
+ "cn2pinyin"
+ ],
+ "support": {
+ "issues": "https://github.com/overtrue/pinyin/issues",
+ "source": "https://github.com/overtrue/pinyin/tree/5.3.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/overtrue",
+ "type": "github"
+ }
+ ],
+ "time": "2025-03-16T02:16:27+00:00"
+ },
+ {
+ "name": "php-http/discovery",
+ "version": "1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/discovery.git",
+ "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d",
+ "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0|^2.0",
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "nyholm/psr7": "<1.0",
+ "zendframework/zend-diactoros": "*"
+ },
+ "provide": {
+ "php-http/async-client-implementation": "*",
+ "php-http/client-implementation": "*",
+ "psr/http-client-implementation": "*",
+ "psr/http-factory-implementation": "*",
+ "psr/http-message-implementation": "*"
+ },
+ "require-dev": {
+ "composer/composer": "^1.0.2|^2.0",
+ "graham-campbell/phpspec-skip-example-extension": "^5.0",
+ "php-http/httplug": "^1.0 || ^2.0",
+ "php-http/message-factory": "^1.0",
+ "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3",
+ "sebastian/comparator": "^3.0.5 || ^4.0.8",
+ "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Http\\Discovery\\Composer\\Plugin",
+ "plugin-optional": true
+ },
+ "autoload": {
+ "psr-4": {
+ "Http\\Discovery\\": "src/"
+ },
+ "exclude-from-classmap": [
+ "src/Composer/Plugin.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations",
+ "homepage": "http://php-http.org",
+ "keywords": [
+ "adapter",
+ "client",
+ "discovery",
+ "factory",
+ "http",
+ "message",
+ "psr17",
+ "psr7"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/discovery/issues",
+ "source": "https://github.com/php-http/discovery/tree/1.20.0"
+ },
+ "time": "2024-10-02T11:20:13+00:00"
+ },
+ {
+ "name": "phpoption/phpoption",
+ "version": "1.9.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/schmittjoh/php-option.git",
+ "reference": "75365b91986c2405cf5e1e012c5595cd487a98be"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/75365b91986c2405cf5e1e012c5595cd487a98be",
+ "reference": "75365b91986c2405cf5e1e012c5595cd487a98be",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ },
+ "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.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-12-27T19:41:33+00:00"
+ },
+ {
+ "name": "psr/clock",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/clock.git",
+ "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+ "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Clock\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for reading the clock.",
+ "homepage": "https://github.com/php-fig/clock",
+ "keywords": [
+ "clock",
+ "now",
+ "psr",
+ "psr-20",
+ "time"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/clock/issues",
+ "source": "https://github.com/php-fig/clock/tree/1.0.0"
+ },
+ "time": "2022-11-25T14:36:26+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.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-client.git",
+ "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90",
+ "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90",
+ "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"
+ },
+ "time": "2023-09-23T14:17:50+00:00"
+ },
+ {
+ "name": "psr/http-factory",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+ "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1",
+ "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": "PSR-17: 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"
+ },
+ "time": "2024-04-15T12:06:14+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.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
+ "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
+ "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.2"
+ },
+ "time": "2024-09-11T13:17:53+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.12.18",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/bobthecow/psysh.git",
+ "reference": "ddff0ac01beddc251786fe70367cd8bbdb258196"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/bobthecow/psysh/zipball/ddff0ac01beddc251786fe70367cd8bbdb258196",
+ "reference": "ddff0ac01beddc251786fe70367cd8bbdb258196",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "nikic/php-parser": "^5.0 || ^4.0",
+ "php": "^8.0 || ^7.4",
+ "symfony/console": "^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4",
+ "symfony/var-dumper": "^8.0 || ^7.0 || ^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",
+ "composer/class-map-generator": "^1.6"
+ },
+ "suggest": {
+ "composer/class-map-generator": "Improved tab completion performance with better class discovery.",
+ "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)",
+ "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well."
+ },
+ "bin": [
+ "bin/psysh"
+ ],
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": false,
+ "forward-command": false
+ },
+ "branch-alias": {
+ "dev-main": "0.12.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"
+ }
+ ],
+ "description": "An interactive shell for modern PHP.",
+ "homepage": "https://psysh.org",
+ "keywords": [
+ "REPL",
+ "console",
+ "interactive",
+ "shell"
+ ],
+ "support": {
+ "issues": "https://github.com/bobthecow/psysh/issues",
+ "source": "https://github.com/bobthecow/psysh/tree/v0.12.18"
+ },
+ "time": "2025-12-17T14:35:46+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.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ramsey/collection.git",
+ "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2",
+ "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "captainhook/plugin-composer": "^5.3",
+ "ergebnis/composer-normalize": "^2.45",
+ "fakerphp/faker": "^1.24",
+ "hamcrest/hamcrest-php": "^2.0",
+ "jangregor/phpstan-prophecy": "^2.1",
+ "mockery/mockery": "^1.6",
+ "php-parallel-lint/php-console-highlighter": "^1.0",
+ "php-parallel-lint/php-parallel-lint": "^1.4",
+ "phpspec/prophecy-phpunit": "^2.3",
+ "phpstan/extension-installer": "^1.4",
+ "phpstan/phpstan": "^2.1",
+ "phpstan/phpstan-mockery": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpunit/phpunit": "^10.5",
+ "ramsey/coding-standard": "^2.3",
+ "ramsey/conventional-commits": "^1.6",
+ "roave/security-advisories": "dev-latest"
+ },
+ "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.1.1"
+ },
+ "time": "2025-03-22T05:38:12+00:00"
+ },
+ {
+ "name": "ramsey/uuid",
+ "version": "4.9.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ramsey/uuid.git",
+ "reference": "8429c78ca35a09f27565311b98101e2826affde0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ramsey/uuid/zipball/8429c78ca35a09f27565311b98101e2826affde0",
+ "reference": "8429c78ca35a09f27565311b98101e2826affde0",
+ "shasum": ""
+ },
+ "require": {
+ "brick/math": "^0.8.16 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14",
+ "php": "^8.0",
+ "ramsey/collection": "^1.2 || ^2.0"
+ },
+ "replace": {
+ "rhumsaa/uuid": "self.version"
+ },
+ "require-dev": {
+ "captainhook/captainhook": "^5.25",
+ "captainhook/plugin-composer": "^5.3",
+ "dealerdirect/phpcodesniffer-composer-installer": "^1.0",
+ "ergebnis/composer-normalize": "^2.47",
+ "mockery/mockery": "^1.6",
+ "paragonie/random-lib": "^2",
+ "php-mock/php-mock": "^2.6",
+ "php-mock/php-mock-mockery": "^1.5",
+ "php-parallel-lint/php-parallel-lint": "^1.4.0",
+ "phpbench/phpbench": "^1.2.14",
+ "phpstan/extension-installer": "^1.4",
+ "phpstan/phpstan": "^2.1",
+ "phpstan/phpstan-mockery": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpunit/phpunit": "^9.6",
+ "slevomat/coding-standard": "^8.18",
+ "squizlabs/php_codesniffer": "^3.13"
+ },
+ "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.9.2"
+ },
+ "time": "2025-12-14T04:43:48+00:00"
+ },
+ {
+ "name": "spatie/laravel-package-tools",
+ "version": "1.92.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/spatie/laravel-package-tools.git",
+ "reference": "f09a799850b1ed765103a4f0b4355006360c49a5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/f09a799850b1ed765103a4f0b4355006360c49a5",
+ "reference": "f09a799850b1ed765103a4f0b4355006360c49a5",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/contracts": "^9.28|^10.0|^11.0|^12.0",
+ "php": "^8.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.5",
+ "orchestra/testbench": "^7.7|^8.0|^9.0|^10.0",
+ "pestphp/pest": "^1.23|^2.1|^3.1",
+ "phpunit/php-code-coverage": "^9.0|^10.0|^11.0",
+ "phpunit/phpunit": "^9.5.24|^10.5|^11.5",
+ "spatie/pest-plugin-test-time": "^1.1|^2.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Spatie\\LaravelPackageTools\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Freek Van der Herten",
+ "email": "freek@spatie.be",
+ "role": "Developer"
+ }
+ ],
+ "description": "Tools for creating Laravel packages",
+ "homepage": "https://github.com/spatie/laravel-package-tools",
+ "keywords": [
+ "laravel-package-tools",
+ "spatie"
+ ],
+ "support": {
+ "issues": "https://github.com/spatie/laravel-package-tools/issues",
+ "source": "https://github.com/spatie/laravel-package-tools/tree/1.92.7"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/spatie",
+ "type": "github"
+ }
+ ],
+ "time": "2025-07-17T15:46:43+00:00"
+ },
+ {
+ "name": "spatie/laravel-responsecache",
+ "version": "7.7.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/spatie/laravel-responsecache.git",
+ "reference": "039f8b9c2e2b2d838d0bfce32cfe52cf5d1cb8fc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/spatie/laravel-responsecache/zipball/039f8b9c2e2b2d838d0bfce32cfe52cf5d1cb8fc",
+ "reference": "039f8b9c2e2b2d838d0bfce32cfe52cf5d1cb8fc",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/cache": "^10.0|^11.0|^12.0",
+ "illuminate/console": "^10.0|^11.0|^12.0",
+ "illuminate/container": "^10.0|^11.0|^12.0",
+ "illuminate/http": "^10.0|^11.0|^12.0",
+ "illuminate/support": "^10.0|^11.0|^12.0",
+ "nesbot/carbon": "^2.63|^3.0",
+ "php": "^8.2",
+ "spatie/laravel-package-tools": "^1.9"
+ },
+ "require-dev": {
+ "laravel/framework": "^10.0|^11.0|^12.0",
+ "mockery/mockery": "^1.4",
+ "orchestra/testbench": "^8.0|^9.0|^10.0",
+ "pestphp/pest": "^2.22|^3.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "aliases": {
+ "ResponseCache": "Spatie\\ResponseCache\\Facades\\ResponseCache"
+ },
+ "providers": [
+ "Spatie\\ResponseCache\\ResponseCacheServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Spatie\\ResponseCache\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Freek Van der Herten",
+ "email": "freek@spatie.be",
+ "homepage": "https://spatie.be",
+ "role": "Developer"
+ }
+ ],
+ "description": "Speed up a Laravel application by caching the entire response",
+ "homepage": "https://github.com/spatie/laravel-responsecache",
+ "keywords": [
+ "cache",
+ "laravel",
+ "laravel-responsecache",
+ "performance",
+ "response",
+ "spatie"
+ ],
+ "support": {
+ "source": "https://github.com/spatie/laravel-responsecache/tree/7.7.2"
+ },
+ "funding": [
+ {
+ "url": "https://spatie.be/open-source/support-us",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/spatie",
+ "type": "github"
+ }
+ ],
+ "time": "2025-08-28T20:22:23+00:00"
+ },
+ {
+ "name": "symfony/clock",
+ "version": "v8.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/clock.git",
+ "reference": "832119f9b8dbc6c8e6f65f30c5969eca1e88764f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/clock/zipball/832119f9b8dbc6c8e6f65f30c5969eca1e88764f",
+ "reference": "832119f9b8dbc6c8e6f65f30c5969eca1e88764f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.4",
+ "psr/clock": "^1.0"
+ },
+ "provide": {
+ "psr/clock-implementation": "1.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/now.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\Clock\\": ""
+ },
+ "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": "Decouples applications from the system clock",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "clock",
+ "psr20",
+ "time"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/clock/tree/v8.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-11-12T15:46:48+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v7.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "732a9ca6cd9dfd940c639062d5edbde2f6727fb6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/732a9ca6cd9dfd940c639062d5edbde2f6727fb6",
+ "reference": "732a9ca6cd9dfd940c639062d5edbde2f6727fb6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/string": "^7.2|^8.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<6.4",
+ "symfony/dotenv": "<6.4",
+ "symfony/event-dispatcher": "<6.4",
+ "symfony/lock": "<6.4",
+ "symfony/process": "<6.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^6.4|^7.0|^8.0",
+ "symfony/dependency-injection": "^6.4|^7.0|^8.0",
+ "symfony/event-dispatcher": "^6.4|^7.0|^8.0",
+ "symfony/http-foundation": "^6.4|^7.0|^8.0",
+ "symfony/http-kernel": "^6.4|^7.0|^8.0",
+ "symfony/lock": "^6.4|^7.0|^8.0",
+ "symfony/messenger": "^6.4|^7.0|^8.0",
+ "symfony/process": "^6.4|^7.0|^8.0",
+ "symfony/stopwatch": "^6.4|^7.0|^8.0",
+ "symfony/var-dumper": "^6.4|^7.0|^8.0"
+ },
+ "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/v7.4.3"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-12-23T14:50:43+00:00"
+ },
+ {
+ "name": "symfony/css-selector",
+ "version": "v8.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/css-selector.git",
+ "reference": "6225bd458c53ecdee056214cb4a2ffaf58bd592b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/6225bd458c53ecdee056214cb4a2ffaf58bd592b",
+ "reference": "6225bd458c53ecdee056214cb4a2ffaf58bd592b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.4"
+ },
+ "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/v8.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-10-30T14:17:19+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62",
+ "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "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.6.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": "2024-09-25T14:21:43+00:00"
+ },
+ {
+ "name": "symfony/error-handler",
+ "version": "v7.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/error-handler.git",
+ "reference": "48be2b0653594eea32dcef130cca1c811dcf25c2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/48be2b0653594eea32dcef130cca1c811dcf25c2",
+ "reference": "48be2b0653594eea32dcef130cca1c811dcf25c2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "psr/log": "^1|^2|^3",
+ "symfony/polyfill-php85": "^1.32",
+ "symfony/var-dumper": "^6.4|^7.0|^8.0"
+ },
+ "conflict": {
+ "symfony/deprecation-contracts": "<2.5",
+ "symfony/http-kernel": "<6.4"
+ },
+ "require-dev": {
+ "symfony/console": "^6.4|^7.0|^8.0",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/http-kernel": "^6.4|^7.0|^8.0",
+ "symfony/serializer": "^6.4|^7.0|^8.0",
+ "symfony/webpack-encore-bundle": "^1.0|^2.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/v7.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-11-05T14:29:59+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v8.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "573f95783a2ec6e38752979db139f09fec033f03"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/573f95783a2ec6e38752979db139f09fec033f03",
+ "reference": "573f95783a2ec6e38752979db139f09fec033f03",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.4",
+ "symfony/event-dispatcher-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "symfony/security-http": "<7.4",
+ "symfony/service-contracts": "<2.5"
+ },
+ "provide": {
+ "psr/event-dispatcher-implementation": "1.0",
+ "symfony/event-dispatcher-implementation": "2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^7.4|^8.0",
+ "symfony/dependency-injection": "^7.4|^8.0",
+ "symfony/error-handler": "^7.4|^8.0",
+ "symfony/expression-language": "^7.4|^8.0",
+ "symfony/framework-bundle": "^7.4|^8.0",
+ "symfony/http-foundation": "^7.4|^8.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/stopwatch": "^7.4|^8.0"
+ },
+ "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/v8.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-10-30T14:17:19+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+ "reference": "59eb412e93815df44f05f342958efa9f46b1e586"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586",
+ "reference": "59eb412e93815df44f05f342958efa9f46b1e586",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/event-dispatcher": "^1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "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.6.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": "2024-09-25T14:21:43+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v7.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "fffe05569336549b20a1be64250b40516d6e8d06"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/fffe05569336549b20a1be64250b40516d6e8d06",
+ "reference": "fffe05569336549b20a1be64250b40516d6e8d06",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "symfony/filesystem": "^6.4|^7.0|^8.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/v7.4.3"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-12-23T14:50:43+00:00"
+ },
+ {
+ "name": "symfony/http-foundation",
+ "version": "v7.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-foundation.git",
+ "reference": "a70c745d4cea48dbd609f4075e5f5cbce453bd52"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a70c745d4cea48dbd609f4075e5f5cbce453bd52",
+ "reference": "a70c745d4cea48dbd609f4075e5f5cbce453bd52",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "^1.1"
+ },
+ "conflict": {
+ "doctrine/dbal": "<3.6",
+ "symfony/cache": "<6.4.12|>=7.0,<7.1.5"
+ },
+ "require-dev": {
+ "doctrine/dbal": "^3.6|^4",
+ "predis/predis": "^1.1|^2.0",
+ "symfony/cache": "^6.4.12|^7.1.5|^8.0",
+ "symfony/clock": "^6.4|^7.0|^8.0",
+ "symfony/dependency-injection": "^6.4|^7.0|^8.0",
+ "symfony/expression-language": "^6.4|^7.0|^8.0",
+ "symfony/http-kernel": "^6.4|^7.0|^8.0",
+ "symfony/mime": "^6.4|^7.0|^8.0",
+ "symfony/rate-limiter": "^6.4|^7.0|^8.0"
+ },
+ "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/v7.4.3"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-12-23T14:23:49+00:00"
+ },
+ {
+ "name": "symfony/http-kernel",
+ "version": "v7.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-kernel.git",
+ "reference": "885211d4bed3f857b8c964011923528a55702aa5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/885211d4bed3f857b8c964011923528a55702aa5",
+ "reference": "885211d4bed3f857b8c964011923528a55702aa5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "psr/log": "^1|^2|^3",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/error-handler": "^6.4|^7.0|^8.0",
+ "symfony/event-dispatcher": "^7.3|^8.0",
+ "symfony/http-foundation": "^7.4|^8.0",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "symfony/browser-kit": "<6.4",
+ "symfony/cache": "<6.4",
+ "symfony/config": "<6.4",
+ "symfony/console": "<6.4",
+ "symfony/dependency-injection": "<6.4",
+ "symfony/doctrine-bridge": "<6.4",
+ "symfony/flex": "<2.10",
+ "symfony/form": "<6.4",
+ "symfony/http-client": "<6.4",
+ "symfony/http-client-contracts": "<2.5",
+ "symfony/mailer": "<6.4",
+ "symfony/messenger": "<6.4",
+ "symfony/translation": "<6.4",
+ "symfony/translation-contracts": "<2.5",
+ "symfony/twig-bridge": "<6.4",
+ "symfony/validator": "<6.4",
+ "symfony/var-dumper": "<6.4",
+ "twig/twig": "<3.12"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/cache": "^1.0|^2.0|^3.0",
+ "symfony/browser-kit": "^6.4|^7.0|^8.0",
+ "symfony/clock": "^6.4|^7.0|^8.0",
+ "symfony/config": "^6.4|^7.0|^8.0",
+ "symfony/console": "^6.4|^7.0|^8.0",
+ "symfony/css-selector": "^6.4|^7.0|^8.0",
+ "symfony/dependency-injection": "^6.4|^7.0|^8.0",
+ "symfony/dom-crawler": "^6.4|^7.0|^8.0",
+ "symfony/expression-language": "^6.4|^7.0|^8.0",
+ "symfony/finder": "^6.4|^7.0|^8.0",
+ "symfony/http-client-contracts": "^2.5|^3",
+ "symfony/process": "^6.4|^7.0|^8.0",
+ "symfony/property-access": "^7.1|^8.0",
+ "symfony/routing": "^6.4|^7.0|^8.0",
+ "symfony/serializer": "^7.1|^8.0",
+ "symfony/stopwatch": "^6.4|^7.0|^8.0",
+ "symfony/translation": "^6.4|^7.0|^8.0",
+ "symfony/translation-contracts": "^2.5|^3",
+ "symfony/uid": "^6.4|^7.0|^8.0",
+ "symfony/validator": "^6.4|^7.0|^8.0",
+ "symfony/var-dumper": "^6.4|^7.0|^8.0",
+ "symfony/var-exporter": "^6.4|^7.0|^8.0",
+ "twig/twig": "^3.12"
+ },
+ "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/v7.4.3"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-12-31T08:43:57+00:00"
+ },
+ {
+ "name": "symfony/mailer",
+ "version": "v7.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mailer.git",
+ "reference": "e472d35e230108231ccb7f51eb6b2100cac02ee4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mailer/zipball/e472d35e230108231ccb7f51eb6b2100cac02ee4",
+ "reference": "e472d35e230108231ccb7f51eb6b2100cac02ee4",
+ "shasum": ""
+ },
+ "require": {
+ "egulias/email-validator": "^2.1.10|^3|^4",
+ "php": ">=8.2",
+ "psr/event-dispatcher": "^1",
+ "psr/log": "^1|^2|^3",
+ "symfony/event-dispatcher": "^6.4|^7.0|^8.0",
+ "symfony/mime": "^7.2|^8.0",
+ "symfony/service-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "symfony/http-client-contracts": "<2.5",
+ "symfony/http-kernel": "<6.4",
+ "symfony/messenger": "<6.4",
+ "symfony/mime": "<6.4",
+ "symfony/twig-bridge": "<6.4"
+ },
+ "require-dev": {
+ "symfony/console": "^6.4|^7.0|^8.0",
+ "symfony/http-client": "^6.4|^7.0|^8.0",
+ "symfony/messenger": "^6.4|^7.0|^8.0",
+ "symfony/twig-bridge": "^6.4|^7.0|^8.0"
+ },
+ "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/v7.4.3"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-12-16T08:02:06+00:00"
+ },
+ {
+ "name": "symfony/mime",
+ "version": "v7.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mime.git",
+ "reference": "bdb02729471be5d047a3ac4a69068748f1a6be7a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mime/zipball/bdb02729471be5d047a3ac4a69068748f1a6be7a",
+ "reference": "bdb02729471be5d047a3ac4a69068748f1a6be7a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "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": "<6.4",
+ "symfony/serializer": "<6.4.3|>7.0,<7.0.3"
+ },
+ "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": "^6.4|^7.0|^8.0",
+ "symfony/process": "^6.4|^7.0|^8.0",
+ "symfony/property-access": "^6.4|^7.0|^8.0",
+ "symfony/property-info": "^6.4|^7.0|^8.0",
+ "symfony/serializer": "^6.4.3|^7.0.3|^8.0"
+ },
+ "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/v7.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-11-16T10:14:42+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "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.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70",
+ "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "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.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-06-27T09:58:17+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-idn",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-idn.git",
+ "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3",
+ "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2",
+ "symfony/polyfill-intl-normalizer": "^1.10"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "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.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-10T14:38:51+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "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.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493",
+ "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493",
+ "shasum": ""
+ },
+ "require": {
+ "ext-iconv": "*",
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "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.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-23T08:48:59+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
+ "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "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.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-01-02T08:10:11+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php81",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php81.git",
+ "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
+ "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php81\\": ""
+ },
+ "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 backporting some PHP 8.1+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php83",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php83.git",
+ "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5",
+ "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php83\\": ""
+ },
+ "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 backporting some PHP 8.3+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-08T02:45:35+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php84",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php84.git",
+ "reference": "d8ced4d875142b6a7426000426b8abc631d6b191"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191",
+ "reference": "d8ced4d875142b6a7426000426b8abc631d6b191",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php84\\": ""
+ },
+ "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 backporting some PHP 8.4+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-06-24T13:30:11+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php85",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php85.git",
+ "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91",
+ "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php85\\": ""
+ },
+ "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 backporting some PHP 8.5+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-06-23T16:12:55+00:00"
+ },
+ {
+ "name": "symfony/polyfill-uuid",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-uuid.git",
+ "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2",
+ "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-uuid": "*"
+ },
+ "suggest": {
+ "ext-uuid": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "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.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v7.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "2f8e1a6cdf590ca63715da4d3a7a3327404a523f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/2f8e1a6cdf590ca63715da4d3a7a3327404a523f",
+ "reference": "2f8e1a6cdf590ca63715da4d3a7a3327404a523f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "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/v7.4.3"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-12-19T10:00:43+00:00"
+ },
+ {
+ "name": "symfony/routing",
+ "version": "v7.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/routing.git",
+ "reference": "5d3fd7adf8896c2fdb54e2f0f35b1bcbd9e45090"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/5d3fd7adf8896c2fdb54e2f0f35b1bcbd9e45090",
+ "reference": "5d3fd7adf8896c2fdb54e2f0f35b1bcbd9e45090",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "symfony/config": "<6.4",
+ "symfony/dependency-injection": "<6.4",
+ "symfony/yaml": "<6.4"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^6.4|^7.0|^8.0",
+ "symfony/dependency-injection": "^6.4|^7.0|^8.0",
+ "symfony/expression-language": "^6.4|^7.0|^8.0",
+ "symfony/http-foundation": "^6.4|^7.0|^8.0",
+ "symfony/yaml": "^6.4|^7.0|^8.0"
+ },
+ "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/v7.4.3"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-12-19T10:00:43+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v3.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43",
+ "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/container": "^1.1|^2.0",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "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.6.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-15T11:30:57+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v8.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "ba65a969ac918ce0cc3edfac6cdde847eba231dc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/ba65a969ac918ce0cc3edfac6cdde847eba231dc",
+ "reference": "ba65a969ac918ce0cc3edfac6cdde847eba231dc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.4",
+ "symfony/polyfill-ctype": "^1.8",
+ "symfony/polyfill-intl-grapheme": "^1.33",
+ "symfony/polyfill-intl-normalizer": "^1.0",
+ "symfony/polyfill-mbstring": "^1.0"
+ },
+ "conflict": {
+ "symfony/translation-contracts": "<2.5"
+ },
+ "require-dev": {
+ "symfony/emoji": "^7.4|^8.0",
+ "symfony/http-client": "^7.4|^8.0",
+ "symfony/intl": "^7.4|^8.0",
+ "symfony/translation-contracts": "^2.5|^3.0",
+ "symfony/var-exporter": "^7.4|^8.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/v8.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-12-01T09:13:36+00:00"
+ },
+ {
+ "name": "symfony/translation",
+ "version": "v8.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation.git",
+ "reference": "60a8f11f0e15c48f2cc47c4da53873bb5b62135d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/60a8f11f0e15c48f2cc47c4da53873bb5b62135d",
+ "reference": "60a8f11f0e15c48f2cc47c4da53873bb5b62135d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.4",
+ "symfony/polyfill-mbstring": "^1.0",
+ "symfony/translation-contracts": "^3.6.1"
+ },
+ "conflict": {
+ "nikic/php-parser": "<5.0",
+ "symfony/http-client-contracts": "<2.5",
+ "symfony/service-contracts": "<2.5"
+ },
+ "provide": {
+ "symfony/translation-implementation": "2.3|3.0"
+ },
+ "require-dev": {
+ "nikic/php-parser": "^5.0",
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^7.4|^8.0",
+ "symfony/console": "^7.4|^8.0",
+ "symfony/dependency-injection": "^7.4|^8.0",
+ "symfony/finder": "^7.4|^8.0",
+ "symfony/http-client-contracts": "^2.5|^3.0",
+ "symfony/http-kernel": "^7.4|^8.0",
+ "symfony/intl": "^7.4|^8.0",
+ "symfony/polyfill-intl-icu": "^1.21",
+ "symfony/routing": "^7.4|^8.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/yaml": "^7.4|^8.0"
+ },
+ "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/v8.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-12-21T10:59:45+00:00"
+ },
+ {
+ "name": "symfony/translation-contracts",
+ "version": "v3.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation-contracts.git",
+ "reference": "65a8bc82080447fae78373aa10f8d13b38338977"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977",
+ "reference": "65a8bc82080447fae78373aa10f8d13b38338977",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "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.6.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-15T13:41:35+00:00"
+ },
+ {
+ "name": "symfony/uid",
+ "version": "v7.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/uid.git",
+ "reference": "2498e9f81b7baa206f44de583f2f48350b90142c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/uid/zipball/2498e9f81b7baa206f44de583f2f48350b90142c",
+ "reference": "2498e9f81b7baa206f44de583f2f48350b90142c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/polyfill-uuid": "^1.15"
+ },
+ "require-dev": {
+ "symfony/console": "^6.4|^7.0|^8.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/v7.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-09-25T11:02:55+00:00"
+ },
+ {
+ "name": "symfony/var-dumper",
+ "version": "v7.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-dumper.git",
+ "reference": "7e99bebcb3f90d8721890f2963463280848cba92"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7e99bebcb3f90d8721890f2963463280848cba92",
+ "reference": "7e99bebcb3f90d8721890f2963463280848cba92",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/console": "<6.4"
+ },
+ "require-dev": {
+ "symfony/console": "^6.4|^7.0|^8.0",
+ "symfony/http-kernel": "^6.4|^7.0|^8.0",
+ "symfony/process": "^6.4|^7.0|^8.0",
+ "symfony/uid": "^6.4|^7.0|^8.0",
+ "twig/twig": "^3.12"
+ },
+ "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/v7.4.3"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-12-18T07:04:31+00:00"
+ },
+ {
+ "name": "tijsverkoyen/css-to-inline-styles",
+ "version": "v2.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git",
+ "reference": "f0292ccf0ec75843d65027214426b6b163b48b41"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/f0292ccf0ec75843d65027214426b6b163b48b41",
+ "reference": "f0292ccf0ec75843d65027214426b6b163b48b41",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "php": "^7.4 || ^8.0",
+ "symfony/css-selector": "^5.4 || ^6.0 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpunit/phpunit": "^8.5.21 || ^9.5.10"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "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/v2.4.0"
+ },
+ "time": "2025-12-02T11:56:42+00:00"
+ },
+ {
+ "name": "vlucas/phpdotenv",
+ "version": "v5.6.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/vlucas/phpdotenv.git",
+ "reference": "955e7815d677a3eaa7075231212f2110983adecc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/955e7815d677a3eaa7075231212f2110983adecc",
+ "reference": "955e7815d677a3eaa7075231212f2110983adecc",
+ "shasum": ""
+ },
+ "require": {
+ "ext-pcre": "*",
+ "graham-campbell/result-type": "^1.1.4",
+ "php": "^7.2.5 || ^8.0",
+ "phpoption/phpoption": "^1.9.5",
+ "symfony/polyfill-ctype": "^1.26",
+ "symfony/polyfill-mbstring": "^1.26",
+ "symfony/polyfill-php80": "^1.26"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "ext-filter": "*",
+ "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2"
+ },
+ "suggest": {
+ "ext-filter": "Required to use the boolean validator."
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ },
+ "branch-alias": {
+ "dev-master": "5.6-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.6.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-12-27T19:49:13+00:00"
+ },
+ {
+ "name": "voku/portable-ascii",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/voku/portable-ascii.git",
+ "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d",
+ "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d",
+ "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": "https://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.3"
+ },
+ "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": "2024-11-21T01:49:47+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "fakerphp/faker",
+ "version": "v1.24.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/FakerPHP/Faker.git",
+ "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
+ "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
+ "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",
+ "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.24.1"
+ },
+ "time": "2024-11-21T13:46:39+00:00"
+ },
+ {
+ "name": "filp/whoops",
+ "version": "2.18.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/filp/whoops.git",
+ "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/filp/whoops/zipball/d2102955e48b9fd9ab24280a7ad12ed552752c4d",
+ "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "psr/log": "^1.0.1 || ^2.0 || ^3.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3",
+ "symfony/var-dumper": "^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.18.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/denis-sokolov",
+ "type": "github"
+ }
+ ],
+ "time": "2025-08-08T12:00:00+00:00"
+ },
+ {
+ "name": "hamcrest/hamcrest-php",
+ "version": "v2.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hamcrest/hamcrest-php.git",
+ "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487",
+ "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4|^8.0"
+ },
+ "replace": {
+ "cordoval/hamcrest-php": "*",
+ "davedevelopment/hamcrest-php": "*",
+ "kodova/hamcrest-php": "*"
+ },
+ "require-dev": {
+ "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0",
+ "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.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.1.1"
+ },
+ "time": "2025-04-30T06:54:44+00:00"
+ },
+ {
+ "name": "laravel/pail",
+ "version": "v1.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/pail.git",
+ "reference": "49f92285ff5d6fc09816e976a004f8dec6a0ea30"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/pail/zipball/49f92285ff5d6fc09816e976a004f8dec6a0ea30",
+ "reference": "49f92285ff5d6fc09816e976a004f8dec6a0ea30",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "illuminate/console": "^10.24|^11.0|^12.0",
+ "illuminate/contracts": "^10.24|^11.0|^12.0",
+ "illuminate/log": "^10.24|^11.0|^12.0",
+ "illuminate/process": "^10.24|^11.0|^12.0",
+ "illuminate/support": "^10.24|^11.0|^12.0",
+ "nunomaduro/termwind": "^1.15|^2.0",
+ "php": "^8.2",
+ "symfony/console": "^6.0|^7.0"
+ },
+ "require-dev": {
+ "laravel/framework": "^10.24|^11.0|^12.0",
+ "laravel/pint": "^1.13",
+ "orchestra/testbench-core": "^8.13|^9.17|^10.8",
+ "pestphp/pest": "^2.20|^3.0|^4.0",
+ "pestphp/pest-plugin-type-coverage": "^2.3|^3.0|^4.0",
+ "phpstan/phpstan": "^1.12.27",
+ "symfony/var-dumper": "^6.3|^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Laravel\\Pail\\PailServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-main": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laravel\\Pail\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ },
+ {
+ "name": "Nuno Maduro",
+ "email": "enunomaduro@gmail.com"
+ }
+ ],
+ "description": "Easily delve into your Laravel application's log files directly from the command line.",
+ "homepage": "https://github.com/laravel/pail",
+ "keywords": [
+ "dev",
+ "laravel",
+ "logs",
+ "php",
+ "tail"
+ ],
+ "support": {
+ "issues": "https://github.com/laravel/pail/issues",
+ "source": "https://github.com/laravel/pail"
+ },
+ "time": "2025-11-20T16:29:35+00:00"
+ },
+ {
+ "name": "laravel/pint",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/pint.git",
+ "reference": "c67b4195b75491e4dfc6b00b1c78b68d86f54c90"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/pint/zipball/c67b4195b75491e4dfc6b00b1c78b68d86f54c90",
+ "reference": "c67b4195b75491e4dfc6b00b1c78b68d86f54c90",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "ext-tokenizer": "*",
+ "ext-xml": "*",
+ "php": "^8.2.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^3.92.4",
+ "illuminate/view": "^12.44.0",
+ "larastan/larastan": "^3.8.1",
+ "laravel-zero/framework": "^12.0.4",
+ "mockery/mockery": "^1.6.12",
+ "nunomaduro/termwind": "^2.3.3",
+ "pestphp/pest": "^3.8.4"
+ },
+ "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": [
+ "dev",
+ "format",
+ "formatter",
+ "lint",
+ "linter",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/laravel/pint/issues",
+ "source": "https://github.com/laravel/pint"
+ },
+ "time": "2026-01-05T16:49:17+00:00"
+ },
+ {
+ "name": "laravel/sail",
+ "version": "v1.52.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/sail.git",
+ "reference": "64ac7d8abb2dbcf2b76e61289451bae79066b0b3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/sail/zipball/64ac7d8abb2dbcf2b76e61289451bae79066b0b3",
+ "reference": "64ac7d8abb2dbcf2b76e61289451bae79066b0b3",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0",
+ "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0",
+ "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0",
+ "php": "^8.0",
+ "symfony/console": "^6.0|^7.0",
+ "symfony/yaml": "^6.0|^7.0"
+ },
+ "require-dev": {
+ "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0",
+ "phpstan/phpstan": "^2.0"
+ },
+ "bin": [
+ "bin/sail"
+ ],
+ "type": "library",
+ "extra": {
+ "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": "2026-01-01T02:46:03+00:00"
+ },
+ {
+ "name": "mockery/mockery",
+ "version": "1.6.12",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mockery/mockery.git",
+ "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699",
+ "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699",
+ "shasum": ""
+ },
+ "require": {
+ "hamcrest/hamcrest-php": "^2.0.1",
+ "lib-pcre": ">=7.0",
+ "php": ">=7.3"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5 || ^9.6.17",
+ "symplify/easy-coding-standard": "^12.1.14"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "library/helpers.php",
+ "library/Mockery.php"
+ ],
+ "psr-4": {
+ "Mockery\\": "library/Mockery"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Pádraic Brady",
+ "email": "padraic.brady@gmail.com",
+ "homepage": "https://github.com/padraic",
+ "role": "Author"
+ },
+ {
+ "name": "Dave Marshall",
+ "email": "dave.marshall@atstsolutions.co.uk",
+ "homepage": "https://davedevelopment.co.uk",
+ "role": "Developer"
+ },
+ {
+ "name": "Nathanael Esayeas",
+ "email": "nathanael.esayeas@protonmail.com",
+ "homepage": "https://github.com/ghostwriter",
+ "role": "Lead Developer"
+ }
+ ],
+ "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": {
+ "docs": "https://docs.mockery.io/",
+ "issues": "https://github.com/mockery/mockery/issues",
+ "rss": "https://github.com/mockery/mockery/releases.atom",
+ "security": "https://github.com/mockery/mockery/security/advisories",
+ "source": "https://github.com/mockery/mockery"
+ },
+ "time": "2024-05-16T03:13:13+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.13.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a",
+ "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a",
+ "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",
+ "phpspec/prophecy": "^1.10",
+ "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.13.4"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-01T08:46:24+00:00"
+ },
+ {
+ "name": "nunomaduro/collision",
+ "version": "v8.8.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nunomaduro/collision.git",
+ "reference": "1dc9e88d105699d0fee8bb18890f41b274f6b4c4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nunomaduro/collision/zipball/1dc9e88d105699d0fee8bb18890f41b274f6b4c4",
+ "reference": "1dc9e88d105699d0fee8bb18890f41b274f6b4c4",
+ "shasum": ""
+ },
+ "require": {
+ "filp/whoops": "^2.18.1",
+ "nunomaduro/termwind": "^2.3.1",
+ "php": "^8.2.0",
+ "symfony/console": "^7.3.0"
+ },
+ "conflict": {
+ "laravel/framework": "<11.44.2 || >=13.0.0",
+ "phpunit/phpunit": "<11.5.15 || >=13.0.0"
+ },
+ "require-dev": {
+ "brianium/paratest": "^7.8.3",
+ "larastan/larastan": "^3.4.2",
+ "laravel/framework": "^11.44.2 || ^12.18",
+ "laravel/pint": "^1.22.1",
+ "laravel/sail": "^1.43.1",
+ "laravel/sanctum": "^4.1.1",
+ "laravel/tinker": "^2.10.1",
+ "orchestra/testbench-core": "^9.12.0 || ^10.4",
+ "pestphp/pest": "^3.8.2 || ^4.0.0",
+ "sebastian/environment": "^7.2.1 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-8.x": "8.x-dev"
+ }
+ },
+ "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",
+ "dev",
+ "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": "2025-11-20T02:55:25+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "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.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-03T12:33:53+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": "11.0.12",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "2c1ed04922802c15e1de5d7447b4856de949cf56"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2c1ed04922802c15e1de5d7447b4856de949cf56",
+ "reference": "2c1ed04922802c15e1de5d7447b4856de949cf56",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^5.7.0",
+ "php": ">=8.2",
+ "phpunit/php-file-iterator": "^5.1.0",
+ "phpunit/php-text-template": "^4.0.1",
+ "sebastian/code-unit-reverse-lookup": "^4.0.1",
+ "sebastian/complexity": "^4.0.1",
+ "sebastian/environment": "^7.2.1",
+ "sebastian/lines-of-code": "^3.0.1",
+ "sebastian/version": "^5.0.2",
+ "theseer/tokenizer": "^1.3.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.5.46"
+ },
+ "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": "11.0.x-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/11.0.12"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-12-24T07:01:01+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "5.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6",
+ "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.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",
+ "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/5.1.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-08-27T05:02:59+00:00"
+ },
+ {
+ "name": "phpunit/php-invoker",
+ "version": "5.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2",
+ "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^11.0"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
+ },
+ "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",
+ "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",
+ "security": "https://github.com/sebastianbergmann/php-invoker/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T05:07:44+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "4.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964",
+ "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.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": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "security": "https://github.com/sebastianbergmann/php-text-template/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T05:08:43+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "7.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3",
+ "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "7.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",
+ "security": "https://github.com/sebastianbergmann/php-timer/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T05:09:35+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "11.5.46",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "75dfe79a2aa30085b7132bb84377c24062193f33"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/75dfe79a2aa30085b7132bb84377c24062193f33",
+ "reference": "75dfe79a2aa30085b7132bb84377c24062193f33",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.13.4",
+ "phar-io/manifest": "^2.0.4",
+ "phar-io/version": "^3.2.1",
+ "php": ">=8.2",
+ "phpunit/php-code-coverage": "^11.0.11",
+ "phpunit/php-file-iterator": "^5.1.0",
+ "phpunit/php-invoker": "^5.0.1",
+ "phpunit/php-text-template": "^4.0.1",
+ "phpunit/php-timer": "^7.0.1",
+ "sebastian/cli-parser": "^3.0.2",
+ "sebastian/code-unit": "^3.0.3",
+ "sebastian/comparator": "^6.3.2",
+ "sebastian/diff": "^6.0.2",
+ "sebastian/environment": "^7.2.1",
+ "sebastian/exporter": "^6.3.2",
+ "sebastian/global-state": "^7.0.2",
+ "sebastian/object-enumerator": "^6.0.1",
+ "sebastian/type": "^5.1.3",
+ "sebastian/version": "^5.0.2",
+ "staabm/side-effects-detector": "^1.0.5"
+ },
+ "suggest": {
+ "ext-soap": "To be able to generate mocks based on WSDL files"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "11.5-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/11.5.46"
+ },
+ "funding": [
+ {
+ "url": "https://phpunit.de/sponsors.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-12-06T08:01:15+00:00"
+ },
+ {
+ "name": "sebastian/cli-parser",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180",
+ "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.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 parsing CLI options",
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+ "security": "https://github.com/sebastianbergmann/cli-parser/security/policy",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T04:41:36+00:00"
+ },
+ {
+ "name": "sebastian/code-unit",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
+ "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64",
+ "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.5"
+ },
+ "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": "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",
+ "security": "https://github.com/sebastianbergmann/code-unit/security/policy",
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2025-03-19T07:56:08+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "4.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "183a9b2632194febd219bb9246eee421dad8d45e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e",
+ "reference": "183a9b2632194febd219bb9246eee421dad8d45e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.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"
+ }
+ ],
+ "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",
+ "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T04:45:54+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "6.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/85c77556683e6eee4323e4c5468641ca0237e2e8",
+ "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-mbstring": "*",
+ "php": ">=8.2",
+ "sebastian/diff": "^6.0",
+ "sebastian/exporter": "^6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.4"
+ },
+ "suggest": {
+ "ext-bcmath": "For comparing BcMath\\Number objects"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "6.3-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",
+ "security": "https://github.com/sebastianbergmann/comparator/security/policy",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-10T08:07:46+00:00"
+ },
+ {
+ "name": "sebastian/complexity",
+ "version": "4.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "ee41d384ab1906c68852636b6de493846e13e5a0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0",
+ "reference": "ee41d384ab1906c68852636b6de493846e13e5a0",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^5.0",
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.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": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/complexity/issues",
+ "security": "https://github.com/sebastianbergmann/complexity/security/policy",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T04:49:50+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "6.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544",
+ "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.0",
+ "symfony/process": "^4.2 || ^5"
+ },
+ "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"
+ },
+ {
+ "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/6.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T04:53:05+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "7.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4",
+ "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.3"
+ },
+ "suggest": {
+ "ext-posix": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "7.2-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/7.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/environment",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-05-21T11:55:47+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "6.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "70a298763b40b213ec087c51c739efcaa90bcd74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/70a298763b40b213ec087c51c739efcaa90bcd74",
+ "reference": "70a298763b40b213ec087c51c739efcaa90bcd74",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=8.2",
+ "sebastian/recursion-context": "^6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "6.3-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",
+ "security": "https://github.com/sebastianbergmann/exporter/security/policy",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-09-24T06:12:51+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "7.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "3be331570a721f9a4b5917f4209773de17f747d7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7",
+ "reference": "3be331570a721f9a4b5917f4209773de17f747d7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "sebastian/object-reflector": "^4.0",
+ "sebastian/recursion-context": "^6.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "phpunit/phpunit": "^11.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "7.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": "https://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
+ "security": "https://github.com/sebastianbergmann/global-state/security/policy",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T04:57:36+00:00"
+ },
+ {
+ "name": "sebastian/lines-of-code",
+ "version": "3.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a",
+ "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^5.0",
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.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 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",
+ "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T04:58:38+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "6.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "f5b498e631a74204185071eb41f33f38d64608aa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa",
+ "reference": "f5b498e631a74204185071eb41f33f38d64608aa",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "sebastian/object-reflector": "^4.0",
+ "sebastian/recursion-context": "^6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.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": "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",
+ "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T05:00:13+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "4.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9",
+ "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.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"
+ }
+ ],
+ "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",
+ "security": "https://github.com/sebastianbergmann/object-reflector/security/policy",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T05:01:32+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "6.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc",
+ "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.3"
+ },
+ "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"
+ },
+ {
+ "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",
+ "security": "https://github.com/sebastianbergmann/recursion-context/security/policy",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-13T04:42:22+00:00"
+ },
+ {
+ "name": "sebastian/type",
+ "version": "5.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449",
+ "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.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": "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",
+ "security": "https://github.com/sebastianbergmann/type/security/policy",
+ "source": "https://github.com/sebastianbergmann/type/tree/5.1.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/type",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-09T06:55:48+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "5.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874",
+ "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "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",
+ "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",
+ "security": "https://github.com/sebastianbergmann/version/security/policy",
+ "source": "https://github.com/sebastianbergmann/version/tree/5.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-10-09T05:16:32+00:00"
+ },
+ {
+ "name": "staabm/side-effects-detector",
+ "version": "1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/staabm/side-effects-detector.git",
+ "reference": "d8334211a140ce329c13726d4a715adbddd0a163"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163",
+ "reference": "d8334211a140ce329c13726d4a715adbddd0a163",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/extension-installer": "^1.4.3",
+ "phpstan/phpstan": "^1.12.6",
+ "phpunit/phpunit": "^9.6.21",
+ "symfony/var-dumper": "^5.4.43",
+ "tomasvotruba/type-coverage": "1.0.0",
+ "tomasvotruba/unused-public": "1.0.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "lib/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A static analysis tool to detect side effects in PHP code",
+ "keywords": [
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/staabm/side-effects-detector/issues",
+ "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/staabm",
+ "type": "github"
+ }
+ ],
+ "time": "2024-10-20T05:08:20+00:00"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v7.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "24dd4de28d2e3988b311751ac49e684d783e2345"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/24dd4de28d2e3988b311751ac49e684d783e2345",
+ "reference": "24dd4de28d2e3988b311751ac49e684d783e2345",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "symfony/console": "<6.4"
+ },
+ "require-dev": {
+ "symfony/console": "^6.4|^7.0|^8.0"
+ },
+ "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/v7.4.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-12-04T18:11:45+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "b7489ce515e168639d17feec34b8847c326b0b3c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c",
+ "reference": "b7489ce515e168639d17feec34b8847c326b0b3c",
+ "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.3.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2025-11-17T20:03:58+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {},
+ "prefer-stable": true,
+ "prefer-lowest": false,
+ "platform": {
+ "php": "^8.2"
+ },
+ "platform-dev": {},
+ "plugin-api-version": "2.6.0"
+}
diff --git a/config/app.php b/config/app.php
new file mode 100755
index 00000000..b943fb2a
--- /dev/null
+++ b/config/app.php
@@ -0,0 +1,123 @@
+ env('is_loc', false),
+ 'page_limit' => env('page_limit', 10),
+
+ 'name' => env('APP_NAME', '网站名字'),
+ 'site_code' => env('site_code', 'site_code'),
+ 'site_code_short' => env('site_code_short', 'site_code_short'),
+ 'title' => env('app_title', '网站标题'),
+ 'keywords' => env('app_keywords', '关键词'),
+ 'desc' => env('app_desc', '页面简介'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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
+ | the application so that it's available within Artisan commands.
+ |
+ */
+
+ 'url' => env('APP_URL', 'http://localhost'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Application Timezone
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify the default timezone for your application, which
+ | will be used by the PHP date and date-time functions. The timezone
+ | is set to "UTC" by default as it is suitable for most use cases.
+ |
+ */
+
+ 'timezone' => 'UTC',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Application Locale Configuration
+ |--------------------------------------------------------------------------
+ |
+ | The application locale determines the default locale that will be used
+ | by Laravel's translation / localization methods. This option can be
+ | set to any locale for which you plan to have translation strings.
+ |
+ */
+
+ 'locale' => env('APP_LOCALE', 'en'),
+
+ 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'),
+
+ 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Encryption Key
+ |--------------------------------------------------------------------------
+ |
+ | This key is utilized by Laravel's encryption services and should be set
+ | to a random, 32 character string to ensure that all encrypted values
+ | are secure. You should do this prior to deploying the application.
+ |
+ */
+
+ 'cipher' => 'AES-256-CBC',
+
+ 'key' => env('APP_KEY'),
+
+ 'previous_keys' => [
+ ...array_filter(
+ explode(',', (string) env('APP_PREVIOUS_KEYS', ''))
+ ),
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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' => env('APP_MAINTENANCE_DRIVER', 'file'),
+ 'store' => env('APP_MAINTENANCE_STORE', 'database'),
+ ],
+
+];
diff --git a/config/auth.php b/config/auth.php
new file mode 100755
index 00000000..7d1eb0de
--- /dev/null
+++ b/config/auth.php
@@ -0,0 +1,115 @@
+ [
+ 'guard' => env('AUTH_GUARD', 'web'),
+ 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'),
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Authentication Guards
+ |--------------------------------------------------------------------------
+ |
+ | Next, you may define every authentication guard for your application.
+ | Of course, a great default configuration has been defined for you
+ | which utilizes session storage plus the Eloquent user provider.
+ |
+ | All authentication guards have a user provider, which defines how the
+ | users are actually retrieved out of your database or other storage
+ | system used by the application. Typically, Eloquent is utilized.
+ |
+ | Supported: "session"
+ |
+ */
+
+ 'guards' => [
+ 'web' => [
+ 'driver' => 'session',
+ 'provider' => 'users',
+ ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | User Providers
+ |--------------------------------------------------------------------------
+ |
+ | All authentication guards have a user provider, which defines how the
+ | users are actually retrieved out of your database or other storage
+ | system used by the application. Typically, Eloquent is utilized.
+ |
+ | If you have multiple user tables or models you may configure multiple
+ | providers to represent the model / table. These providers may then
+ | be assigned to any extra authentication guards you have defined.
+ |
+ | Supported: "database", "eloquent"
+ |
+ */
+
+ 'providers' => [
+ 'users' => [
+ 'driver' => 'eloquent',
+ 'model' => env('AUTH_MODEL', App\Models\User::class),
+ ],
+
+ // 'users' => [
+ // 'driver' => 'database',
+ // 'table' => 'users',
+ // ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Resetting Passwords
+ |--------------------------------------------------------------------------
+ |
+ | These configuration options specify the behavior of Laravel's password
+ | reset functionality, including the table utilized for token storage
+ | and the user provider that is invoked to actually retrieve users.
+ |
+ | 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' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'),
+ 'expire' => 60,
+ 'throttle' => 60,
+ ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Password Confirmation Timeout
+ |--------------------------------------------------------------------------
+ |
+ | Here you may define the number of seconds before a password confirmation
+ | window expires and users are asked to re-enter their password via the
+ | confirmation screen. By default, the timeout lasts for three hours.
+ |
+ */
+
+ 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800),
+
+];
diff --git a/config/cache.php b/config/cache.php
new file mode 100755
index 00000000..b32aead2
--- /dev/null
+++ b/config/cache.php
@@ -0,0 +1,117 @@
+ env('CACHE_STORE', 'database'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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: "array", "database", "file", "memcached",
+ | "redis", "dynamodb", "octane",
+ | "failover", "null"
+ |
+ */
+
+ 'stores' => [
+
+ 'array' => [
+ 'driver' => 'array',
+ 'serialize' => false,
+ ],
+
+ 'database' => [
+ 'driver' => 'database',
+ 'connection' => env('DB_CACHE_CONNECTION'),
+ 'table' => env('DB_CACHE_TABLE', 'cache'),
+ 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'),
+ 'lock_table' => env('DB_CACHE_LOCK_TABLE'),
+ ],
+
+ 'file' => [
+ 'driver' => 'file',
+ 'path' => storage_path('framework/cache/data'),
+ 'lock_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' => env('REDIS_CACHE_CONNECTION', 'cache'),
+ 'lock_connection' => env('REDIS_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',
+ ],
+
+ 'failover' => [
+ 'driver' => 'failover',
+ 'stores' => [
+ 'database',
+ 'array',
+ ],
+ ],
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Cache Key Prefix
+ |--------------------------------------------------------------------------
+ |
+ | When utilizing the APC, database, memcached, Redis, and 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((string) env('APP_NAME', 'laravel')).'-cache-'),
+
+];
diff --git a/config/constants.php b/config/constants.php
new file mode 100755
index 00000000..3f9909a6
--- /dev/null
+++ b/config/constants.php
@@ -0,0 +1,8 @@
+ [
+ 'one_week' => 60 * 60 * 24 * 7,
+ 'one_day' => 60 * 60 * 24,
+ ],
+];
diff --git a/config/database.php b/config/database.php
new file mode 100755
index 00000000..df933e7f
--- /dev/null
+++ b/config/database.php
@@ -0,0 +1,183 @@
+ env('DB_CONNECTION', 'sqlite'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Database Connections
+ |--------------------------------------------------------------------------
+ |
+ | Below are all of the database connections defined for your application.
+ | An example configuration is provided for each database system which
+ | is supported by Laravel. You're free to add / remove connections.
+ |
+ */
+
+ 'connections' => [
+
+ 'sqlite' => [
+ 'driver' => 'sqlite',
+ 'url' => env('DB_URL'),
+ 'database' => env('DB_DATABASE', database_path('database.sqlite')),
+ 'prefix' => '',
+ 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
+ 'busy_timeout' => null,
+ 'journal_mode' => null,
+ 'synchronous' => null,
+ 'transaction_mode' => 'DEFERRED',
+ ],
+
+ 'mysql' => [
+ 'driver' => 'mysql',
+ 'url' => env('DB_URL'),
+ 'host' => env('DB_HOST', '127.0.0.1'),
+ 'port' => env('DB_PORT', '3306'),
+ 'database' => env('DB_DATABASE', 'laravel'),
+ 'username' => env('DB_USERNAME', 'root'),
+ 'password' => env('DB_PASSWORD', ''),
+ 'unix_socket' => env('DB_SOCKET', ''),
+ 'charset' => env('DB_CHARSET', 'utf8mb4'),
+ 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
+ 'prefix' => '',
+ 'prefix_indexes' => true,
+ 'strict' => true,
+ 'engine' => null,
+ 'options' => extension_loaded('pdo_mysql') ? array_filter([
+ (PHP_VERSION_ID >= 80500 ? \Pdo\Mysql::ATTR_SSL_CA : \PDO::MYSQL_ATTR_SSL_CA) => env('MYSQL_ATTR_SSL_CA'),
+ ]) : [],
+ ],
+
+ 'mariadb' => [
+ 'driver' => 'mariadb',
+ 'url' => env('DB_URL'),
+ 'host' => env('DB_HOST', '127.0.0.1'),
+ 'port' => env('DB_PORT', '3306'),
+ 'database' => env('DB_DATABASE', 'laravel'),
+ 'username' => env('DB_USERNAME', 'root'),
+ 'password' => env('DB_PASSWORD', ''),
+ 'unix_socket' => env('DB_SOCKET', ''),
+ 'charset' => env('DB_CHARSET', 'utf8mb4'),
+ 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
+ 'prefix' => '',
+ 'prefix_indexes' => true,
+ 'strict' => true,
+ 'engine' => null,
+ 'options' => extension_loaded('pdo_mysql') ? array_filter([
+ (PHP_VERSION_ID >= 80500 ? \Pdo\Mysql::ATTR_SSL_CA : \PDO::MYSQL_ATTR_SSL_CA) => env('MYSQL_ATTR_SSL_CA'),
+ ]) : [],
+ ],
+
+ 'pgsql' => [
+ 'driver' => 'pgsql',
+ 'url' => env('DB_URL'),
+ 'host' => env('DB_HOST', '127.0.0.1'),
+ 'port' => env('DB_PORT', '5432'),
+ 'database' => env('DB_DATABASE', 'laravel'),
+ 'username' => env('DB_USERNAME', 'root'),
+ 'password' => env('DB_PASSWORD', ''),
+ 'charset' => env('DB_CHARSET', 'utf8'),
+ 'prefix' => '',
+ 'prefix_indexes' => true,
+ 'search_path' => 'public',
+ 'sslmode' => env('DB_SSLMODE', 'prefer'),
+ ],
+
+ 'sqlsrv' => [
+ 'driver' => 'sqlsrv',
+ 'url' => env('DB_URL'),
+ 'host' => env('DB_HOST', 'localhost'),
+ 'port' => env('DB_PORT', '1433'),
+ 'database' => env('DB_DATABASE', 'laravel'),
+ 'username' => env('DB_USERNAME', 'root'),
+ 'password' => env('DB_PASSWORD', ''),
+ 'charset' => env('DB_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 on the database.
+ |
+ */
+
+ 'migrations' => [
+ 'table' => 'migrations',
+ 'update_date_on_publish' => true,
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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 Memcached. You may define your connection settings here.
+ |
+ */
+
+ 'redis' => [
+
+ 'client' => env('REDIS_CLIENT', 'phpredis'),
+
+ 'options' => [
+ 'cluster' => env('REDIS_CLUSTER', 'redis'),
+ 'prefix' => env('REDIS_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-database-'),
+ 'persistent' => env('REDIS_PERSISTENT', false),
+ ],
+
+ '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'),
+ 'max_retries' => env('REDIS_MAX_RETRIES', 3),
+ 'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'),
+ 'backoff_base' => env('REDIS_BACKOFF_BASE', 100),
+ 'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000),
+ ],
+
+ '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'),
+ 'max_retries' => env('REDIS_MAX_RETRIES', 3),
+ 'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'),
+ 'backoff_base' => env('REDIS_BACKOFF_BASE', 100),
+ 'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000),
+ ],
+
+ ],
+
+];
diff --git a/config/filesystems.php b/config/filesystems.php
new file mode 100755
index 00000000..65a51932
--- /dev/null
+++ b/config/filesystems.php
@@ -0,0 +1,96 @@
+ env('FILESYSTEM_DISK', 'local'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Filesystem Disks
+ |--------------------------------------------------------------------------
+ |
+ | Below you may configure as many filesystem disks as necessary, and you
+ | may even configure multiple disks for the same driver. Examples for
+ | most supported storage drivers are configured here for reference.
+ |
+ | Supported drivers: "local", "ftp", "sftp", "s3"
+ |
+ */
+
+ 'disks' => [
+
+ 'local' => [
+ 'driver' => 'local',
+ 'root' => storage_path('app/private'),
+ 'serve' => true,
+ 'throw' => false,
+ 'report' => false,
+ ],
+
+ 'public' => [
+ 'driver' => 'local',
+ 'root' => storage_path('app/public'),
+ 'url' => rtrim(env('APP_URL'), '/').'/storage',
+ 'visibility' => 'public',
+ 'throw' => false,
+ 'report' => false,
+ ],
+
+ 'upload' => [
+ 'driver' => 'local',
+ 'root' => public_path('upload'),
+ 'url' => env('APP_URL').'/upload',
+ 'visibility' => 'public',
+ 'throw' => false,
+ ],
+
+ 'upload_images' => [
+ 'driver' => 'local',
+ 'root' => public_path('upload/images'),
+ 'url' => env('APP_URL').'/upload/images',
+ 'visibility' => 'public',
+ 'throw' => false,
+ ],
+
+ 's3' => [
+ 'driver' => 's3',
+ 'key' => env('AWS_ACCESS_KEY_ID'),
+ 'secret' => env('AWS_SECRET_ACCESS_KEY'),
+ 'region' => env('AWS_DEFAULT_REGION'),
+ 'bucket' => env('AWS_BUCKET'),
+ 'url' => env('AWS_URL'),
+ 'endpoint' => env('AWS_ENDPOINT'),
+ 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
+ 'throw' => false,
+ 'report' => false,
+ ],
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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/config/logging.php b/config/logging.php
new file mode 100755
index 00000000..9e998a49
--- /dev/null
+++ b/config/logging.php
@@ -0,0 +1,132 @@
+ 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' => env('LOG_DEPRECATIONS_TRACE', false),
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Log Channels
+ |--------------------------------------------------------------------------
+ |
+ | Here you may configure the log channels for your application. Laravel
+ | utilizes the Monolog PHP logging library, which includes a variety
+ | of powerful log handlers and formatters that you're free to use.
+ |
+ | Available drivers: "single", "daily", "slack", "syslog",
+ | "errorlog", "monolog", "custom", "stack"
+ |
+ */
+
+ 'channels' => [
+
+ 'stack' => [
+ 'driver' => 'stack',
+ 'channels' => explode(',', (string) env('LOG_STACK', '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' => env('LOG_DAILY_DAYS', 14),
+ 'replace_placeholders' => true,
+ ],
+
+ 'slack' => [
+ 'driver' => 'slack',
+ 'url' => env('LOG_SLACK_WEBHOOK_URL'),
+ 'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'),
+ 'emoji' => env('LOG_SLACK_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,
+ 'handler_with' => [
+ 'stream' => 'php://stderr',
+ ],
+ 'formatter' => env('LOG_STDERR_FORMATTER'),
+ 'processors' => [PsrLogMessageProcessor::class],
+ ],
+
+ 'syslog' => [
+ 'driver' => 'syslog',
+ 'level' => env('LOG_LEVEL', 'debug'),
+ 'facility' => env('LOG_SYSLOG_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/config/mail.php b/config/mail.php
new file mode 100755
index 00000000..522b284b
--- /dev/null
+++ b/config/mail.php
@@ -0,0 +1,118 @@
+ env('MAIL_MAILER', 'log'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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 that can be used
+ | when delivering an email. You may specify which one you're using for
+ | your mailers below. You may also add additional mailers if needed.
+ |
+ | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2",
+ | "postmark", "resend", "log", "array",
+ | "failover", "roundrobin"
+ |
+ */
+
+ 'mailers' => [
+
+ 'smtp' => [
+ 'transport' => 'smtp',
+ 'scheme' => env('MAIL_SCHEME'),
+ 'url' => env('MAIL_URL'),
+ 'host' => env('MAIL_HOST', '127.0.0.1'),
+ 'port' => env('MAIL_PORT', 2525),
+ 'username' => env('MAIL_USERNAME'),
+ 'password' => env('MAIL_PASSWORD'),
+ 'timeout' => null,
+ 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url((string) env('APP_URL', 'http://localhost'), PHP_URL_HOST)),
+ ],
+
+ 'ses' => [
+ 'transport' => 'ses',
+ ],
+
+ 'postmark' => [
+ 'transport' => 'postmark',
+ // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'),
+ // 'client' => [
+ // 'timeout' => 5,
+ // ],
+ ],
+
+ 'resend' => [
+ 'transport' => 'resend',
+ ],
+
+ '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',
+ ],
+ 'retry_after' => 60,
+ ],
+
+ 'roundrobin' => [
+ 'transport' => 'roundrobin',
+ 'mailers' => [
+ 'ses',
+ 'postmark',
+ ],
+ 'retry_after' => 60,
+ ],
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Global "From" Address
+ |--------------------------------------------------------------------------
+ |
+ | You may wish for all emails 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 emails that are sent by your application.
+ |
+ */
+
+ 'from' => [
+ 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
+ 'name' => env('MAIL_FROM_NAME', 'Example'),
+ ],
+
+];
diff --git a/config/path.php b/config/path.php
new file mode 100755
index 00000000..0dd0c293
--- /dev/null
+++ b/config/path.php
@@ -0,0 +1,8 @@
+ env('url_master_base'),
+ 'url_resource_base' => env('url_resource_base'),
+
+];
diff --git a/config/queue.php b/config/queue.php
new file mode 100755
index 00000000..79c2c0a2
--- /dev/null
+++ b/config/queue.php
@@ -0,0 +1,129 @@
+ env('QUEUE_CONNECTION', 'database'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Queue Connections
+ |--------------------------------------------------------------------------
+ |
+ | Here you may configure the connection options for every queue backend
+ | used by your application. An example configuration is provided for
+ | each backend supported by Laravel. You're also free to add more.
+ |
+ | Drivers: "sync", "database", "beanstalkd", "sqs", "redis",
+ | "deferred", "background", "failover", "null"
+ |
+ */
+
+ 'connections' => [
+
+ 'sync' => [
+ 'driver' => 'sync',
+ ],
+
+ 'database' => [
+ 'driver' => 'database',
+ 'connection' => env('DB_QUEUE_CONNECTION'),
+ 'table' => env('DB_QUEUE_TABLE', 'jobs'),
+ 'queue' => env('DB_QUEUE', 'default'),
+ 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90),
+ 'after_commit' => false,
+ ],
+
+ 'beanstalkd' => [
+ 'driver' => 'beanstalkd',
+ 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'),
+ 'queue' => env('BEANSTALKD_QUEUE', 'default'),
+ 'retry_after' => (int) env('BEANSTALKD_QUEUE_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' => env('REDIS_QUEUE_CONNECTION', 'default'),
+ 'queue' => env('REDIS_QUEUE', 'default'),
+ 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90),
+ 'block_for' => null,
+ 'after_commit' => false,
+ ],
+
+ 'deferred' => [
+ 'driver' => 'deferred',
+ ],
+
+ 'background' => [
+ 'driver' => 'background',
+ ],
+
+ 'failover' => [
+ 'driver' => 'failover',
+ 'connections' => [
+ 'database',
+ 'deferred',
+ ],
+ ],
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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', 'sqlite'),
+ 'table' => 'job_batches',
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Failed Queue Jobs
+ |--------------------------------------------------------------------------
+ |
+ | These options configure the behavior of failed queue job logging so you
+ | can control how and where failed jobs are stored. Laravel ships with
+ | support for storing failed jobs in a simple file or in a database.
+ |
+ | Supported drivers: "database-uuids", "dynamodb", "file", "null"
+ |
+ */
+
+ 'failed' => [
+ 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'),
+ 'database' => env('DB_CONNECTION', 'sqlite'),
+ 'table' => 'failed_jobs',
+ ],
+
+];
diff --git a/config/responsecache.php b/config/responsecache.php
new file mode 100755
index 00000000..7caf3081
--- /dev/null
+++ b/config/responsecache.php
@@ -0,0 +1,97 @@
+ env('RESPONSE_CACHE_ENABLED', true),
+
+ /*
+ * The given class will determinate if a request should be cached. The
+ * default class will cache all successful GET-requests.
+ *
+ * You can provide your own class given that it implements the
+ * CacheProfile interface.
+ */
+ 'cache_profile' => Spatie\ResponseCache\CacheProfiles\CacheAllSuccessfulGetRequests::class,
+// 'cache_profile' => Spatie\ResponseCache\CacheProfiles\CacheAllRequests::class,
+// 'cache_profile' => \App\Support\CustomCacheProfile::class,
+//'cache_profile' => \App\Support\BrutalCacheProfile::class,
+
+ /*
+ * Optionally, you can specify a header that will force a cache bypass.
+ * This can be useful to monitor the performance of your application.
+ */
+ 'cache_bypass_header' => [
+ 'name' => env('CACHE_BYPASS_HEADER_NAME', null),
+ 'value' => env('CACHE_BYPASS_HEADER_VALUE', null),
+ ],
+
+ /*
+ * When using the default CacheRequestFilter this setting controls the
+ * default number of seconds responses must be cached.
+ */
+ 'cache_lifetime_in_seconds' => (int) env('RESPONSE_CACHE_LIFETIME', 60 * 60 * 24 * 7),
+
+ /*
+ * This setting determines if a http header named with the cache time
+ * should be added to a cached response. This can be handy when
+ * debugging.
+ */
+ 'add_cache_time_header' => true,
+
+ /*
+ * This setting determines the name of the http header that contains
+ * the time at which the response was cached
+ */
+ 'cache_time_header_name' => env('RESPONSE_CACHE_HEADER_NAME', 'laravel-responsecache'),
+
+ /*
+ * This setting determines if a http header named with the cache age
+ * should be added to a cached response. This can be handy when
+ * debugging.
+ * ONLY works when "add_cache_time_header" is also active!
+ */
+ 'add_cache_age_header' => true,
+
+ /*
+ * This setting determines the name of the http header that contains
+ * the age of cache
+ */
+ 'cache_age_header_name' => env('RESPONSE_CACHE_AGE_HEADER_NAME', 'laravel-responsecache-age'),
+
+ /*
+ * Here you may define the cache store that should be used to store
+ * requests. This can be the name of any store that is
+ * configured in app/config/cache.php
+ */
+ 'cache_store' => 'file',
+
+ /*
+ * Here you may define replacers that dynamically replace content from the response.
+ * Each replacer must implement the Replacer interface.
+ */
+ 'replacers' => [
+ \Spatie\ResponseCache\Replacers\CsrfTokenReplacer::class,
+ ],
+
+ /*
+ * If the cache driver you configured supports tags, you may specify a tag name
+ * here. All responses will be tagged. When clearing the responsecache only
+ * items with that tag will be flushed.
+ *
+ * You may use a string or an array here.
+ */
+ 'cache_tag' => '',
+
+ /*
+ * This class is responsible for generating a hash for a request. This hash
+ * is used to look up a cached response.
+ */
+ 'hasher' => \Spatie\ResponseCache\Hasher\DefaultHasher::class,
+
+ /*
+ * This class is responsible for serializing responses.
+ */
+ 'serializer' => \Spatie\ResponseCache\Serializers\DefaultSerializer::class,
+];
diff --git a/config/scout.php b/config/scout.php
new file mode 100755
index 00000000..cc7b8c7e
--- /dev/null
+++ b/config/scout.php
@@ -0,0 +1,218 @@
+ env('SCOUT_DRIVER', 'collection'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Index Prefix
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify a prefix that will be applied to all search index
+ | names used by Scout. This prefix may be useful if you have multiple
+ | "tenants" or applications sharing the same search infrastructure.
+ |
+ */
+
+ 'prefix' => env('SCOUT_PREFIX', ''),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Queue Data Syncing
+ |--------------------------------------------------------------------------
+ |
+ | This option allows you to control if the operations that sync your data
+ | with your search engines are queued. When this is set to "true" then
+ | all automatic data syncing will get queued for better performance.
+ |
+ */
+
+ 'queue' => env('SCOUT_QUEUE', false),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Database Transactions
+ |--------------------------------------------------------------------------
+ |
+ | This configuration option determines if your data will only be synced
+ | with your search indexes after every open database transaction has
+ | been committed, thus preventing any discarded data from syncing.
+ |
+ */
+
+ 'after_commit' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Chunk Sizes
+ |--------------------------------------------------------------------------
+ |
+ | These options allow you to control the maximum chunk size when you are
+ | mass importing data into the search engine. This allows you to fine
+ | tune each of these chunk sizes based on the power of the servers.
+ |
+ */
+
+ 'chunk' => [
+ 'searchable' => 500,
+ 'unsearchable' => 500,
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Soft Deletes
+ |--------------------------------------------------------------------------
+ |
+ | This option allows to control whether to keep soft deleted records in
+ | the search indexes. Maintaining soft deleted records can be useful
+ | if your application still needs to search for the records later.
+ |
+ */
+
+ 'soft_delete' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Identify User
+ |--------------------------------------------------------------------------
+ |
+ | This option allows you to control whether to notify the search engine
+ | of the user performing the search. This is sometimes useful if the
+ | engine supports any analytics based on this application's users.
+ |
+ | Supported engines: "algolia"
+ |
+ */
+
+ 'identify' => env('SCOUT_IDENTIFY', false),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Algolia Configuration
+ |--------------------------------------------------------------------------
+ |
+ | Here you may configure your Algolia settings. Algolia is a cloud hosted
+ | search engine which works great with Scout out of the box. Just plug
+ | in your application ID and admin API key to get started searching.
+ |
+ */
+
+ 'algolia' => [
+ 'id' => env('ALGOLIA_APP_ID', ''),
+ 'secret' => env('ALGOLIA_SECRET', ''),
+ 'index-settings' => [
+ // 'users' => [
+ // 'searchableAttributes' => ['id', 'name', 'email'],
+ // 'attributesForFaceting'=> ['filterOnly(email)'],
+ // ],
+ ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Meilisearch Configuration
+ |--------------------------------------------------------------------------
+ |
+ | Here you may configure your Meilisearch settings. Meilisearch is an open
+ | source search engine with minimal configuration. Below, you can state
+ | the host and key information for your own Meilisearch installation.
+ |
+ | See: https://www.meilisearch.com/docs/learn/configuration/instance_options#all-instance-options
+ |
+ */
+
+ 'meilisearch' => [
+ 'host' => env('MEILISEARCH_HOST', 'http://localhost:7700'),
+ 'key' => env('MEILISEARCH_KEY'),
+ 'index-settings' => [
+ 'articles' => [
+ 'searchableAttributes' => [
+ 'sTitle',
+ 'sTitleSub',
+ 'sCategoryName',
+ 'sContent'
+ ],
+ 'filterableAttributes' => ['iStatus', 'iCategoryId', 'iIsTop'],
+ 'sortableAttributes' => ['updated_at', 'iIsTop'],
+ 'displayedAttributes' => ['*'],
+ ],
+ ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Typesense Configuration
+ |--------------------------------------------------------------------------
+ |
+ | Here you may configure your Typesense settings. Typesense is an open
+ | source search engine using minimal configuration. Below, you will
+ | state the host, key, and schema configuration for the instance.
+ |
+ */
+
+ 'typesense' => [
+ 'client-settings' => [
+ 'api_key' => env('TYPESENSE_API_KEY', 'xyz'),
+ 'nodes' => [
+ [
+ 'host' => env('TYPESENSE_HOST', 'localhost'),
+ 'port' => env('TYPESENSE_PORT', '8108'),
+ 'path' => env('TYPESENSE_PATH', ''),
+ 'protocol' => env('TYPESENSE_PROTOCOL', 'http'),
+ ],
+ ],
+ 'nearest_node' => [
+ 'host' => env('TYPESENSE_HOST', 'localhost'),
+ 'port' => env('TYPESENSE_PORT', '8108'),
+ 'path' => env('TYPESENSE_PATH', ''),
+ 'protocol' => env('TYPESENSE_PROTOCOL', 'http'),
+ ],
+ 'connection_timeout_seconds' => env('TYPESENSE_CONNECTION_TIMEOUT_SECONDS', 2),
+ 'healthcheck_interval_seconds' => env('TYPESENSE_HEALTHCHECK_INTERVAL_SECONDS', 30),
+ 'num_retries' => env('TYPESENSE_NUM_RETRIES', 3),
+ 'retry_interval_seconds' => env('TYPESENSE_RETRY_INTERVAL_SECONDS', 1),
+ ],
+ // 'max_total_results' => env('TYPESENSE_MAX_TOTAL_RESULTS', 1000),
+ 'model-settings' => [
+ // User::class => [
+ // 'collection-schema' => [
+ // 'fields' => [
+ // [
+ // 'name' => 'id',
+ // 'type' => 'string',
+ // ],
+ // [
+ // 'name' => 'name',
+ // 'type' => 'string',
+ // ],
+ // [
+ // 'name' => 'created_at',
+ // 'type' => 'int64',
+ // ],
+ // ],
+ // 'default_sorting_field' => 'created_at',
+ // ],
+ // 'search-parameters' => [
+ // 'query_by' => 'name'
+ // ],
+ // ],
+ ],
+ 'import_action' => env('TYPESENSE_IMPORT_ACTION', 'upsert'),
+ ],
+
+];
diff --git a/config/services.php b/config/services.php
new file mode 100755
index 00000000..6a90eb83
--- /dev/null
+++ b/config/services.php
@@ -0,0 +1,38 @@
+ [
+ 'key' => env('POSTMARK_API_KEY'),
+ ],
+
+ 'resend' => [
+ 'key' => env('RESEND_API_KEY'),
+ ],
+
+ 'ses' => [
+ 'key' => env('AWS_ACCESS_KEY_ID'),
+ 'secret' => env('AWS_SECRET_ACCESS_KEY'),
+ 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
+ ],
+
+ 'slack' => [
+ 'notifications' => [
+ 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'),
+ 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'),
+ ],
+ ],
+
+];
diff --git a/config/session.php b/config/session.php
new file mode 100755
index 00000000..5b541b75
--- /dev/null
+++ b/config/session.php
@@ -0,0 +1,217 @@
+ env('SESSION_DRIVER', 'database'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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 expire immediately when the browser is closed then you may
+ | indicate that via the expire_on_close configuration option.
+ |
+ */
+
+ 'lifetime' => (int) env('SESSION_LIFETIME', 120),
+
+ 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Encryption
+ |--------------------------------------------------------------------------
+ |
+ | This option allows you to easily specify that all of your session data
+ | should be encrypted before it's stored. All encryption is performed
+ | automatically by Laravel and you may use the session like normal.
+ |
+ */
+
+ 'encrypt' => env('SESSION_ENCRYPT', false),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session File Location
+ |--------------------------------------------------------------------------
+ |
+ | When utilizing the "file" session driver, the session files are placed
+ | on disk. The default storage location is defined here; however, you
+ | are free to provide another location where they should be stored.
+ |
+ */
+
+ '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 to
+ | be used to store sessions. Of course, a sensible default is defined
+ | for you; however, you're welcome to change this to another table.
+ |
+ */
+
+ 'table' => env('SESSION_TABLE', 'sessions'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Cache Store
+ |--------------------------------------------------------------------------
+ |
+ | When using one of the framework's cache driven session backends, you may
+ | define the cache store which should be used to store the session data
+ | between requests. This must match one of your defined cache stores.
+ |
+ | Affects: "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 session cookie that is created by
+ | the framework. Typically, you should not need to change this value
+ | since doing so does not grant a meaningful security improvement.
+ |
+ */
+
+ 'cookie' => env(
+ 'SESSION_COOKIE',
+ Str::slug((string) 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're free to change this when necessary.
+ |
+ */
+
+ 'path' => env('SESSION_PATH', '/'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Cookie Domain
+ |--------------------------------------------------------------------------
+ |
+ | This value determines the domain and subdomains the session cookie is
+ | available to. By default, the cookie will be available to the root
+ | domain without subdomains. Typically, this shouldn't be changed.
+ |
+ */
+
+ '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. It's unlikely you should disable this option.
+ |
+ */
+
+ 'http_only' => env('SESSION_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" to permit secure cross-site requests.
+ |
+ | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value
+ |
+ | Supported: "lax", "strict", "none", null
+ |
+ */
+
+ 'same_site' => env('SESSION_SAME_SITE', 'lax'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Partitioned Cookies
+ |--------------------------------------------------------------------------
+ |
+ | Setting this value to true will tie the cookie to the top-level site for
+ | a cross-site context. Partitioned cookies are accepted by the browser
+ | when flagged "secure" and the Same-Site attribute is set to "none".
+ |
+ */
+
+ 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false),
+
+];
diff --git a/database/.gitignore b/database/.gitignore
new file mode 100755
index 00000000..9b19b93c
--- /dev/null
+++ b/database/.gitignore
@@ -0,0 +1 @@
+*.sqlite*
diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php
new file mode 100755
index 00000000..584104c9
--- /dev/null
+++ b/database/factories/UserFactory.php
@@ -0,0 +1,44 @@
+
+ */
+class UserFactory extends Factory
+{
+ /**
+ * The current password being used by the factory.
+ */
+ protected static ?string $password;
+
+ /**
+ * 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' => static::$password ??= Hash::make('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/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php
new file mode 100755
index 00000000..6b901f8b
--- /dev/null
+++ b/database/seeders/DatabaseSeeder.php
@@ -0,0 +1,25 @@
+create();
+
+ User::factory()->create([
+ 'name' => 'Test User',
+ 'email' => 'test@example.com',
+ ]);
+ }
+}
diff --git a/laji/a7edd6b036ef4b8e7cd93f435386d4da.js b/laji/a7edd6b036ef4b8e7cd93f435386d4da.js
new file mode 100755
index 00000000..5cc393d0
--- /dev/null
+++ b/laji/a7edd6b036ef4b8e7cd93f435386d4da.js
@@ -0,0 +1,19555 @@
+/*! jQuery Migrate v3.4.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+"undefined" == typeof jQuery.migrateMute && (jQuery.migrateMute = !0),
+function(t) {
+ "use strict";
+ "function" == typeof define && define.amd ? define(["jquery"], function(e) {
+ return t(e, window)
+ }) : "object" == typeof module && module.exports ? module.exports = t(require("jquery"), window) : t(jQuery, window)
+}(function(s, n) {
+ "use strict";
+ function e(e) {
+ return 0 <= function(e, t) {
+ for (var r = /^(\d+)\.(\d+)\.(\d+)/, n = r.exec(e) || [], o = r.exec(t) || [], a = 1; a <= 3; a++) {
+ if (+o[a] < +n[a])
+ return 1;
+ if (+n[a] < +o[a])
+ return -1
+ }
+ return 0
+ }(s.fn.jquery, e)
+ }
+ s.migrateVersion = "3.4.1";
+ var t = Object.create(null);
+ s.migrateDisablePatches = function() {
+ for (var e = 0; e < arguments.length; e++)
+ t[arguments[e]] = !0
+ },
+ s.migrateEnablePatches = function() {
+ for (var e = 0; e < arguments.length; e++)
+ delete t[arguments[e]]
+ },
+ s.migrateIsPatchEnabled = function(e) {
+ return !t[e]
+ },
+ n.console && n.console.log && (s && e("3.0.0") && !e("5.0.0") || n.console.log("JQMIGRATE: jQuery 3.x-4.x REQUIRED"), s.migrateWarnings && n.console.log("JQMIGRATE: Migrate plugin loaded multiple times"), n.console.log("JQMIGRATE: Migrate is installed" + (s.migrateMute ? "" : " with logging active") + ", version " + s.migrateVersion));
+ var o = {};
+ function u(e, t) {
+ var r = n.console;
+ !s.migrateIsPatchEnabled(e) || s.migrateDeduplicateWarnings && o[t] || (o[t] = !0, s.migrateWarnings.push(t + " [" + e + "]"), r && r.warn && !s.migrateMute && (r.warn("JQMIGRATE: " + t), s.migrateTrace && r.trace && r.trace()))
+ }
+ function r(e, t, r, n, o) {
+ Object.defineProperty(e, t, {
+ configurable: !0,
+ enumerable: !0,
+ get: function() {
+ return u(n, o), r
+ },
+ set: function(e) {
+ u(n, o),
+ r = e
+ }
+ })
+ }
+ function a(e, t, r, n, o) {
+ var a = e[t];
+ e[t] = function() {
+ return o && u(n, o), (s.migrateIsPatchEnabled(n) ? r : a || s.noop).apply(this, arguments)
+ }
+ }
+ function c(e, t, r, n, o) {
+ if (!o)
+ throw new Error("No warning message provided");
+ return a(e, t, r, n, o), 0
+ }
+ function i(e, t, r, n) {
+ return a(e, t, r, n), 0
+ }
+ s.migrateDeduplicateWarnings = !0,
+ s.migrateWarnings = [],
+ void 0 === s.migrateTrace && (s.migrateTrace = !0),
+ s.migrateReset = function() {
+ o = {},
+ s.migrateWarnings.length = 0
+ },
+ "BackCompat" === n.document.compatMode && u("quirks", "jQuery is not compatible with Quirks Mode");
+ var d,
+ l,
+ p,
+ f = {},
+ m = s.fn.init,
+ y = s.find,
+ h = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,
+ g = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g,
+ v = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;
+ for (d in i(s.fn, "init", function(e) {
+ var t = Array.prototype.slice.call(arguments);
+ return s.migrateIsPatchEnabled("selector-empty-id") && "string" == typeof e && "#" === e && (u("selector-empty-id", "jQuery( '#' ) is not a valid selector"), t[0] = []), m.apply(this, t)
+ }, "selector-empty-id"), s.fn.init.prototype = s.fn, i(s, "find", function(t) {
+ var r = Array.prototype.slice.call(arguments);
+ if ("string" == typeof t && h.test(t))
+ try {
+ n.document.querySelector(t)
+ } catch (e) {
+ t = t.replace(g, function(e, t, r, n) {
+ return "[" + t + r + '"' + n + '"]'
+ });
+ try {
+ n.document.querySelector(t),
+ u("selector-hash", "Attribute selector with '#' must be quoted: " + r[0]),
+ r[0] = t
+ } catch (e) {
+ u("selector-hash", "Attribute selector with '#' was not fixed: " + r[0])
+ }
+ }
+ return y.apply(this, r)
+ }, "selector-hash"), y)
+ Object.prototype.hasOwnProperty.call(y, d) && (s.find[d] = y[d]);
+ c(s.fn, "size", function() {
+ return this.length
+ }, "size", "jQuery.fn.size() is deprecated and removed; use the .length property"),
+ c(s, "parseJSON", function() {
+ return JSON.parse.apply(null, arguments)
+ }, "parseJSON", "jQuery.parseJSON is deprecated; use JSON.parse"),
+ c(s, "holdReady", s.holdReady, "holdReady", "jQuery.holdReady is deprecated"),
+ c(s, "unique", s.uniqueSort, "unique", "jQuery.unique is deprecated; use jQuery.uniqueSort"),
+ r(s.expr, "filters", s.expr.pseudos, "expr-pre-pseudos", "jQuery.expr.filters is deprecated; use jQuery.expr.pseudos"),
+ r(s.expr, ":", s.expr.pseudos, "expr-pre-pseudos", "jQuery.expr[':'] is deprecated; use jQuery.expr.pseudos"),
+ e("3.1.1") && c(s, "trim", function(e) {
+ return null == e ? "" : (e + "").replace(v, "$1")
+ }, "trim", "jQuery.trim is deprecated; use String.prototype.trim"),
+ e("3.2.0") && (c(s, "nodeName", function(e, t) {
+ return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase()
+ }, "nodeName", "jQuery.nodeName is deprecated"), c(s, "isArray", Array.isArray, "isArray", "jQuery.isArray is deprecated; use Array.isArray")),
+ e("3.3.0") && (c(s, "isNumeric", function(e) {
+ var t = typeof e;
+ return ("number" == t || "string" == t) && !isNaN(e - parseFloat(e))
+ }, "isNumeric", "jQuery.isNumeric() is deprecated"), s.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function(e, t) {
+ f["[object " + t + "]"] = t.toLowerCase()
+ }), c(s, "type", function(e) {
+ return null == e ? e + "" : "object" == typeof e || "function" == typeof e ? f[Object.prototype.toString.call(e)] || "object" : typeof e
+ }, "type", "jQuery.type is deprecated"), c(s, "isFunction", function(e) {
+ return "function" == typeof e
+ }, "isFunction", "jQuery.isFunction() is deprecated"), c(s, "isWindow", function(e) {
+ return null != e && e === e.window
+ }, "isWindow", "jQuery.isWindow() is deprecated")),
+ s.ajax && (l = s.ajax, p = /(=)\?(?=&|$)|\?\?/, i(s, "ajax", function() {
+ var e = l.apply(this, arguments);
+ return e.promise && (c(e, "success", e.done, "jqXHR-methods", "jQXHR.success is deprecated and removed"), c(e, "error", e.fail, "jqXHR-methods", "jQXHR.error is deprecated and removed"), c(e, "complete", e.always, "jqXHR-methods", "jQXHR.complete is deprecated and removed")), e
+ }, "jqXHR-methods"), e("4.0.0") || s.ajaxPrefilter("+json", function(e) {
+ !1 !== e.jsonp && (p.test(e.url) || "string" == typeof e.data && 0 === (e.contentType || "").indexOf("application/x-www-form-urlencoded") && p.test(e.data)) && u("jsonp-promotion", "JSON-to-JSONP auto-promotion is deprecated")
+ }));
+ var j = s.fn.removeAttr,
+ b = s.fn.toggleClass,
+ w = /\S+/g;
+ function x(e) {
+ return e.replace(/-([a-z])/g, function(e, t) {
+ return t.toUpperCase()
+ })
+ }
+ i(s.fn, "removeAttr", function(e) {
+ var r = this,
+ n = !1;
+ return s.each(e.match(w), function(e, t) {
+ s.expr.match.bool.test(t) && r.each(function() {
+ if (!1 !== s(this).prop(t))
+ return !(n = !0)
+ }),
+ n && (u("removeAttr-bool", "jQuery.fn.removeAttr no longer sets boolean properties: " + t), r.prop(t, !1))
+ }), j.apply(this, arguments)
+ }, "removeAttr-bool"),
+ i(s.fn, "toggleClass", function(t) {
+ return void 0 !== t && "boolean" != typeof t ? b.apply(this, arguments) : (u("toggleClass-bool", "jQuery.fn.toggleClass( boolean ) is deprecated"), this.each(function() {
+ var e = this.getAttribute && this.getAttribute("class") || "";
+ e && s.data(this, "__className__", e),
+ this.setAttribute && this.setAttribute("class", !e && !1 !== t && s.data(this, "__className__") || "")
+ }))
+ }, "toggleClass-bool");
+ var Q,
+ A,
+ R = !1,
+ C = /^[a-z]/,
+ N = /^(?:Border(?:Top|Right|Bottom|Left)?(?:Width|)|(?:Margin|Padding)?(?:Top|Right|Bottom|Left)?|(?:Min|Max)?(?:Width|Height))$/;
+ s.swap && s.each(["height", "width", "reliableMarginRight"], function(e, t) {
+ var r = s.cssHooks[t] && s.cssHooks[t].get;
+ r && (s.cssHooks[t].get = function() {
+ var e;
+ return R = !0, e = r.apply(this, arguments), R = !1, e
+ })
+ }),
+ i(s, "swap", function(e, t, r, n) {
+ var o,
+ a,
+ i = {};
+ for (a in R || u("swap", "jQuery.swap() is undocumented and deprecated"), t)
+ i[a] = e.style[a],
+ e.style[a] = t[a];
+ for (a in o = r.apply(e, n || []), t)
+ e.style[a] = i[a];
+ return o
+ }, "swap"),
+ e("3.4.0") && "undefined" != typeof Proxy && (s.cssProps = new Proxy(s.cssProps || {}, {
+ set: function() {
+ return u("cssProps", "jQuery.cssProps is deprecated"), Reflect.set.apply(this, arguments)
+ }
+ })),
+ e("4.0.0") ? (A = {
+ animationIterationCount: !0,
+ columnCount: !0,
+ fillOpacity: !0,
+ flexGrow: !0,
+ flexShrink: !0,
+ fontWeight: !0,
+ gridArea: !0,
+ gridColumn: !0,
+ gridColumnEnd: !0,
+ gridColumnStart: !0,
+ gridRow: !0,
+ gridRowEnd: !0,
+ gridRowStart: !0,
+ lineHeight: !0,
+ opacity: !0,
+ order: !0,
+ orphans: !0,
+ widows: !0,
+ zIndex: !0,
+ zoom: !0
+ }, "undefined" != typeof Proxy ? s.cssNumber = new Proxy(A, {
+ get: function() {
+ return u("css-number", "jQuery.cssNumber is deprecated"), Reflect.get.apply(this, arguments)
+ },
+ set: function() {
+ return u("css-number", "jQuery.cssNumber is deprecated"), Reflect.set.apply(this, arguments)
+ }
+ }) : s.cssNumber = A) : A = s.cssNumber,
+ Q = s.fn.css,
+ i(s.fn, "css", function(e, t) {
+ var r,
+ n,
+ o = this;
+ return e && "object" == typeof e && !Array.isArray(e) ? (s.each(e, function(e, t) {
+ s.fn.css.call(o, e, t)
+ }), this) : ("number" == typeof t && (r = x(e), n = r, C.test(n) && N.test(n[0].toUpperCase() + n.slice(1)) || A[r] || u("css-number", 'Number-typed values are deprecated for jQuery.fn.css( "' + e + '", value )')), Q.apply(this, arguments))
+ }, "css-number");
+ var S,
+ P,
+ k,
+ H,
+ E = s.data;
+ i(s, "data", function(e, t, r) {
+ var n,
+ o,
+ a;
+ if (t && "object" == typeof t && 2 === arguments.length) {
+ for (a in n = s.hasData(e) && E.call(this, e), o = {}, t)
+ a !== x(a) ? (u("data-camelCase", "jQuery.data() always sets/gets camelCased names: " + a), n[a] = t[a]) : o[a] = t[a];
+ return E.call(this, e, o), t
+ }
+ return t && "string" == typeof t && t !== x(t) && (n = s.hasData(e) && E.call(this, e)) && t in n ? (u("data-camelCase", "jQuery.data() always sets/gets camelCased names: " + t), 2 < arguments.length && (n[t] = r), n[t]) : E.apply(this, arguments)
+ }, "data-camelCase"),
+ s.fx && (k = s.Tween.prototype.run, H = function(e) {
+ return e
+ }, i(s.Tween.prototype, "run", function() {
+ 1 < s.easing[this.easing].length && (u("easing-one-arg", "'jQuery.easing." + this.easing.toString() + "' should use only one argument"), s.easing[this.easing] = H),
+ k.apply(this, arguments)
+ }, "easing-one-arg"), S = s.fx.interval, P = "jQuery.fx.interval is deprecated", n.requestAnimationFrame && Object.defineProperty(s.fx, "interval", {
+ configurable: !0,
+ enumerable: !0,
+ get: function() {
+ return n.document.hidden || u("fx-interval", P), s.migrateIsPatchEnabled("fx-interval") && void 0 === S ? 13 : S
+ },
+ set: function(e) {
+ u("fx-interval", P),
+ S = e
+ }
+ }));
+ var M = s.fn.load,
+ q = s.event.add,
+ O = s.event.fix;
+ s.event.props = [],
+ s.event.fixHooks = {},
+ r(s.event.props, "concat", s.event.props.concat, "event-old-patch", "jQuery.event.props.concat() is deprecated and removed"),
+ i(s.event, "fix", function(e) {
+ var t,
+ r = e.type,
+ n = this.fixHooks[r],
+ o = s.event.props;
+ if (o.length) {
+ u("event-old-patch", "jQuery.event.props are deprecated and removed: " + o.join());
+ while (o.length)
+ s.event.addProp(o.pop())
+ }
+ if (n && !n._migrated_ && (n._migrated_ = !0, u("event-old-patch", "jQuery.event.fixHooks are deprecated and removed: " + r), (o = n.props) && o.length))
+ while (o.length)
+ s.event.addProp(o.pop());
+ return t = O.call(this, e), n && n.filter ? n.filter(t, e) : t
+ }, "event-old-patch"),
+ i(s.event, "add", function(e, t) {
+ return e === n && "load" === t && "complete" === n.document.readyState && u("load-after-event", "jQuery(window).on('load'...) called after load event occurred"), q.apply(this, arguments)
+ }, "load-after-event"),
+ s.each(["load", "unload", "error"], function(e, t) {
+ i(s.fn, t, function() {
+ var e = Array.prototype.slice.call(arguments, 0);
+ return "load" === t && "string" == typeof e[0] ? M.apply(this, e) : (u("shorthand-removed-v3", "jQuery.fn." + t + "() is deprecated"), e.splice(0, 0, t), arguments.length ? this.on.apply(this, e) : (this.triggerHandler.apply(this, e), this))
+ }, "shorthand-removed-v3")
+ }),
+ s.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "), function(e, r) {
+ c(s.fn, r, function(e, t) {
+ return 0 < arguments.length ? this.on(r, null, e, t) : this.trigger(r)
+ }, "shorthand-deprecated-v3", "jQuery.fn." + r + "() event shorthand is deprecated")
+ }),
+ s(function() {
+ s(n.document).triggerHandler("ready")
+ }),
+ s.event.special.ready = {
+ setup: function() {
+ this === n.document && u("ready-event", "'ready' event is deprecated")
+ }
+ },
+ c(s.fn, "bind", function(e, t, r) {
+ return this.on(e, null, t, r)
+ }, "pre-on-methods", "jQuery.fn.bind() is deprecated"),
+ c(s.fn, "unbind", function(e, t) {
+ return this.off(e, null, t)
+ }, "pre-on-methods", "jQuery.fn.unbind() is deprecated"),
+ c(s.fn, "delegate", function(e, t, r, n) {
+ return this.on(t, e, r, n)
+ }, "pre-on-methods", "jQuery.fn.delegate() is deprecated"),
+ c(s.fn, "undelegate", function(e, t, r) {
+ return 1 === arguments.length ? this.off(e, "**") : this.off(t, e || "**", r)
+ }, "pre-on-methods", "jQuery.fn.undelegate() is deprecated"),
+ c(s.fn, "hover", function(e, t) {
+ return this.on("mouseenter", e).on("mouseleave", t || e)
+ }, "pre-on-methods", "jQuery.fn.hover() is deprecated");
+ function T(e) {
+ var t = n.document.implementation.createHTMLDocument("");
+ return t.body.innerHTML = e, t.body && t.body.innerHTML
+ }
+ var F = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi;
+ s.UNSAFE_restoreLegacyHtmlPrefilter = function() {
+ s.migrateEnablePatches("self-closed-tags")
+ },
+ i(s, "htmlPrefilter", function(e) {
+ var t,
+ r;
+ return (r = (t = e).replace(F, "<$1>$2>")) !== t && T(t) !== T(r) && u("self-closed-tags", "HTML tags must be properly nested and closed: " + t), e.replace(F, "<$1>$2>")
+ }, "self-closed-tags"),
+ s.migrateDisablePatches("self-closed-tags");
+ var D,
+ W,
+ _,
+ I = s.fn.offset;
+ return i(s.fn, "offset", function() {
+ var e = this[0];
+ return !e || e.nodeType && e.getBoundingClientRect ? I.apply(this, arguments) : (u("offset-valid-elem", "jQuery.fn.offset() requires a valid DOM element"), arguments.length ? this : void 0)
+ }, "offset-valid-elem"), s.ajax && (D = s.param, i(s, "param", function(e, t) {
+ var r = s.ajaxSettings && s.ajaxSettings.traditional;
+ return void 0 === t && r && (u("param-ajax-traditional", "jQuery.param() no longer uses jQuery.ajaxSettings.traditional"), t = r), D.call(this, e, t)
+ }, "param-ajax-traditional")), c(s.fn, "andSelf", s.fn.addBack, "andSelf", "jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()"), s.Deferred && (W = s.Deferred, _ = [["resolve", "done", s.Callbacks("once memory"), s.Callbacks("once memory"), "resolved"], ["reject", "fail", s.Callbacks("once memory"), s.Callbacks("once memory"), "rejected"], ["notify", "progress", s.Callbacks("memory"), s.Callbacks("memory")]], i(s, "Deferred", function(e) {
+ var a = W(),
+ i = a.promise();
+ function t() {
+ var o = arguments;
+ return s.Deferred(function(n) {
+ s.each(_, function(e, t) {
+ var r = "function" == typeof o[e] && o[e];
+ a[t[1]](function() {
+ var e = r && r.apply(this, arguments);
+ e && "function" == typeof e.promise ? e.promise().done(n.resolve).fail(n.reject).progress(n.notify) : n[t[0] + "With"](this === i ? n.promise() : this, r ? [e] : arguments)
+ })
+ }),
+ o = null
+ }).promise()
+ }
+ return c(a, "pipe", t, "deferred-pipe", "deferred.pipe() is deprecated"), c(i, "pipe", t, "deferred-pipe", "deferred.pipe() is deprecated"), e && e.call(a, a), a
+ }, "deferred-pipe"), s.Deferred.exceptionHook = W.exceptionHook), s
+});
+;
+(() => {
+ var We = !1,
+ Ge = !1,
+ B = [];
+ function $t(e) {
+ an(e)
+ }
+ function an(e) {
+ B.includes(e) || B.push(e),
+ cn()
+ }
+ function he(e) {
+ let t = B.indexOf(e);
+ t !== -1 && B.splice(t, 1)
+ }
+ function cn() {
+ !Ge && !We && (We = !0, queueMicrotask(ln))
+ }
+ function ln() {
+ We = !1,
+ Ge = !0;
+ for (let e = 0; e < B.length; e++)
+ B[e]();
+ B.length = 0,
+ Ge = !1
+ }
+ var A,
+ K,
+ Y,
+ Ye,
+ Je = !0;
+ function Lt(e) {
+ Je = !1,
+ e(),
+ Je = !0
+ }
+ function jt(e) {
+ A = e.reactive,
+ Y = e.release,
+ K = t => e.effect(t, {
+ scheduler: r => {
+ Je ? $t(r) : r()
+ }
+ }),
+ Ye = e.raw
+ }
+ function Ze(e) {
+ K = e
+ }
+ function Ft(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 Bt = [],
+ Kt = [],
+ zt = [];
+ function Vt(e) {
+ zt.push(e)
+ }
+ function _e(e, t) {
+ typeof t == "function" ? (e._x_cleanups || (e._x_cleanups = []), e._x_cleanups.push(t)) : (t = e, Kt.push(t))
+ }
+ function Ht(e) {
+ Bt.push(e)
+ }
+ function qt(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 fn() {
+ un(),
+ et.disconnect(),
+ tt = !1
+ }
+ var te = [],
+ nt = !1;
+ function un() {
+ te = te.concat(et.takeRecords()),
+ te.length && !nt && (nt = !0, queueMicrotask(() => {
+ dn(),
+ nt = !1
+ }))
+ }
+ function dn() {
+ Xe(te),
+ te.length = 0
+ }
+ function m(e) {
+ if (!tt)
+ return e();
+ fn();
+ let t = e();
+ return rt(), t
+ }
+ var it = !1,
+ ge = [];
+ function Ut() {
+ it = !0
+ }
+ function Wt() {
+ 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; o < e.length; o++)
+ if (!e[o].target._x_ignoreMutationObserver && (e[o].type === "childList" && (e[o].addedNodes.forEach(s => s.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) => {
+ Bt.forEach(a => a(s, o))
+ });
+ for (let o of r)
+ if (!t.includes(o) && (Kt.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, zt.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 D(k(e))
+ }
+ function C(e, t, r) {
+ return e._x_dataStack = [t, ...k(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 k(e) {
+ return e._x_dataStack ? e._x_dataStack : typeof ShadowRoot == "function" && e instanceof ShadowRoot ? k(e.host) : e.parentNode ? k(e.parentNode) : []
+ }
+ function D(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, () => pn(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 pn(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 Gt = {};
+ function x(e, t) {
+ Gt[e] = t
+ }
+ function re(e, t) {
+ return Object.entries(Gt).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 Yt(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 Jt(e) {
+ let t = ve;
+ ve = !1,
+ e(),
+ ve = t
+ }
+ function P(e, t, r={}) {
+ let n;
+ return g(e, t)(i => n = i, r), n
+ }
+ function g(...e) {
+ return Zt(...e)
+ }
+ var Zt = ct;
+ function Qt(e) {
+ Zt = e
+ }
+ function ct(e, t) {
+ let r = {};
+ re(r, e);
+ let n = [r, ...k(e)];
+ if (typeof t == "function")
+ return mn(n, t);
+ let i = hn(n, t, e);
+ return Yt.bind(null, e, t, i)
+ }
+ function mn(e, t) {
+ return (r=() => {}, {scope: n={}, params: i=[]}={}) => {
+ let o = t.apply(D([n, ...e]), i);
+ we(r, o)
+ }
+ }
+ var lt = {};
+ function _n(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 hn(e, t, r) {
+ let n = _n(t, r);
+ return (i=() => {}, {scope: o={}, params: s=[]}={}) => {
+ n.result = void 0,
+ n.finished = !1;
+ let a = D([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 Xt(e) {
+ ut = e
+ }
+ var er = {};
+ function d(e, t) {
+ er[e] = t
+ }
+ function ne(e, t, r) {
+ if (t = Array.from(t), e._x_virtualDirectives) {
+ let o = Object.entries(e._x_virtualDirectives).map(([a, c]) => ({
+ name: a,
+ value: c
+ })),
+ s = ft(o);
+ o = o.map(a => s.find(c => c.name === a.name) ? {
+ name: `x-bind:${a.name}`,
+ value: `"${a.value}"`
+ } : a),
+ t = t.concat(o)
+ }
+ let n = {};
+ return t.map(tr((o, s) => n[o] = s)).filter(rr).map(xn(n, r)).sort(yn).map(o => gn(e, o))
+ }
+ function ft(e) {
+ return Array.from(e).map(tr()).filter(t => !rr(t))
+ }
+ var dt = !1,
+ ie = new Map,
+ nr = Symbol();
+ function ir(e) {
+ dt = !0;
+ let t = Symbol();
+ nr = t,
+ ie.set(t, []);
+ let r = () => {
+ for (; ie.get(t).length;)
+ ie.get(t).shift()();
+ ie.delete(t)
+ },
+ n = () => {
+ dt = !1,
+ r()
+ };
+ e(r),
+ n()
+ }
+ function at(e) {
+ let t = [],
+ r = a => t.push(a),
+ [n, i] = Ft(e);
+ return t.push(i), [{
+ Alpine: I,
+ effect: n,
+ cleanup: r,
+ evaluateLater: g.bind(g, e),
+ evaluate: P.bind(P, e)
+ }, () => t.forEach(a => a())]
+ }
+ function gn(e, t) {
+ let r = () => {},
+ n = er[t.type] || r,
+ [i, o] = at(e);
+ qt(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), dt ? ie.get(nr).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 tr(e=() => {}) {
+ return ({name: t, value: r}) => {
+ let {name: n, value: i} = or.reduce((o, s) => s(o), {
+ name: t,
+ value: r
+ });
+ return n !== t && e(n, t), {
+ name: n,
+ value: i
+ }
+ }
+ }
+ var or = [];
+ function Z(e) {
+ or.push(e)
+ }
+ function rr({name: e}) {
+ return sr().test(e)
+ }
+ var sr = () => new RegExp(`^${ut}([^:^.]+)\\b`);
+ function xn(e, t) {
+ return ({name: r, value: n}) => {
+ let i = r.match(sr()),
+ 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 pt = "DEFAULT",
+ Ae = ["ignore", "ref", "data", "id", "radio", "tabs", "switch", "disclosure", "menu", "listbox", "list", "item", "combobox", "bind", "init", "for", "mask", "model", "modelable", "transition", "show", "if", pt, "teleport"];
+ function yn(e, t) {
+ let r = Ae.indexOf(e.type) === -1 ? pt : e.type,
+ n = Ae.indexOf(t.type) === -1 ? pt : t.type;
+ return Ae.indexOf(r) - Ae.indexOf(n)
+ }
+ function z(e, t, r={}) {
+ e.dispatchEvent(new CustomEvent(t, {
+ detail: r,
+ bubbles: !0,
+ composed: !0,
+ cancelable: !0
+ }))
+ }
+ var mt = [],
+ ht = !1;
+ function Te(e=() => {}) {
+ return queueMicrotask(() => {
+ ht || setTimeout(() => {
+ Oe()
+ })
+ }), new Promise(t => {
+ mt.push(() => {
+ e(),
+ t()
+ })
+ })
+ }
+ function Oe() {
+ for (ht = !1; mt.length;)
+ mt.shift()()
+ }
+ function ar() {
+ ht = !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 lr() {
+ document.body || O("Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's `
+
+
+
+
diff --git a/package-lock.json b/package-lock.json
new file mode 100755
index 00000000..f994cd06
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,2533 @@
+{
+ "name": "fn-b.loc",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "dependencies": {
+ "@fortawesome/fontawesome-free": "^7.1.0",
+ "@popperjs/core": "^2.11.8",
+ "bootstrap": "^5.3.8",
+ "clipboard": "^2.0.11",
+ "infinite-scroll": "^5.0.0",
+ "jquery": "^4.0.0"
+ },
+ "devDependencies": {
+ "@tailwindcss/vite": "^4.0.0",
+ "axios": "^1.11.0",
+ "concurrently": "^9.0.1",
+ "laravel-vite-plugin": "^2.0.0",
+ "tailwindcss": "^4.0.0",
+ "vite": "^7.0.7"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz",
+ "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz",
+ "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz",
+ "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz",
+ "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz",
+ "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz",
+ "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz",
+ "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz",
+ "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz",
+ "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz",
+ "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz",
+ "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz",
+ "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz",
+ "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz",
+ "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz",
+ "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz",
+ "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz",
+ "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz",
+ "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz",
+ "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz",
+ "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz",
+ "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz",
+ "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz",
+ "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz",
+ "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz",
+ "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz",
+ "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@fortawesome/fontawesome-free": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.1.0.tgz",
+ "integrity": "sha512-+WxNld5ZCJHvPQCr/GnzCTVREyStrAJjisUPtUxG5ngDA8TMlPnKp6dddlTpai4+1GNmltAeuk1hJEkBohwZYA==",
+ "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@popperjs/core": {
+ "version": "2.11.8",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
+ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.56.0.tgz",
+ "integrity": "sha512-LNKIPA5k8PF1+jAFomGe3qN3bbIgJe/IlpDBwuVjrDKrJhVWywgnJvflMt/zkbVNLFtF1+94SljYQS6e99klnw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.56.0.tgz",
+ "integrity": "sha512-lfbVUbelYqXlYiU/HApNMJzT1E87UPGvzveGg2h0ktUNlOCxKlWuJ9jtfvs1sKHdwU4fzY7Pl8sAl49/XaEk6Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.56.0.tgz",
+ "integrity": "sha512-EgxD1ocWfhoD6xSOeEEwyE7tDvwTgZc8Bss7wCWe+uc7wO8G34HHCUH+Q6cHqJubxIAnQzAsyUsClt0yFLu06w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.56.0.tgz",
+ "integrity": "sha512-1vXe1vcMOssb/hOF8iv52A7feWW2xnu+c8BV4t1F//m9QVLTfNVpEdja5ia762j/UEJe2Z1jAmEqZAK42tVW3g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.56.0.tgz",
+ "integrity": "sha512-bof7fbIlvqsyv/DtaXSck4VYQ9lPtoWNFCB/JY4snlFuJREXfZnm+Ej6yaCHfQvofJDXLDMTVxWscVSuQvVWUQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.56.0.tgz",
+ "integrity": "sha512-KNa6lYHloW+7lTEkYGa37fpvPq+NKG/EHKM8+G/g9WDU7ls4sMqbVRV78J6LdNuVaeeK5WB9/9VAFbKxcbXKYg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.56.0.tgz",
+ "integrity": "sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.56.0.tgz",
+ "integrity": "sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.56.0.tgz",
+ "integrity": "sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.56.0.tgz",
+ "integrity": "sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.56.0.tgz",
+ "integrity": "sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.56.0.tgz",
+ "integrity": "sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.56.0.tgz",
+ "integrity": "sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.56.0.tgz",
+ "integrity": "sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.56.0.tgz",
+ "integrity": "sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.56.0.tgz",
+ "integrity": "sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.56.0.tgz",
+ "integrity": "sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.56.0.tgz",
+ "integrity": "sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.56.0.tgz",
+ "integrity": "sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.56.0.tgz",
+ "integrity": "sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.56.0.tgz",
+ "integrity": "sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.56.0.tgz",
+ "integrity": "sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.56.0.tgz",
+ "integrity": "sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.56.0.tgz",
+ "integrity": "sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.56.0.tgz",
+ "integrity": "sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@tailwindcss/node": {
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz",
+ "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.4",
+ "enhanced-resolve": "^5.18.3",
+ "jiti": "^2.6.1",
+ "lightningcss": "1.30.2",
+ "magic-string": "^0.30.21",
+ "source-map-js": "^1.2.1",
+ "tailwindcss": "4.1.18"
+ }
+ },
+ "node_modules/@tailwindcss/oxide": {
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz",
+ "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ },
+ "optionalDependencies": {
+ "@tailwindcss/oxide-android-arm64": "4.1.18",
+ "@tailwindcss/oxide-darwin-arm64": "4.1.18",
+ "@tailwindcss/oxide-darwin-x64": "4.1.18",
+ "@tailwindcss/oxide-freebsd-x64": "4.1.18",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.1.18",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.1.18",
+ "@tailwindcss/oxide-linux-x64-musl": "4.1.18",
+ "@tailwindcss/oxide-wasm32-wasi": "4.1.18",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.1.18"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-android-arm64": {
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz",
+ "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-arm64": {
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz",
+ "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-x64": {
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz",
+ "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-freebsd-x64": {
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz",
+ "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz",
+ "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz",
+ "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz",
+ "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz",
+ "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-musl": {
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz",
+ "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi": {
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz",
+ "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==",
+ "bundleDependencies": [
+ "@napi-rs/wasm-runtime",
+ "@emnapi/core",
+ "@emnapi/runtime",
+ "@tybys/wasm-util",
+ "@emnapi/wasi-threads",
+ "tslib"
+ ],
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.7.1",
+ "@emnapi/runtime": "^1.7.1",
+ "@emnapi/wasi-threads": "^1.1.0",
+ "@napi-rs/wasm-runtime": "^1.1.0",
+ "@tybys/wasm-util": "^0.10.1",
+ "tslib": "^2.4.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz",
+ "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz",
+ "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/vite": {
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.18.tgz",
+ "integrity": "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tailwindcss/node": "4.1.18",
+ "@tailwindcss/oxide": "4.1.18",
+ "tailwindcss": "4.1.18"
+ },
+ "peerDependencies": {
+ "vite": "^5.2.0 || ^6 || ^7"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/axios": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz",
+ "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.4",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/bootstrap": {
+ "version": "5.3.8",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz",
+ "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/twbs"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/bootstrap"
+ }
+ ],
+ "license": "MIT",
+ "peerDependencies": {
+ "@popperjs/core": "^2.11.8"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chalk/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/clipboard": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz",
+ "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==",
+ "license": "MIT",
+ "dependencies": {
+ "good-listener": "^1.2.2",
+ "select": "^1.1.2",
+ "tiny-emitter": "^2.0.0"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/concurrently": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz",
+ "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "4.1.2",
+ "rxjs": "7.8.2",
+ "shell-quote": "1.8.3",
+ "supports-color": "8.1.1",
+ "tree-kill": "1.2.2",
+ "yargs": "17.7.2"
+ },
+ "bin": {
+ "conc": "dist/bin/concurrently.js",
+ "concurrently": "dist/bin/concurrently.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/delegate": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
+ "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==",
+ "license": "MIT"
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.18.4",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz",
+ "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz",
+ "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.27.2",
+ "@esbuild/android-arm": "0.27.2",
+ "@esbuild/android-arm64": "0.27.2",
+ "@esbuild/android-x64": "0.27.2",
+ "@esbuild/darwin-arm64": "0.27.2",
+ "@esbuild/darwin-x64": "0.27.2",
+ "@esbuild/freebsd-arm64": "0.27.2",
+ "@esbuild/freebsd-x64": "0.27.2",
+ "@esbuild/linux-arm": "0.27.2",
+ "@esbuild/linux-arm64": "0.27.2",
+ "@esbuild/linux-ia32": "0.27.2",
+ "@esbuild/linux-loong64": "0.27.2",
+ "@esbuild/linux-mips64el": "0.27.2",
+ "@esbuild/linux-ppc64": "0.27.2",
+ "@esbuild/linux-riscv64": "0.27.2",
+ "@esbuild/linux-s390x": "0.27.2",
+ "@esbuild/linux-x64": "0.27.2",
+ "@esbuild/netbsd-arm64": "0.27.2",
+ "@esbuild/netbsd-x64": "0.27.2",
+ "@esbuild/openbsd-arm64": "0.27.2",
+ "@esbuild/openbsd-x64": "0.27.2",
+ "@esbuild/openharmony-arm64": "0.27.2",
+ "@esbuild/sunos-x64": "0.27.2",
+ "@esbuild/win32-arm64": "0.27.2",
+ "@esbuild/win32-ia32": "0.27.2",
+ "@esbuild/win32-x64": "0.27.2"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ev-emitter": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ev-emitter/-/ev-emitter-2.1.2.tgz",
+ "integrity": "sha512-jQ5Ql18hdCQ4qS+RCrbLfz1n+Pags27q5TwMKvZyhp5hh2UULUYZUy1keqj6k6SYsdqIYjnmz7xyyEY0V67B8Q==",
+ "license": "MIT"
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fizzy-ui-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/fizzy-ui-utils/-/fizzy-ui-utils-3.0.0.tgz",
+ "integrity": "sha512-uJj38QFQiJ/KCio5tiZhwAjIbTXSIgzBCKdKVbaYfLS053F6z23Nb0o1ZoO9gnxOQWN7BCc35jsvrCtAq3gY9g==",
+ "license": "MIT"
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
+ "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/good-listener": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
+ "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==",
+ "license": "MIT",
+ "dependencies": {
+ "delegate": "^3.1.2"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/infinite-scroll": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/infinite-scroll/-/infinite-scroll-5.0.0.tgz",
+ "integrity": "sha512-b3RoBS7iZ7CETV7TghYYDdgJqX301UafojO+9g90y6WbAU1w8rqXeOFQKvZLt44j//h/tNu01SnUvi6RKwd/XA==",
+ "license": "MIT",
+ "dependencies": {
+ "ev-emitter": "^2.1.0",
+ "fizzy-ui-utils": "^3.0.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
+ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "node_modules/jquery": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-4.0.0.tgz",
+ "integrity": "sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg==",
+ "license": "MIT"
+ },
+ "node_modules/laravel-vite-plugin": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-2.1.0.tgz",
+ "integrity": "sha512-z+ck2BSV6KWtYcoIzk9Y5+p4NEjqM+Y4i8/H+VZRLq0OgNjW2DqyADquwYu5j8qRvaXwzNmfCWl1KrMlV1zpsg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picocolors": "^1.0.0",
+ "vite-plugin-full-reload": "^1.1.0"
+ },
+ "bin": {
+ "clean-orphaned-assets": "bin/clean.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "vite": "^7.0.0"
+ }
+ },
+ "node_modules/lightningcss": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz",
+ "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-android-arm64": "1.30.2",
+ "lightningcss-darwin-arm64": "1.30.2",
+ "lightningcss-darwin-x64": "1.30.2",
+ "lightningcss-freebsd-x64": "1.30.2",
+ "lightningcss-linux-arm-gnueabihf": "1.30.2",
+ "lightningcss-linux-arm64-gnu": "1.30.2",
+ "lightningcss-linux-arm64-musl": "1.30.2",
+ "lightningcss-linux-x64-gnu": "1.30.2",
+ "lightningcss-linux-x64-musl": "1.30.2",
+ "lightningcss-win32-arm64-msvc": "1.30.2",
+ "lightningcss-win32-x64-msvc": "1.30.2"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz",
+ "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz",
+ "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz",
+ "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz",
+ "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz",
+ "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz",
+ "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz",
+ "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz",
+ "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz",
+ "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz",
+ "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz",
+ "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.56.0.tgz",
+ "integrity": "sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.56.0",
+ "@rollup/rollup-android-arm64": "4.56.0",
+ "@rollup/rollup-darwin-arm64": "4.56.0",
+ "@rollup/rollup-darwin-x64": "4.56.0",
+ "@rollup/rollup-freebsd-arm64": "4.56.0",
+ "@rollup/rollup-freebsd-x64": "4.56.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.56.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.56.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.56.0",
+ "@rollup/rollup-linux-arm64-musl": "4.56.0",
+ "@rollup/rollup-linux-loong64-gnu": "4.56.0",
+ "@rollup/rollup-linux-loong64-musl": "4.56.0",
+ "@rollup/rollup-linux-ppc64-gnu": "4.56.0",
+ "@rollup/rollup-linux-ppc64-musl": "4.56.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.56.0",
+ "@rollup/rollup-linux-riscv64-musl": "4.56.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.56.0",
+ "@rollup/rollup-linux-x64-gnu": "4.56.0",
+ "@rollup/rollup-linux-x64-musl": "4.56.0",
+ "@rollup/rollup-openbsd-x64": "4.56.0",
+ "@rollup/rollup-openharmony-arm64": "4.56.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.56.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.56.0",
+ "@rollup/rollup-win32-x64-gnu": "4.56.0",
+ "@rollup/rollup-win32-x64-msvc": "4.56.0",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/rxjs": {
+ "version": "7.8.2",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/select": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
+ "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==",
+ "license": "MIT"
+ },
+ "node_modules/shell-quote": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
+ "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz",
+ "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tapable": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
+ "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/tiny-emitter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+ "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==",
+ "license": "MIT"
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "tree-kill": "cli.js"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/vite": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz",
+ "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.27.0",
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3",
+ "postcss": "^8.5.6",
+ "rollup": "^4.43.0",
+ "tinyglobby": "^0.2.15"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "lightningcss": "^1.21.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-plugin-full-reload": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.2.0.tgz",
+ "integrity": "sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picocolors": "^1.0.0",
+ "picomatch": "^2.3.1"
+ }
+ },
+ "node_modules/vite-plugin-full-reload/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100755
index 00000000..ce2cf224
--- /dev/null
+++ b/package.json
@@ -0,0 +1,25 @@
+{
+ "$schema": "https://www.schemastore.org/package.json",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "build": "vite build",
+ "dev": "vite"
+ },
+ "devDependencies": {
+ "@tailwindcss/vite": "^4.0.0",
+ "axios": "^1.11.0",
+ "concurrently": "^9.0.1",
+ "laravel-vite-plugin": "^2.0.0",
+ "tailwindcss": "^4.0.0",
+ "vite": "^7.0.7"
+ },
+ "dependencies": {
+ "@fortawesome/fontawesome-free": "^7.1.0",
+ "@popperjs/core": "^2.11.8",
+ "bootstrap": "^5.3.8",
+ "clipboard": "^2.0.11",
+ "infinite-scroll": "^5.0.0",
+ "jquery": "^4.0.0"
+ }
+}
diff --git a/phpunit.xml b/phpunit.xml
new file mode 100755
index 00000000..d7032415
--- /dev/null
+++ b/phpunit.xml
@@ -0,0 +1,35 @@
+
+
+
+
+ tests/Unit
+
+
+ tests/Feature
+
+
+
+
+ app
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/.htaccess b/public/.htaccess
new file mode 100755
index 00000000..b574a597
--- /dev/null
+++ b/public/.htaccess
@@ -0,0 +1,25 @@
+
+
+ Options -MultiViews -Indexes
+
+
+ RewriteEngine On
+
+ # Handle Authorization Header
+ RewriteCond %{HTTP:Authorization} .
+ RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+ # Handle X-XSRF-Token Header
+ RewriteCond %{HTTP:x-xsrf-token} .
+ RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}]
+
+ # 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/public/favicon.ico b/public/favicon.ico
new file mode 100755
index 00000000..e69de29b
diff --git a/public/index.php b/public/index.php
new file mode 100755
index 00000000..d4e163e7
--- /dev/null
+++ b/public/index.php
@@ -0,0 +1,42 @@
+";
+ var_dump($aData);
+
+ if ($iType == 1) {
+ exit;
+ }
+ }
+}
+
+// Determine if the application is in maintenance mode...
+if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
+ require $maintenance;
+}
+
+// Register the Composer autoloader...
+require __DIR__.'/../vendor/autoload.php';
+
+// Bootstrap Laravel and handle the request...
+/** @var Application $app */
+$app = require_once __DIR__.'/../bootstrap/app.php';
+
+$app->handleRequest(Request::capture());
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100755
index 00000000..eb053628
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow:
diff --git a/public/sakai/css/common.css b/public/sakai/css/common.css
new file mode 100755
index 00000000..95028799
--- /dev/null
+++ b/public/sakai/css/common.css
@@ -0,0 +1,24 @@
+.o-thumb-img {
+ width: 1001%;
+ height: 100%;
+ object-fit: cover; /* 效果等同于 background-size: cover */
+}
+
+/* 初始态:透明且向下偏移一点点 */
+.ajax-item-fade-in {
+ opacity: 0;
+ transform: translateY(20px);
+ transition: all 0.6s cubic-bezier(0.21, 0.6, 0.35, 1);
+}
+
+/* 激活态:自然升起淡入 */
+.ajax-item-fade-in.is-visible {
+ opacity: 1;
+ transform: translateY(0);
+}
+
+.subCopy {
+ background-color:gray;
+ padding:6px;
+ color:#fff;
+}
diff --git a/public/sakai/css/single.css b/public/sakai/css/single.css
new file mode 100755
index 00000000..1c1a8506
--- /dev/null
+++ b/public/sakai/css/single.css
@@ -0,0 +1,6 @@
+
+.subCopy {
+ background-color:gray;
+ padding:6px;
+ color:#fff;
+}
diff --git a/public/sakai/js/articleList.js b/public/sakai/js/articleList.js
new file mode 100755
index 00000000..4c4708fc
--- /dev/null
+++ b/public/sakai/js/articleList.js
@@ -0,0 +1,30 @@
+
+$(document).ready(function() {
+
+ $(".btn-more").click(function() {
+
+ $("#pageNo").val(parseInt($("#pageNo").val()) + 1);
+
+ $.ajax({
+ url: '/' + $("#type").val(),
+ type: 'GET',
+ data: {
+ pageNo: $("#pageNo").val(),
+ tagId: $("#tagId").val(),
+ search: $("#search").val(),
+ },
+ success: function(response) {
+ $(".list-home").append(response);
+
+ if ($("#haveMore").val() == 0) {
+ $(".btn-more").hide();
+ }
+
+ },
+ error: function(xhr, status, error) {
+
+ }
+ })
+ })
+
+})
diff --git a/public/sakai/js/articleSinge.js b/public/sakai/js/articleSinge.js
new file mode 100755
index 00000000..a0353035
--- /dev/null
+++ b/public/sakai/js/articleSinge.js
@@ -0,0 +1,66 @@
+
+$(document).ready(function() {
+
+ // 复制
+ var clipboard = new ClipboardJS('.copy-permalink');
+ clipboard.on('success', function(e) {
+ ncPopupTips(!0, '复制成功');
+ e.clearSelection();
+ });
+ clipboard.on('error', function(e) {
+ ncPopupTips(1, '复制失败');
+ });
+
+ // 基本变量
+ $id = $("#article_id").val();
+
+ // 修复加载
+ $(".widget_nice_tag_cloud").load("/widget/toptags.html");
+
+ // 获取点赞数
+ $.ajax({
+ url: '/helper/like/get/'+$id,
+ type: 'GET',
+ data: {},
+ success: function(response) {
+
+ $(".like-count").html(response)
+
+ }
+ })
+
+ // 获取过去时间
+ $.ajax({
+ url: '/helper/timelost/'+$("#createdAt").val(),
+ type: 'GET',
+ data: {},
+ success: function(response) {
+
+ $("#timeLost").html(response)
+
+ },
+ error: function(xhr, status, error) {
+
+ }
+ })
+
+ // 点赞动作
+ $("[data-action='like']").click(function(){
+
+ $.ajax({
+ url: '/helper/like/up/'+$id,
+ type: 'GET',
+ data: {},
+ dataType: 'json',
+ success: function(response) {
+ if (response.iCode == 1) {
+ $(".like-count").html(response.iLikeNow)
+ }
+ }
+ })
+
+ return false;
+
+ });
+
+});
diff --git a/public/sakai/js/common.js b/public/sakai/js/common.js
new file mode 100755
index 00000000..0a0441a5
--- /dev/null
+++ b/public/sakai/js/common.js
@@ -0,0 +1,14 @@
+$(document).ready(function() {
+
+ $('.search-input').on('keypress', function(event) {
+ if (event.which === 13) {
+ window.location.href = "/mix?search="+$(this).val();
+ return false;
+ }
+ })
+
+// $(".widget_nice_tag_cloud").load("/widget/toptags.html");
+
+// $(".site-main").click();
+
+})
diff --git a/public/sites/vfn/icon.png b/public/sites/vfn/icon.png
new file mode 100755
index 00000000..dea55754
Binary files /dev/null and b/public/sites/vfn/icon.png differ
diff --git a/public/sites/vfn/siteimg.jpg b/public/sites/vfn/siteimg.jpg
new file mode 100755
index 00000000..7d315040
Binary files /dev/null and b/public/sites/vfn/siteimg.jpg differ
diff --git a/public/static/js/lib/jquery.min.js b/public/static/js/lib/jquery.min.js
new file mode 100755
index 00000000..e6e5f2ca
--- /dev/null
+++ b/public/static/js/lib/jquery.min.js
@@ -0,0 +1,3916 @@
+/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e, t) {
+ "use strict";
+ "object" == typeof module && "object" == typeof module.exports ? module.exports = e.document ? t(e, !0) : function(e) {
+ if (!e.document)
+ throw new Error("jQuery requires a window with a document");
+ return t(e)
+ } : t(e)
+}("undefined" != typeof window ? window : this, function(ie, e) {
+ "use strict";
+ var oe = [],
+ r = Object.getPrototypeOf,
+ ae = oe.slice,
+ g = oe.flat ? function(e) {
+ return oe.flat.call(e)
+ } : function(e) {
+ return oe.concat.apply([], e)
+ },
+ s = oe.push,
+ se = oe.indexOf,
+ n = {},
+ i = n.toString,
+ ue = n.hasOwnProperty,
+ o = ue.toString,
+ a = o.call(Object),
+ le = {},
+ v = function(e) {
+ return "function" == typeof e && "number" != typeof e.nodeType && "function" != typeof e.item
+ },
+ y = function(e) {
+ return null != e && e === e.window
+ },
+ C = ie.document,
+ u = {
+ type: !0,
+ src: !0,
+ nonce: !0,
+ noModule: !0
+ };
+ function m(e, t, n) {
+ var r,
+ i,
+ o = (n = n || C).createElement("script");
+ if (o.text = e, t)
+ for (r in u)
+ (i = t[r] || t.getAttribute && t.getAttribute(r)) && o.setAttribute(r, i);
+ n.head.appendChild(o).parentNode.removeChild(o)
+ }
+ function x(e) {
+ return null == e ? e + "" : "object" == typeof e || "function" == typeof e ? n[i.call(e)] || "object" : typeof e
+ }
+ var t = "3.7.1",
+ l = /HTML$/i,
+ ce = function(e, t) {
+ return new ce.fn.init(e, t)
+ };
+ function c(e) {
+ var t = !!e && "length" in e && e.length,
+ n = x(e);
+ return !v(e) && !y(e) && ("array" === n || 0 === t || "number" == typeof t && 0 < t && t - 1 in e)
+ }
+ function fe(e, t) {
+ return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase()
+ }
+ ce.fn = ce.prototype = {
+ jquery: t,
+ constructor: ce,
+ length: 0,
+ toArray: function() {
+ return ae.call(this)
+ },
+ get: function(e) {
+ return null == e ? ae.call(this) : e < 0 ? this[e + this.length] : this[e]
+ },
+ pushStack: function(e) {
+ var t = ce.merge(this.constructor(), e);
+ return t.prevObject = this, t
+ },
+ each: function(e) {
+ return ce.each(this, e)
+ },
+ map: function(n) {
+ return this.pushStack(ce.map(this, function(e, t) {
+ return n.call(e, t, e)
+ }))
+ },
+ slice: function() {
+ return this.pushStack(ae.apply(this, arguments))
+ },
+ first: function() {
+ return this.eq(0)
+ },
+ last: function() {
+ return this.eq(-1)
+ },
+ even: function() {
+ return this.pushStack(ce.grep(this, function(e, t) {
+ return (t + 1) % 2
+ }))
+ },
+ odd: function() {
+ return this.pushStack(ce.grep(this, function(e, t) {
+ return t % 2
+ }))
+ },
+ eq: function(e) {
+ var t = this.length,
+ n = +e + (e < 0 ? t : 0);
+ return this.pushStack(0 <= n && n < t ? [this[n]] : [])
+ },
+ end: function() {
+ return this.prevObject || this.constructor()
+ },
+ push: s,
+ sort: oe.sort,
+ splice: oe.splice
+ },
+ ce.extend = ce.fn.extend = function() {
+ var e,
+ t,
+ n,
+ r,
+ i,
+ o,
+ a = arguments[0] || {},
+ s = 1,
+ u = arguments.length,
+ l = !1;
+ for ("boolean" == typeof a && (l = a, a = arguments[s] || {}, s++), "object" == typeof a || v(a) || (a = {}), s === u && (a = this, s--); s < u; s++)
+ if (null != (e = arguments[s]))
+ for (t in e)
+ r = e[t],
+ "__proto__" !== t && a !== r && (l && r && (ce.isPlainObject(r) || (i = Array.isArray(r))) ? (n = a[t], o = i && !Array.isArray(n) ? [] : i || ce.isPlainObject(n) ? n : {}, i = !1, a[t] = ce.extend(l, o, r)) : void 0 !== r && (a[t] = r));
+ return a
+ },
+ ce.extend({
+ expando: "jQuery" + (t + Math.random()).replace(/\D/g, ""),
+ isReady: !0,
+ error: function(e) {
+ throw new Error(e)
+ },
+ noop: function() {},
+ isPlainObject: function(e) {
+ var t,
+ n;
+ return !(!e || "[object Object]" !== i.call(e)) && (!(t = r(e)) || "function" == typeof (n = ue.call(t, "constructor") && t.constructor) && o.call(n) === a)
+ },
+ isEmptyObject: function(e) {
+ var t;
+ for (t in e)
+ return !1;
+ return !0
+ },
+ globalEval: function(e, t, n) {
+ m(e, {
+ nonce: t && t.nonce
+ }, n)
+ },
+ each: function(e, t) {
+ var n,
+ r = 0;
+ if (c(e)) {
+ for (n = e.length; r < n; r++)
+ if (!1 === t.call(e[r], r, e[r]))
+ break
+ } else
+ for (r in e)
+ if (!1 === t.call(e[r], r, e[r]))
+ break;
+ return e
+ },
+ text: function(e) {
+ var t,
+ n = "",
+ r = 0,
+ i = e.nodeType;
+ if (!i)
+ while (t = e[r++])
+ n += ce.text(t);
+ return 1 === i || 11 === i ? e.textContent : 9 === i ? e.documentElement.textContent : 3 === i || 4 === i ? e.nodeValue : n
+ },
+ makeArray: function(e, t) {
+ var n = t || [];
+ return null != e && (c(Object(e)) ? ce.merge(n, "string" == typeof e ? [e] : e) : s.call(n, e)), n
+ },
+ inArray: function(e, t, n) {
+ return null == t ? -1 : se.call(t, e, n)
+ },
+ isXMLDoc: function(e) {
+ var t = e && e.namespaceURI,
+ n = e && (e.ownerDocument || e).documentElement;
+ return !l.test(t || n && n.nodeName || "HTML")
+ },
+ merge: function(e, t) {
+ for (var n = +t.length, r = 0, i = e.length; r < n; r++)
+ e[i++] = t[r];
+ return e.length = i, e
+ },
+ grep: function(e, t, n) {
+ for (var r = [], i = 0, o = e.length, a = !n; i < o; i++)
+ !t(e[i], i) !== a && r.push(e[i]);
+ return r
+ },
+ map: function(e, t, n) {
+ var r,
+ i,
+ o = 0,
+ a = [];
+ if (c(e))
+ for (r = e.length; o < r; o++)
+ null != (i = t(e[o], o, n)) && a.push(i);
+ else
+ for (o in e)
+ null != (i = t(e[o], o, n)) && a.push(i);
+ return g(a)
+ },
+ guid: 1,
+ support: le
+ }),
+ "function" == typeof Symbol && (ce.fn[Symbol.iterator] = oe[Symbol.iterator]),
+ ce.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function(e, t) {
+ n["[object " + t + "]"] = t.toLowerCase()
+ });
+ var pe = oe.pop,
+ de = oe.sort,
+ he = oe.splice,
+ ge = "[\\x20\\t\\r\\n\\f]",
+ ve = new RegExp("^" + ge + "+|((?:^|[^\\\\])(?:\\\\.)*)" + ge + "+$", "g");
+ ce.contains = function(e, t) {
+ var n = t && t.parentNode;
+ return e === n || !(!n || 1 !== n.nodeType || !(e.contains ? e.contains(n) : e.compareDocumentPosition && 16 & e.compareDocumentPosition(n)))
+ };
+ var f = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
+ function p(e, t) {
+ return t ? "\0" === e ? "\ufffd" : e.slice(0, -1) + "\\" + e.charCodeAt(e.length - 1).toString(16) + " " : "\\" + e
+ }
+ ce.escapeSelector = function(e) {
+ return (e + "").replace(f, p)
+ };
+ var ye = C,
+ me = s;
+ !function() {
+ var e,
+ b,
+ w,
+ o,
+ a,
+ T,
+ r,
+ C,
+ d,
+ i,
+ k = me,
+ S = ce.expando,
+ E = 0,
+ n = 0,
+ s = W(),
+ c = W(),
+ u = W(),
+ h = W(),
+ l = function(e, t) {
+ return e === t && (a = !0), 0
+ },
+ f = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+ t = "(?:\\\\[\\da-fA-F]{1,6}" + ge + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
+ p = "\\[" + ge + "*(" + t + ")(?:" + ge + "*([*^$|!~]?=)" + ge + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + t + "))|)" + ge + "*\\]",
+ g = ":(" + t + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + p + ")*)|.*)\\)|)",
+ v = new RegExp(ge + "+", "g"),
+ y = new RegExp("^" + ge + "*," + ge + "*"),
+ m = new RegExp("^" + ge + "*([>+~]|" + ge + ")" + ge + "*"),
+ x = new RegExp(ge + "|>"),
+ j = new RegExp(g),
+ A = new RegExp("^" + t + "$"),
+ D = {
+ ID: new RegExp("^#(" + t + ")"),
+ CLASS: new RegExp("^\\.(" + t + ")"),
+ TAG: new RegExp("^(" + t + "|[*])"),
+ ATTR: new RegExp("^" + p),
+ PSEUDO: new RegExp("^" + g),
+ CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + ge + "*(even|odd|(([+-]|)(\\d*)n|)" + ge + "*(?:([+-]|)" + ge + "*(\\d+)|))" + ge + "*\\)|)", "i"),
+ bool: new RegExp("^(?:" + f + ")$", "i"),
+ needsContext: new RegExp("^" + ge + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + ge + "*((?:-\\d)?\\d*)" + ge + "*\\)|)(?=[^-]|$)", "i")
+ },
+ N = /^(?:input|select|textarea|button)$/i,
+ q = /^h\d$/i,
+ L = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+ H = /[+~]/,
+ O = new RegExp("\\\\[\\da-fA-F]{1,6}" + ge + "?|\\\\([^\\r\\n\\f])", "g"),
+ P = function(e, t) {
+ var n = "0x" + e.slice(1) - 65536;
+ return t || (n < 0 ? String.fromCharCode(n + 65536) : String.fromCharCode(n >> 10 | 55296, 1023 & n | 56320))
+ },
+ M = function() {
+ V()
+ },
+ R = J(function(e) {
+ return !0 === e.disabled && fe(e, "fieldset")
+ }, {
+ dir: "parentNode",
+ next: "legend"
+ });
+ try {
+ k.apply(oe = ae.call(ye.childNodes), ye.childNodes),
+ oe[ye.childNodes.length].nodeType
+ } catch (e) {
+ k = {
+ apply: function(e, t) {
+ me.apply(e, ae.call(t))
+ },
+ call: function(e) {
+ me.apply(e, ae.call(arguments, 1))
+ }
+ }
+ }
+ function I(t, e, n, r) {
+ var i,
+ o,
+ a,
+ s,
+ u,
+ l,
+ c,
+ f = e && e.ownerDocument,
+ p = e ? e.nodeType : 9;
+ if (n = n || [], "string" != typeof t || !t || 1 !== p && 9 !== p && 11 !== p)
+ return n;
+ if (!r && (V(e), e = e || T, C)) {
+ if (11 !== p && (u = L.exec(t)))
+ if (i = u[1]) {
+ if (9 === p) {
+ if (!(a = e.getElementById(i)))
+ return n;
+ if (a.id === i)
+ return k.call(n, a), n
+ } else if (f && (a = f.getElementById(i)) && I.contains(e, a) && a.id === i)
+ return k.call(n, a), n
+ } else {
+ if (u[2])
+ return k.apply(n, e.getElementsByTagName(t)), n;
+ if ((i = u[3]) && e.getElementsByClassName)
+ return k.apply(n, e.getElementsByClassName(i)), n
+ }
+ if (!(h[t + " "] || d && d.test(t))) {
+ if (c = t, f = e, 1 === p && (x.test(t) || m.test(t))) {
+ (f = H.test(t) && U(e.parentNode) || e) == e && le.scope || ((s = e.getAttribute("id")) ? s = ce.escapeSelector(s) : e.setAttribute("id", s = S)),
+ o = (l = Y(t)).length;
+ while (o--)
+ l[o] = (s ? "#" + s : ":scope") + " " + Q(l[o]);
+ c = l.join(",")
+ }
+ try {
+ return k.apply(n, f.querySelectorAll(c)), n
+ } catch (e) {
+ h(t, !0)
+ } finally {
+ s === S && e.removeAttribute("id")
+ }
+ }
+ }
+ return re(t.replace(ve, "$1"), e, n, r)
+ }
+ function W() {
+ var r = [];
+ return function e(t, n) {
+ return r.push(t + " ") > b.cacheLength && delete e[r.shift()], e[t + " "] = n
+ }
+ }
+ function F(e) {
+ return e[S] = !0, e
+ }
+ function $(e) {
+ var t = T.createElement("fieldset");
+ try {
+ return !!e(t)
+ } catch (e) {
+ return !1
+ } finally {
+ t.parentNode && t.parentNode.removeChild(t),
+ t = null
+ }
+ }
+ function B(t) {
+ return function(e) {
+ return fe(e, "input") && e.type === t
+ }
+ }
+ function _(t) {
+ return function(e) {
+ return (fe(e, "input") || fe(e, "button")) && e.type === t
+ }
+ }
+ function z(t) {
+ return function(e) {
+ return "form" in e ? e.parentNode && !1 === e.disabled ? "label" in e ? "label" in e.parentNode ? e.parentNode.disabled === t : e.disabled === t : e.isDisabled === t || e.isDisabled !== !t && R(e) === t : e.disabled === t : "label" in e && e.disabled === t
+ }
+ }
+ function X(a) {
+ return F(function(o) {
+ return o = +o, F(function(e, t) {
+ var n,
+ r = a([], e.length, o),
+ i = r.length;
+ while (i--)
+ e[n = r[i]] && (e[n] = !(t[n] = e[n]))
+ })
+ })
+ }
+ function U(e) {
+ return e && "undefined" != typeof e.getElementsByTagName && e
+ }
+ function V(e) {
+ var t,
+ n = e ? e.ownerDocument || e : ye;
+ return n != T && 9 === n.nodeType && n.documentElement && (r = (T = n).documentElement, C = !ce.isXMLDoc(T), i = r.matches || r.webkitMatchesSelector || r.msMatchesSelector, r.msMatchesSelector && ye != T && (t = T.defaultView) && t.top !== t && t.addEventListener("unload", M), le.getById = $(function(e) {
+ return r.appendChild(e).id = ce.expando, !T.getElementsByName || !T.getElementsByName(ce.expando).length
+ }), le.disconnectedMatch = $(function(e) {
+ return i.call(e, "*")
+ }), le.scope = $(function() {
+ return T.querySelectorAll(":scope")
+ }), le.cssHas = $(function() {
+ try {
+ return T.querySelector(":has(*,:jqfake)"), !1
+ } catch (e) {
+ return !0
+ }
+ }), le.getById ? (b.filter.ID = function(e) {
+ var t = e.replace(O, P);
+ return function(e) {
+ return e.getAttribute("id") === t
+ }
+ }, b.find.ID = function(e, t) {
+ if ("undefined" != typeof t.getElementById && C) {
+ var n = t.getElementById(e);
+ return n ? [n] : []
+ }
+ }) : (b.filter.ID = function(e) {
+ var n = e.replace(O, P);
+ return function(e) {
+ var t = "undefined" != typeof e.getAttributeNode && e.getAttributeNode("id");
+ return t && t.value === n
+ }
+ }, b.find.ID = function(e, t) {
+ if ("undefined" != typeof t.getElementById && C) {
+ var n,
+ r,
+ i,
+ o = t.getElementById(e);
+ if (o) {
+ if ((n = o.getAttributeNode("id")) && n.value === e)
+ return [o];
+ i = t.getElementsByName(e),
+ r = 0;
+ while (o = i[r++])
+ if ((n = o.getAttributeNode("id")) && n.value === e)
+ return [o]
+ }
+ return []
+ }
+ }), b.find.TAG = function(e, t) {
+ return "undefined" != typeof t.getElementsByTagName ? t.getElementsByTagName(e) : t.querySelectorAll(e)
+ }, b.find.CLASS = function(e, t) {
+ if ("undefined" != typeof t.getElementsByClassName && C)
+ return t.getElementsByClassName(e)
+ }, d = [], $(function(e) {
+ var t;
+ r.appendChild(e).innerHTML = "",
+ e.querySelectorAll("[selected]").length || d.push("\\[" + ge + "*(?:value|" + f + ")"),
+ e.querySelectorAll("[id~=" + S + "-]").length || d.push("~="),
+ e.querySelectorAll("a#" + S + "+*").length || d.push(".#.+[+~]"),
+ e.querySelectorAll(":checked").length || d.push(":checked"),
+ (t = T.createElement("input")).setAttribute("type", "hidden"),
+ e.appendChild(t).setAttribute("name", "D"),
+ r.appendChild(e).disabled = !0,
+ 2 !== e.querySelectorAll(":disabled").length && d.push(":enabled", ":disabled"),
+ (t = T.createElement("input")).setAttribute("name", ""),
+ e.appendChild(t),
+ e.querySelectorAll("[name='']").length || d.push("\\[" + ge + "*name" + ge + "*=" + ge + "*(?:''|\"\")")
+ }), le.cssHas || d.push(":has"), d = d.length && new RegExp(d.join("|")), l = function(e, t) {
+ if (e === t)
+ return a = !0, 0;
+ var n = !e.compareDocumentPosition - !t.compareDocumentPosition;
+ return n || (1 & (n = (e.ownerDocument || e) == (t.ownerDocument || t) ? e.compareDocumentPosition(t) : 1) || !le.sortDetached && t.compareDocumentPosition(e) === n ? e === T || e.ownerDocument == ye && I.contains(ye, e) ? -1 : t === T || t.ownerDocument == ye && I.contains(ye, t) ? 1 : o ? se.call(o, e) - se.call(o, t) : 0 : 4 & n ? -1 : 1)
+ }), T
+ }
+ for (e in I.matches = function(e, t) {
+ return I(e, null, null, t)
+ }, I.matchesSelector = function(e, t) {
+ if (V(e), C && !h[t + " "] && (!d || !d.test(t)))
+ try {
+ var n = i.call(e, t);
+ if (n || le.disconnectedMatch || e.document && 11 !== e.document.nodeType)
+ return n
+ } catch (e) {
+ h(t, !0)
+ }
+ return 0 < I(t, T, null, [e]).length
+ }, I.contains = function(e, t) {
+ return (e.ownerDocument || e) != T && V(e), ce.contains(e, t)
+ }, I.attr = function(e, t) {
+ (e.ownerDocument || e) != T && V(e);
+ var n = b.attrHandle[t.toLowerCase()],
+ r = n && ue.call(b.attrHandle, t.toLowerCase()) ? n(e, t, !C) : void 0;
+ return void 0 !== r ? r : e.getAttribute(t)
+ }, I.error = function(e) {
+ throw new Error("Syntax error, unrecognized expression: " + e)
+ }, ce.uniqueSort = function(e) {
+ var t,
+ n = [],
+ r = 0,
+ i = 0;
+ if (a = !le.sortStable, o = !le.sortStable && ae.call(e, 0), de.call(e, l), a) {
+ while (t = e[i++])
+ t === e[i] && (r = n.push(i));
+ while (r--)
+ he.call(e, n[r], 1)
+ }
+ return o = null, e
+ }, ce.fn.uniqueSort = function() {
+ return this.pushStack(ce.uniqueSort(ae.apply(this)))
+ }, (b = ce.expr = {
+ cacheLength: 50,
+ createPseudo: F,
+ match: D,
+ attrHandle: {},
+ find: {},
+ relative: {
+ ">": {
+ dir: "parentNode",
+ first: !0
+ },
+ " ": {
+ dir: "parentNode"
+ },
+ "+": {
+ dir: "previousSibling",
+ first: !0
+ },
+ "~": {
+ dir: "previousSibling"
+ }
+ },
+ preFilter: {
+ ATTR: function(e) {
+ return e[1] = e[1].replace(O, P), e[3] = (e[3] || e[4] || e[5] || "").replace(O, P), "~=" === e[2] && (e[3] = " " + e[3] + " "), e.slice(0, 4)
+ },
+ CHILD: function(e) {
+ return e[1] = e[1].toLowerCase(), "nth" === e[1].slice(0, 3) ? (e[3] || I.error(e[0]), e[4] = +(e[4] ? e[5] + (e[6] || 1) : 2 * ("even" === e[3] || "odd" === e[3])), e[5] = +(e[7] + e[8] || "odd" === e[3])) : e[3] && I.error(e[0]), e
+ },
+ PSEUDO: function(e) {
+ var t,
+ n = !e[6] && e[2];
+ return D.CHILD.test(e[0]) ? null : (e[3] ? e[2] = e[4] || e[5] || "" : n && j.test(n) && (t = Y(n, !0)) && (t = n.indexOf(")", n.length - t) - n.length) && (e[0] = e[0].slice(0, t), e[2] = n.slice(0, t)), e.slice(0, 3))
+ }
+ },
+ filter: {
+ TAG: function(e) {
+ var t = e.replace(O, P).toLowerCase();
+ return "*" === e ? function() {
+ return !0
+ } : function(e) {
+ return fe(e, t)
+ }
+ },
+ CLASS: function(e) {
+ var t = s[e + " "];
+ return t || (t = new RegExp("(^|" + ge + ")" + e + "(" + ge + "|$)")) && s(e, function(e) {
+ return t.test("string" == typeof e.className && e.className || "undefined" != typeof e.getAttribute && e.getAttribute("class") || "")
+ })
+ },
+ ATTR: function(n, r, i) {
+ return function(e) {
+ var t = I.attr(e, n);
+ return null == t ? "!=" === r : !r || (t += "", "=" === r ? t === i : "!=" === r ? t !== i : "^=" === r ? i && 0 === t.indexOf(i) : "*=" === r ? i && -1 < t.indexOf(i) : "$=" === r ? i && t.slice(-i.length) === i : "~=" === r ? -1 < (" " + t.replace(v, " ") + " ").indexOf(i) : "|=" === r && (t === i || t.slice(0, i.length + 1) === i + "-"))
+ }
+ },
+ CHILD: function(d, e, t, h, g) {
+ var v = "nth" !== d.slice(0, 3),
+ y = "last" !== d.slice(-4),
+ m = "of-type" === e;
+ return 1 === h && 0 === g ? function(e) {
+ return !!e.parentNode
+ } : function(e, t, n) {
+ var r,
+ i,
+ o,
+ a,
+ s,
+ u = v !== y ? "nextSibling" : "previousSibling",
+ l = e.parentNode,
+ c = m && e.nodeName.toLowerCase(),
+ f = !n && !m,
+ p = !1;
+ if (l) {
+ if (v) {
+ while (u) {
+ o = e;
+ while (o = o[u])
+ if (m ? fe(o, c) : 1 === o.nodeType)
+ return !1;
+ s = u = "only" === d && !s && "nextSibling"
+ }
+ return !0
+ }
+ if (s = [y ? l.firstChild : l.lastChild], y && f) {
+ p = (a = (r = (i = l[S] || (l[S] = {}))[d] || [])[0] === E && r[1]) && r[2],
+ o = a && l.childNodes[a];
+ while (o = ++a && o && o[u] || (p = a = 0) || s.pop())
+ if (1 === o.nodeType && ++p && o === e) {
+ i[d] = [E, a, p];
+ break
+ }
+ } else if (f && (p = a = (r = (i = e[S] || (e[S] = {}))[d] || [])[0] === E && r[1]), !1 === p)
+ while (o = ++a && o && o[u] || (p = a = 0) || s.pop())
+ if ((m ? fe(o, c) : 1 === o.nodeType) && ++p && (f && ((i = o[S] || (o[S] = {}))[d] = [E, p]), o === e))
+ break;
+ return (p -= g) === h || p % h == 0 && 0 <= p / h
+ }
+ }
+ },
+ PSEUDO: function(e, o) {
+ var t,
+ a = b.pseudos[e] || b.setFilters[e.toLowerCase()] || I.error("unsupported pseudo: " + e);
+ return a[S] ? a(o) : 1 < a.length ? (t = [e, e, "", o], b.setFilters.hasOwnProperty(e.toLowerCase()) ? F(function(e, t) {
+ var n,
+ r = a(e, o),
+ i = r.length;
+ while (i--)
+ e[n = se.call(e, r[i])] = !(t[n] = r[i])
+ }) : function(e) {
+ return a(e, 0, t)
+ }) : a
+ }
+ },
+ pseudos: {
+ not: F(function(e) {
+ var r = [],
+ i = [],
+ s = ne(e.replace(ve, "$1"));
+ return s[S] ? F(function(e, t, n, r) {
+ var i,
+ o = s(e, null, r, []),
+ a = e.length;
+ while (a--)
+ (i = o[a]) && (e[a] = !(t[a] = i))
+ }) : function(e, t, n) {
+ return r[0] = e, s(r, null, n, i), r[0] = null, !i.pop()
+ }
+ }),
+ has: F(function(t) {
+ return function(e) {
+ return 0 < I(t, e).length
+ }
+ }),
+ contains: F(function(t) {
+ return t = t.replace(O, P), function(e) {
+ return -1 < (e.textContent || ce.text(e)).indexOf(t)
+ }
+ }),
+ lang: F(function(n) {
+ return A.test(n || "") || I.error("unsupported lang: " + n), n = n.replace(O, P).toLowerCase(), function(e) {
+ var t;
+ do {
+ if (t = C ? e.lang : e.getAttribute("xml:lang") || e.getAttribute("lang"))
+ return (t = t.toLowerCase()) === n || 0 === t.indexOf(n + "-")
+ } while ((e = e.parentNode) && 1 === e.nodeType);
+ return !1
+ }
+ }),
+ target: function(e) {
+ var t = ie.location && ie.location.hash;
+ return t && t.slice(1) === e.id
+ },
+ root: function(e) {
+ return e === r
+ },
+ focus: function(e) {
+ return e === function() {
+ try {
+ return T.activeElement
+ } catch (e) {}
+ }() && T.hasFocus() && !!(e.type || e.href || ~e.tabIndex)
+ },
+ enabled: z(!1),
+ disabled: z(!0),
+ checked: function(e) {
+ return fe(e, "input") && !!e.checked || fe(e, "option") && !!e.selected
+ },
+ selected: function(e) {
+ return e.parentNode && e.parentNode.selectedIndex, !0 === e.selected
+ },
+ empty: function(e) {
+ for (e = e.firstChild; e; e = e.nextSibling)
+ if (e.nodeType < 6)
+ return !1;
+ return !0
+ },
+ parent: function(e) {
+ return !b.pseudos.empty(e)
+ },
+ header: function(e) {
+ return q.test(e.nodeName)
+ },
+ input: function(e) {
+ return N.test(e.nodeName)
+ },
+ button: function(e) {
+ return fe(e, "input") && "button" === e.type || fe(e, "button")
+ },
+ text: function(e) {
+ var t;
+ return fe(e, "input") && "text" === e.type && (null == (t = e.getAttribute("type")) || "text" === t.toLowerCase())
+ },
+ first: X(function() {
+ return [0]
+ }),
+ last: X(function(e, t) {
+ return [t - 1]
+ }),
+ eq: X(function(e, t, n) {
+ return [n < 0 ? n + t : n]
+ }),
+ even: X(function(e, t) {
+ for (var n = 0; n < t; n += 2)
+ e.push(n);
+ return e
+ }),
+ odd: X(function(e, t) {
+ for (var n = 1; n < t; n += 2)
+ e.push(n);
+ return e
+ }),
+ lt: X(function(e, t, n) {
+ var r;
+ for (r = n < 0 ? n + t : t < n ? t : n; 0 <= --r;)
+ e.push(r);
+ return e
+ }),
+ gt: X(function(e, t, n) {
+ for (var r = n < 0 ? n + t : n; ++r < t;)
+ e.push(r);
+ return e
+ })
+ }
+ }).pseudos.nth = b.pseudos.eq, {
+ radio: !0,
+ checkbox: !0,
+ file: !0,
+ password: !0,
+ image: !0
+ })
+ b.pseudos[e] = B(e);
+ for (e in {
+ submit: !0,
+ reset: !0
+ })
+ b.pseudos[e] = _(e);
+ function G() {}
+ function Y(e, t) {
+ var n,
+ r,
+ i,
+ o,
+ a,
+ s,
+ u,
+ l = c[e + " "];
+ if (l)
+ return t ? 0 : l.slice(0);
+ a = e,
+ s = [],
+ u = b.preFilter;
+ while (a) {
+ for (o in n && !(r = y.exec(a)) || (r && (a = a.slice(r[0].length) || a), s.push(i = [])), n = !1, (r = m.exec(a)) && (n = r.shift(), i.push({
+ value: n,
+ type: r[0].replace(ve, " ")
+ }), a = a.slice(n.length)), b.filter)
+ !(r = D[o].exec(a)) || u[o] && !(r = u[o](r)) || (n = r.shift(), i.push({
+ value: n,
+ type: o,
+ matches: r
+ }), a = a.slice(n.length));
+ if (!n)
+ break
+ }
+ return t ? a.length : a ? I.error(e) : c(e, s).slice(0)
+ }
+ function Q(e) {
+ for (var t = 0, n = e.length, r = ""; t < n; t++)
+ r += e[t].value;
+ return r
+ }
+ function J(a, e, t) {
+ var s = e.dir,
+ u = e.next,
+ l = u || s,
+ c = t && "parentNode" === l,
+ f = n++;
+ return e.first ? function(e, t, n) {
+ while (e = e[s])
+ if (1 === e.nodeType || c)
+ return a(e, t, n);
+ return !1
+ } : function(e, t, n) {
+ var r,
+ i,
+ o = [E, f];
+ if (n) {
+ while (e = e[s])
+ if ((1 === e.nodeType || c) && a(e, t, n))
+ return !0
+ } else
+ while (e = e[s])
+ if (1 === e.nodeType || c)
+ if (i = e[S] || (e[S] = {}), u && fe(e, u))
+ e = e[s] || e;
+ else {
+ if ((r = i[l]) && r[0] === E && r[1] === f)
+ return o[2] = r[2];
+ if ((i[l] = o)[2] = a(e, t, n))
+ return !0
+ }
+ return !1
+ }
+ }
+ function K(i) {
+ return 1 < i.length ? function(e, t, n) {
+ var r = i.length;
+ while (r--)
+ if (!i[r](e, t, n))
+ return !1;
+ return !0
+ } : i[0]
+ }
+ function Z(e, t, n, r, i) {
+ for (var o, a = [], s = 0, u = e.length, l = null != t; s < u; s++)
+ (o = e[s]) && (n && !n(o, r, i) || (a.push(o), l && t.push(s)));
+ return a
+ }
+ function ee(d, h, g, v, y, e) {
+ return v && !v[S] && (v = ee(v)), y && !y[S] && (y = ee(y, e)), F(function(e, t, n, r) {
+ var i,
+ o,
+ a,
+ s,
+ u = [],
+ l = [],
+ c = t.length,
+ f = e || function(e, t, n) {
+ for (var r = 0, i = t.length; r < i; r++)
+ I(e, t[r], n);
+ return n
+ }(h || "*", n.nodeType ? [n] : n, []),
+ p = !d || !e && h ? f : Z(f, u, d, n, r);
+ if (g ? g(p, s = y || (e ? d : c || v) ? [] : t, n, r) : s = p, v) {
+ i = Z(s, l),
+ v(i, [], n, r),
+ o = i.length;
+ while (o--)
+ (a = i[o]) && (s[l[o]] = !(p[l[o]] = a))
+ }
+ if (e) {
+ if (y || d) {
+ if (y) {
+ i = [],
+ o = s.length;
+ while (o--)
+ (a = s[o]) && i.push(p[o] = a);
+ y(null, s = [], i, r)
+ }
+ o = s.length;
+ while (o--)
+ (a = s[o]) && -1 < (i = y ? se.call(e, a) : u[o]) && (e[i] = !(t[i] = a))
+ }
+ } else
+ s = Z(s === t ? s.splice(c, s.length) : s),
+ y ? y(null, t, s, r) : k.apply(t, s)
+ })
+ }
+ function te(e) {
+ for (var i, t, n, r = e.length, o = b.relative[e[0].type], a = o || b.relative[" "], s = o ? 1 : 0, u = J(function(e) {
+ return e === i
+ }, a, !0), l = J(function(e) {
+ return -1 < se.call(i, e)
+ }, a, !0), c = [function(e, t, n) {
+ var r = !o && (n || t != w) || ((i = t).nodeType ? u(e, t, n) : l(e, t, n));
+ return i = null, r
+ }]; s < r; s++)
+ if (t = b.relative[e[s].type])
+ c = [J(K(c), t)];
+ else {
+ if ((t = b.filter[e[s].type].apply(null, e[s].matches))[S]) {
+ for (n = ++s; n < r; n++)
+ if (b.relative[e[n].type])
+ break;
+ return ee(1 < s && K(c), 1 < s && Q(e.slice(0, s - 1).concat({
+ value: " " === e[s - 2].type ? "*" : ""
+ })).replace(ve, "$1"), t, s < n && te(e.slice(s, n)), n < r && te(e = e.slice(n)), n < r && Q(e))
+ }
+ c.push(t)
+ }
+ return K(c)
+ }
+ function ne(e, t) {
+ var n,
+ v,
+ y,
+ m,
+ x,
+ r,
+ i = [],
+ o = [],
+ a = u[e + " "];
+ if (!a) {
+ t || (t = Y(e)),
+ n = t.length;
+ while (n--)
+ (a = te(t[n]))[S] ? i.push(a) : o.push(a);
+ (a = u(e, (v = o, m = 0 < (y = i).length, x = 0 < v.length, r = function(e, t, n, r, i) {
+ var o,
+ a,
+ s,
+ u = 0,
+ l = "0",
+ c = e && [],
+ f = [],
+ p = w,
+ d = e || x && b.find.TAG("*", i),
+ h = E += null == p ? 1 : Math.random() || .1,
+ g = d.length;
+ for (i && (w = t == T || t || i); l !== g && null != (o = d[l]); l++) {
+ if (x && o) {
+ a = 0,
+ t || o.ownerDocument == T || (V(o), n = !C);
+ while (s = v[a++])
+ if (s(o, t || T, n)) {
+ k.call(r, o);
+ break
+ }
+ i && (E = h)
+ }
+ m && ((o = !s && o) && u--, e && c.push(o))
+ }
+ if (u += l, m && l !== u) {
+ a = 0;
+ while (s = y[a++])
+ s(c, f, t, n);
+ if (e) {
+ if (0 < u)
+ while (l--)
+ c[l] || f[l] || (f[l] = pe.call(r));
+ f = Z(f)
+ }
+ k.apply(r, f),
+ i && !e && 0 < f.length && 1 < u + y.length && ce.uniqueSort(r)
+ }
+ return i && (E = h, w = p), c
+ }, m ? F(r) : r))).selector = e
+ }
+ return a
+ }
+ function re(e, t, n, r) {
+ var i,
+ o,
+ a,
+ s,
+ u,
+ l = "function" == typeof e && e,
+ c = !r && Y(e = l.selector || e);
+ if (n = n || [], 1 === c.length) {
+ if (2 < (o = c[0] = c[0].slice(0)).length && "ID" === (a = o[0]).type && 9 === t.nodeType && C && b.relative[o[1].type]) {
+ if (!(t = (b.find.ID(a.matches[0].replace(O, P), t) || [])[0]))
+ return n;
+ l && (t = t.parentNode),
+ e = e.slice(o.shift().value.length)
+ }
+ i = D.needsContext.test(e) ? 0 : o.length;
+ while (i--) {
+ if (a = o[i], b.relative[s = a.type])
+ break;
+ if ((u = b.find[s]) && (r = u(a.matches[0].replace(O, P), H.test(o[0].type) && U(t.parentNode) || t))) {
+ if (o.splice(i, 1), !(e = r.length && Q(o)))
+ return k.apply(n, r), n;
+ break
+ }
+ }
+ }
+ return (l || ne(e, c))(r, t, !C, n, !t || H.test(e) && U(t.parentNode) || t), n
+ }
+ G.prototype = b.filters = b.pseudos,
+ b.setFilters = new G,
+ le.sortStable = S.split("").sort(l).join("") === S,
+ V(),
+ le.sortDetached = $(function(e) {
+ return 1 & e.compareDocumentPosition(T.createElement("fieldset"))
+ }),
+ ce.find = I,
+ ce.expr[":"] = ce.expr.pseudos,
+ ce.unique = ce.uniqueSort,
+ I.compile = ne,
+ I.select = re,
+ I.setDocument = V,
+ I.tokenize = Y,
+ I.escape = ce.escapeSelector,
+ I.getText = ce.text,
+ I.isXML = ce.isXMLDoc,
+ I.selectors = ce.expr,
+ I.support = ce.support,
+ I.uniqueSort = ce.uniqueSort
+ }();
+ var d = function(e, t, n) {
+ var r = [],
+ i = void 0 !== n;
+ while ((e = e[t]) && 9 !== e.nodeType)
+ if (1 === e.nodeType) {
+ if (i && ce(e).is(n))
+ break;
+ r.push(e)
+ }
+ return r
+ },
+ h = function(e, t) {
+ for (var n = []; e; e = e.nextSibling)
+ 1 === e.nodeType && e !== t && n.push(e);
+ return n
+ },
+ b = ce.expr.match.needsContext,
+ w = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;
+ function T(e, n, r) {
+ return v(n) ? ce.grep(e, function(e, t) {
+ return !!n.call(e, t, e) !== r
+ }) : n.nodeType ? ce.grep(e, function(e) {
+ return e === n !== r
+ }) : "string" != typeof n ? ce.grep(e, function(e) {
+ return -1 < se.call(n, e) !== r
+ }) : ce.filter(n, e, r)
+ }
+ ce.filter = function(e, t, n) {
+ var r = t[0];
+ return n && (e = ":not(" + e + ")"), 1 === t.length && 1 === r.nodeType ? ce.find.matchesSelector(r, e) ? [r] : [] : ce.find.matches(e, ce.grep(t, function(e) {
+ return 1 === e.nodeType
+ }))
+ },
+ ce.fn.extend({
+ find: function(e) {
+ var t,
+ n,
+ r = this.length,
+ i = this;
+ if ("string" != typeof e)
+ return this.pushStack(ce(e).filter(function() {
+ for (t = 0; t < r; t++)
+ if (ce.contains(i[t], this))
+ return !0
+ }));
+ for (n = this.pushStack([]), t = 0; t < r; t++)
+ ce.find(e, i[t], n);
+ return 1 < r ? ce.uniqueSort(n) : n
+ },
+ filter: function(e) {
+ return this.pushStack(T(this, e || [], !1))
+ },
+ not: function(e) {
+ return this.pushStack(T(this, e || [], !0))
+ },
+ is: function(e) {
+ return !!T(this, "string" == typeof e && b.test(e) ? ce(e) : e || [], !1).length
+ }
+ });
+ var k,
+ S = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;
+ (ce.fn.init = function(e, t, n) {
+ var r,
+ i;
+ if (!e)
+ return this;
+ if (n = n || k, "string" == typeof e) {
+ if (!(r = "<" === e[0] && ">" === e[e.length - 1] && 3 <= e.length ? [null, e, null] : S.exec(e)) || !r[1] && t)
+ return !t || t.jquery ? (t || n).find(e) : this.constructor(t).find(e);
+ if (r[1]) {
+ if (t = t instanceof ce ? t[0] : t, ce.merge(this, ce.parseHTML(r[1], t && t.nodeType ? t.ownerDocument || t : C, !0)), w.test(r[1]) && ce.isPlainObject(t))
+ for (r in t)
+ v(this[r]) ? this[r](t[r]) : this.attr(r, t[r]);
+ return this
+ }
+ return (i = C.getElementById(r[2])) && (this[0] = i, this.length = 1), this
+ }
+ return e.nodeType ? (this[0] = e, this.length = 1, this) : v(e) ? void 0 !== n.ready ? n.ready(e) : e(ce) : ce.makeArray(e, this)
+ }).prototype = ce.fn,
+ k = ce(C);
+ var E = /^(?:parents|prev(?:Until|All))/,
+ j = {
+ children: !0,
+ contents: !0,
+ next: !0,
+ prev: !0
+ };
+ function A(e, t) {
+ while ((e = e[t]) && 1 !== e.nodeType)
+ ;
+ return e
+ }
+ ce.fn.extend({
+ has: function(e) {
+ var t = ce(e, this),
+ n = t.length;
+ return this.filter(function() {
+ for (var e = 0; e < n; e++)
+ if (ce.contains(this, t[e]))
+ return !0
+ })
+ },
+ closest: function(e, t) {
+ var n,
+ r = 0,
+ i = this.length,
+ o = [],
+ a = "string" != typeof e && ce(e);
+ if (!b.test(e))
+ for (; r < i; r++)
+ for (n = this[r]; n && n !== t; n = n.parentNode)
+ if (n.nodeType < 11 && (a ? -1 < a.index(n) : 1 === n.nodeType && ce.find.matchesSelector(n, e))) {
+ o.push(n);
+ break
+ }
+ return this.pushStack(1 < o.length ? ce.uniqueSort(o) : o)
+ },
+ index: function(e) {
+ return e ? "string" == typeof e ? se.call(ce(e), this[0]) : se.call(this, e.jquery ? e[0] : e) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1
+ },
+ add: function(e, t) {
+ return this.pushStack(ce.uniqueSort(ce.merge(this.get(), ce(e, t))))
+ },
+ addBack: function(e) {
+ return this.add(null == e ? this.prevObject : this.prevObject.filter(e))
+ }
+ }),
+ ce.each({
+ parent: function(e) {
+ var t = e.parentNode;
+ return t && 11 !== t.nodeType ? t : null
+ },
+ parents: function(e) {
+ return d(e, "parentNode")
+ },
+ parentsUntil: function(e, t, n) {
+ return d(e, "parentNode", n)
+ },
+ next: function(e) {
+ return A(e, "nextSibling")
+ },
+ prev: function(e) {
+ return A(e, "previousSibling")
+ },
+ nextAll: function(e) {
+ return d(e, "nextSibling")
+ },
+ prevAll: function(e) {
+ return d(e, "previousSibling")
+ },
+ nextUntil: function(e, t, n) {
+ return d(e, "nextSibling", n)
+ },
+ prevUntil: function(e, t, n) {
+ return d(e, "previousSibling", n)
+ },
+ siblings: function(e) {
+ return h((e.parentNode || {}).firstChild, e)
+ },
+ children: function(e) {
+ return h(e.firstChild)
+ },
+ contents: function(e) {
+ return null != e.contentDocument && r(e.contentDocument) ? e.contentDocument : (fe(e, "template") && (e = e.content || e), ce.merge([], e.childNodes))
+ }
+ }, function(r, i) {
+ ce.fn[r] = function(e, t) {
+ var n = ce.map(this, i, e);
+ return "Until" !== r.slice(-5) && (t = e), t && "string" == typeof t && (n = ce.filter(t, n)), 1 < this.length && (j[r] || ce.uniqueSort(n), E.test(r) && n.reverse()), this.pushStack(n)
+ }
+ });
+ var D = /[^\x20\t\r\n\f]+/g;
+ function N(e) {
+ return e
+ }
+ function q(e) {
+ throw e
+ }
+ function L(e, t, n, r) {
+ var i;
+ try {
+ e && v(i = e.promise) ? i.call(e).done(t).fail(n) : e && v(i = e.then) ? i.call(e, t, n) : t.apply(void 0, [e].slice(r))
+ } catch (e) {
+ n.apply(void 0, [e])
+ }
+ }
+ ce.Callbacks = function(r) {
+ var e,
+ n;
+ r = "string" == typeof r ? (e = r, n = {}, ce.each(e.match(D) || [], function(e, t) {
+ n[t] = !0
+ }), n) : ce.extend({}, r);
+ var i,
+ t,
+ o,
+ a,
+ s = [],
+ u = [],
+ l = -1,
+ c = function() {
+ for (a = a || r.once, o = i = !0; u.length; l = -1) {
+ t = u.shift();
+ while (++l < s.length)
+ !1 === s[l].apply(t[0], t[1]) && r.stopOnFalse && (l = s.length, t = !1)
+ }
+ r.memory || (t = !1),
+ i = !1,
+ a && (s = t ? [] : "")
+ },
+ f = {
+ add: function() {
+ return s && (t && !i && (l = s.length - 1, u.push(t)), function n(e) {
+ ce.each(e, function(e, t) {
+ v(t) ? r.unique && f.has(t) || s.push(t) : t && t.length && "string" !== x(t) && n(t)
+ })
+ }(arguments), t && !i && c()), this
+ },
+ remove: function() {
+ return ce.each(arguments, function(e, t) {
+ var n;
+ while (-1 < (n = ce.inArray(t, s, n)))
+ s.splice(n, 1),
+ n <= l && l--
+ }), this
+ },
+ has: function(e) {
+ return e ? -1 < ce.inArray(e, s) : 0 < s.length
+ },
+ empty: function() {
+ return s && (s = []), this
+ },
+ disable: function() {
+ return a = u = [], s = t = "", this
+ },
+ disabled: function() {
+ return !s
+ },
+ lock: function() {
+ return a = u = [], t || i || (s = t = ""), this
+ },
+ locked: function() {
+ return !!a
+ },
+ fireWith: function(e, t) {
+ return a || (t = [e, (t = t || []).slice ? t.slice() : t], u.push(t), i || c()), this
+ },
+ fire: function() {
+ return f.fireWith(this, arguments), this
+ },
+ fired: function() {
+ return !!o
+ }
+ };
+ return f
+ },
+ ce.extend({
+ Deferred: function(e) {
+ var o = [["notify", "progress", ce.Callbacks("memory"), ce.Callbacks("memory"), 2], ["resolve", "done", ce.Callbacks("once memory"), ce.Callbacks("once memory"), 0, "resolved"], ["reject", "fail", ce.Callbacks("once memory"), ce.Callbacks("once memory"), 1, "rejected"]],
+ i = "pending",
+ a = {
+ state: function() {
+ return i
+ },
+ always: function() {
+ return s.done(arguments).fail(arguments), this
+ },
+ "catch": function(e) {
+ return a.then(null, e)
+ },
+ pipe: function() {
+ var i = arguments;
+ return ce.Deferred(function(r) {
+ ce.each(o, function(e, t) {
+ var n = v(i[t[4]]) && i[t[4]];
+ s[t[1]](function() {
+ var e = n && n.apply(this, arguments);
+ e && v(e.promise) ? e.promise().progress(r.notify).done(r.resolve).fail(r.reject) : r[t[0] + "With"](this, n ? [e] : arguments)
+ })
+ }),
+ i = null
+ }).promise()
+ },
+ then: function(t, n, r) {
+ var u = 0;
+ function l(i, o, a, s) {
+ return function() {
+ var n = this,
+ r = arguments,
+ e = function() {
+ var e,
+ t;
+ if (!(i < u)) {
+ if ((e = a.apply(n, r)) === o.promise())
+ throw new TypeError("Thenable self-resolution");
+ t = e && ("object" == typeof e || "function" == typeof e) && e.then,
+ v(t) ? s ? t.call(e, l(u, o, N, s), l(u, o, q, s)) : (u++, t.call(e, l(u, o, N, s), l(u, o, q, s), l(u, o, N, o.notifyWith))) : (a !== N && (n = void 0, r = [e]), (s || o.resolveWith)(n, r))
+ }
+ },
+ t = s ? e : function() {
+ try {
+ e()
+ } catch (e) {
+ ce.Deferred.exceptionHook && ce.Deferred.exceptionHook(e, t.error),
+ u <= i + 1 && (a !== q && (n = void 0, r = [e]), o.rejectWith(n, r))
+ }
+ };
+ i ? t() : (ce.Deferred.getErrorHook ? t.error = ce.Deferred.getErrorHook() : ce.Deferred.getStackHook && (t.error = ce.Deferred.getStackHook()), ie.setTimeout(t))
+ }
+ }
+ return ce.Deferred(function(e) {
+ o[0][3].add(l(0, e, v(r) ? r : N, e.notifyWith)),
+ o[1][3].add(l(0, e, v(t) ? t : N)),
+ o[2][3].add(l(0, e, v(n) ? n : q))
+ }).promise()
+ },
+ promise: function(e) {
+ return null != e ? ce.extend(e, a) : a
+ }
+ },
+ s = {};
+ return ce.each(o, function(e, t) {
+ var n = t[2],
+ r = t[5];
+ a[t[1]] = n.add,
+ r && n.add(function() {
+ i = r
+ }, o[3 - e][2].disable, o[3 - e][3].disable, o[0][2].lock, o[0][3].lock),
+ n.add(t[3].fire),
+ s[t[0]] = function() {
+ return s[t[0] + "With"](this === s ? void 0 : this, arguments), this
+ },
+ s[t[0] + "With"] = n.fireWith
+ }), a.promise(s), e && e.call(s, s), s
+ },
+ when: function(e) {
+ var n = arguments.length,
+ t = n,
+ r = Array(t),
+ i = ae.call(arguments),
+ o = ce.Deferred(),
+ a = function(t) {
+ return function(e) {
+ r[t] = this,
+ i[t] = 1 < arguments.length ? ae.call(arguments) : e,
+ --n || o.resolveWith(r, i)
+ }
+ };
+ if (n <= 1 && (L(e, o.done(a(t)).resolve, o.reject, !n), "pending" === o.state() || v(i[t] && i[t].then)))
+ return o.then();
+ while (t--)
+ L(i[t], a(t), o.reject);
+ return o.promise()
+ }
+ });
+ var H = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
+ ce.Deferred.exceptionHook = function(e, t) {
+ ie.console && ie.console.warn && e && H.test(e.name) && ie.console.warn("jQuery.Deferred exception: " + e.message, e.stack, t)
+ },
+ ce.readyException = function(e) {
+ ie.setTimeout(function() {
+ throw e
+ })
+ };
+ var O = ce.Deferred();
+ function P() {
+ C.removeEventListener("DOMContentLoaded", P),
+ ie.removeEventListener("load", P),
+ ce.ready()
+ }
+ ce.fn.ready = function(e) {
+ return O.then(e)["catch"](function(e) {
+ ce.readyException(e)
+ }), this
+ },
+ ce.extend({
+ isReady: !1,
+ readyWait: 1,
+ ready: function(e) {
+ (!0 === e ? --ce.readyWait : ce.isReady) || (ce.isReady = !0) !== e && 0 < --ce.readyWait || O.resolveWith(C, [ce])
+ }
+ }),
+ ce.ready.then = O.then,
+ "complete" === C.readyState || "loading" !== C.readyState && !C.documentElement.doScroll ? ie.setTimeout(ce.ready) : (C.addEventListener("DOMContentLoaded", P), ie.addEventListener("load", P));
+ var M = function(e, t, n, r, i, o, a) {
+ var s = 0,
+ u = e.length,
+ l = null == n;
+ if ("object" === x(n))
+ for (s in i = !0, n)
+ M(e, t, s, n[s], !0, o, a);
+ else if (void 0 !== r && (i = !0, v(r) || (a = !0), l && (a ? (t.call(e, r), t = null) : (l = t, t = function(e, t, n) {
+ return l.call(ce(e), n)
+ })), t))
+ for (; s < u; s++)
+ t(e[s], n, a ? r : r.call(e[s], s, t(e[s], n)));
+ return i ? e : l ? t.call(e) : u ? t(e[0], n) : o
+ },
+ R = /^-ms-/,
+ I = /-([a-z])/g;
+ function W(e, t) {
+ return t.toUpperCase()
+ }
+ function F(e) {
+ return e.replace(R, "ms-").replace(I, W)
+ }
+ var $ = function(e) {
+ return 1 === e.nodeType || 9 === e.nodeType || !+e.nodeType
+ };
+ function B() {
+ this.expando = ce.expando + B.uid++
+ }
+ B.uid = 1,
+ B.prototype = {
+ cache: function(e) {
+ var t = e[this.expando];
+ return t || (t = {}, $(e) && (e.nodeType ? e[this.expando] = t : Object.defineProperty(e, this.expando, {
+ value: t,
+ configurable: !0
+ }))), t
+ },
+ set: function(e, t, n) {
+ var r,
+ i = this.cache(e);
+ if ("string" == typeof t)
+ i[F(t)] = n;
+ else
+ for (r in t)
+ i[F(r)] = t[r];
+ return i
+ },
+ get: function(e, t) {
+ return void 0 === t ? this.cache(e) : e[this.expando] && e[this.expando][F(t)]
+ },
+ access: function(e, t, n) {
+ return void 0 === t || t && "string" == typeof t && void 0 === n ? this.get(e, t) : (this.set(e, t, n), void 0 !== n ? n : t)
+ },
+ remove: function(e, t) {
+ var n,
+ r = e[this.expando];
+ if (void 0 !== r) {
+ if (void 0 !== t) {
+ n = (t = Array.isArray(t) ? t.map(F) : (t = F(t)) in r ? [t] : t.match(D) || []).length;
+ while (n--)
+ delete r[t[n]]
+ }
+ (void 0 === t || ce.isEmptyObject(r)) && (e.nodeType ? e[this.expando] = void 0 : delete e[this.expando])
+ }
+ },
+ hasData: function(e) {
+ var t = e[this.expando];
+ return void 0 !== t && !ce.isEmptyObject(t)
+ }
+ };
+ var _ = new B,
+ z = new B,
+ X = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ U = /[A-Z]/g;
+ function V(e, t, n) {
+ var r,
+ i;
+ if (void 0 === n && 1 === e.nodeType)
+ if (r = "data-" + t.replace(U, "-$&").toLowerCase(), "string" == typeof (n = e.getAttribute(r))) {
+ try {
+ n = "true" === (i = n) || "false" !== i && ("null" === i ? null : i === +i + "" ? +i : X.test(i) ? JSON.parse(i) : i)
+ } catch (e) {}
+ z.set(e, t, n)
+ } else
+ n = void 0;
+ return n
+ }
+ ce.extend({
+ hasData: function(e) {
+ return z.hasData(e) || _.hasData(e)
+ },
+ data: function(e, t, n) {
+ return z.access(e, t, n)
+ },
+ removeData: function(e, t) {
+ z.remove(e, t)
+ },
+ _data: function(e, t, n) {
+ return _.access(e, t, n)
+ },
+ _removeData: function(e, t) {
+ _.remove(e, t)
+ }
+ }),
+ ce.fn.extend({
+ data: function(n, e) {
+ var t,
+ r,
+ i,
+ o = this[0],
+ a = o && o.attributes;
+ if (void 0 === n) {
+ if (this.length && (i = z.get(o), 1 === o.nodeType && !_.get(o, "hasDataAttrs"))) {
+ t = a.length;
+ while (t--)
+ a[t] && 0 === (r = a[t].name).indexOf("data-") && (r = F(r.slice(5)), V(o, r, i[r]));
+ _.set(o, "hasDataAttrs", !0)
+ }
+ return i
+ }
+ return "object" == typeof n ? this.each(function() {
+ z.set(this, n)
+ }) : M(this, function(e) {
+ var t;
+ if (o && void 0 === e)
+ return void 0 !== (t = z.get(o, n)) ? t : void 0 !== (t = V(o, n)) ? t : void 0;
+ this.each(function() {
+ z.set(this, n, e)
+ })
+ }, null, e, 1 < arguments.length, null, !0)
+ },
+ removeData: function(e) {
+ return this.each(function() {
+ z.remove(this, e)
+ })
+ }
+ }),
+ ce.extend({
+ queue: function(e, t, n) {
+ var r;
+ if (e)
+ return t = (t || "fx") + "queue", r = _.get(e, t), n && (!r || Array.isArray(n) ? r = _.access(e, t, ce.makeArray(n)) : r.push(n)), r || []
+ },
+ dequeue: function(e, t) {
+ t = t || "fx";
+ var n = ce.queue(e, t),
+ r = n.length,
+ i = n.shift(),
+ o = ce._queueHooks(e, t);
+ "inprogress" === i && (i = n.shift(), r--),
+ i && ("fx" === t && n.unshift("inprogress"), delete o.stop, i.call(e, function() {
+ ce.dequeue(e, t)
+ }, o)),
+ !r && o && o.empty.fire()
+ },
+ _queueHooks: function(e, t) {
+ var n = t + "queueHooks";
+ return _.get(e, n) || _.access(e, n, {
+ empty: ce.Callbacks("once memory").add(function() {
+ _.remove(e, [t + "queue", n])
+ })
+ })
+ }
+ }),
+ ce.fn.extend({
+ queue: function(t, n) {
+ var e = 2;
+ return "string" != typeof t && (n = t, t = "fx", e--), arguments.length < e ? ce.queue(this[0], t) : void 0 === n ? this : this.each(function() {
+ var e = ce.queue(this, t, n);
+ ce._queueHooks(this, t),
+ "fx" === t && "inprogress" !== e[0] && ce.dequeue(this, t)
+ })
+ },
+ dequeue: function(e) {
+ return this.each(function() {
+ ce.dequeue(this, e)
+ })
+ },
+ clearQueue: function(e) {
+ return this.queue(e || "fx", [])
+ },
+ promise: function(e, t) {
+ var n,
+ r = 1,
+ i = ce.Deferred(),
+ o = this,
+ a = this.length,
+ s = function() {
+ --r || i.resolveWith(o, [o])
+ };
+ "string" != typeof e && (t = e, e = void 0),
+ e = e || "fx";
+ while (a--)
+ (n = _.get(o[a], e + "queueHooks")) && n.empty && (r++, n.empty.add(s));
+ return s(), i.promise(t)
+ }
+ });
+ var G = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
+ Y = new RegExp("^(?:([+-])=|)(" + G + ")([a-z%]*)$", "i"),
+ Q = ["Top", "Right", "Bottom", "Left"],
+ J = C.documentElement,
+ K = function(e) {
+ return ce.contains(e.ownerDocument, e)
+ },
+ Z = {
+ composed: !0
+ };
+ J.getRootNode && (K = function(e) {
+ return ce.contains(e.ownerDocument, e) || e.getRootNode(Z) === e.ownerDocument
+ });
+ var ee = function(e, t) {
+ return "none" === (e = t || e).style.display || "" === e.style.display && K(e) && "none" === ce.css(e, "display")
+ };
+ function te(e, t, n, r) {
+ var i,
+ o,
+ a = 20,
+ s = r ? function() {
+ return r.cur()
+ } : function() {
+ return ce.css(e, t, "")
+ },
+ u = s(),
+ l = n && n[3] || (ce.cssNumber[t] ? "" : "px"),
+ c = e.nodeType && (ce.cssNumber[t] || "px" !== l && +u) && Y.exec(ce.css(e, t));
+ if (c && c[3] !== l) {
+ u /= 2,
+ l = l || c[3],
+ c = +u || 1;
+ while (a--)
+ ce.style(e, t, c + l),
+ (1 - o) * (1 - (o = s() / u || .5)) <= 0 && (a = 0),
+ c /= o;
+ c *= 2,
+ ce.style(e, t, c + l),
+ n = n || []
+ }
+ return n && (c = +c || +u || 0, i = n[1] ? c + (n[1] + 1) * n[2] : +n[2], r && (r.unit = l, r.start = c, r.end = i)), i
+ }
+ var ne = {};
+ function re(e, t) {
+ for (var n, r, i, o, a, s, u, l = [], c = 0, f = e.length; c < f; c++)
+ (r = e[c]).style && (n = r.style.display, t ? ("none" === n && (l[c] = _.get(r, "display") || null, l[c] || (r.style.display = "")), "" === r.style.display && ee(r) && (l[c] = (u = a = o = void 0, a = (i = r).ownerDocument, s = i.nodeName, (u = ne[s]) || (o = a.body.appendChild(a.createElement(s)), u = ce.css(o, "display"), o.parentNode.removeChild(o), "none" === u && (u = "block"), ne[s] = u)))) : "none" !== n && (l[c] = "none", _.set(r, "display", n)));
+ for (c = 0; c < f; c++)
+ null != l[c] && (e[c].style.display = l[c]);
+ return e
+ }
+ ce.fn.extend({
+ show: function() {
+ return re(this, !0)
+ },
+ hide: function() {
+ return re(this)
+ },
+ toggle: function(e) {
+ return "boolean" == typeof e ? e ? this.show() : this.hide() : this.each(function() {
+ ee(this) ? ce(this).show() : ce(this).hide()
+ })
+ }
+ });
+ var xe,
+ be,
+ we = /^(?:checkbox|radio)$/i,
+ Te = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i,
+ Ce = /^$|^module$|\/(?:java|ecma)script/i;
+ xe = C.createDocumentFragment().appendChild(C.createElement("div")),
+ (be = C.createElement("input")).setAttribute("type", "radio"),
+ be.setAttribute("checked", "checked"),
+ be.setAttribute("name", "t"),
+ xe.appendChild(be),
+ le.checkClone = xe.cloneNode(!0).cloneNode(!0).lastChild.checked,
+ xe.innerHTML = "",
+ le.noCloneChecked = !!xe.cloneNode(!0).lastChild.defaultValue,
+ xe.innerHTML = "",
+ le.option = !!xe.lastChild;
+ var ke = {
+ thead: [1, ""],
+ col: [2, ""],
+ tr: [2, ""],
+ td: [3, ""],
+ _default: [0, "", ""]
+ };
+ function Se(e, t) {
+ var n;
+ return n = "undefined" != typeof e.getElementsByTagName ? e.getElementsByTagName(t || "*") : "undefined" != typeof e.querySelectorAll ? e.querySelectorAll(t || "*") : [], void 0 === t || t && fe(e, t) ? ce.merge([e], n) : n
+ }
+ function Ee(e, t) {
+ for (var n = 0, r = e.length; n < r; n++)
+ _.set(e[n], "globalEval", !t || _.get(t[n], "globalEval"))
+ }
+ ke.tbody = ke.tfoot = ke.colgroup = ke.caption = ke.thead,
+ ke.th = ke.td,
+ le.option || (ke.optgroup = ke.option = [1, ""]);
+ var je = /<|?\w+;/;
+ function Ae(e, t, n, r, i) {
+ for (var o, a, s, u, l, c, f = t.createDocumentFragment(), p = [], d = 0, h = e.length; d < h; d++)
+ if ((o = e[d]) || 0 === o)
+ if ("object" === x(o))
+ ce.merge(p, o.nodeType ? [o] : o);
+ else if (je.test(o)) {
+ a = a || f.appendChild(t.createElement("div")),
+ s = (Te.exec(o) || ["", ""])[1].toLowerCase(),
+ u = ke[s] || ke._default,
+ a.innerHTML = u[1] + ce.htmlPrefilter(o) + u[2],
+ c = u[0];
+ while (c--)
+ a = a.lastChild;
+ ce.merge(p, a.childNodes),
+ (a = f.firstChild).textContent = ""
+ } else
+ p.push(t.createTextNode(o));
+ f.textContent = "",
+ d = 0;
+ while (o = p[d++])
+ if (r && -1 < ce.inArray(o, r))
+ i && i.push(o);
+ else if (l = K(o), a = Se(f.appendChild(o), "script"), l && Ee(a), n) {
+ c = 0;
+ while (o = a[c++])
+ Ce.test(o.type || "") && n.push(o)
+ }
+ return f
+ }
+ var De = /^([^.]*)(?:\.(.+)|)/;
+ function Ne() {
+ return !0
+ }
+ function qe() {
+ return !1
+ }
+ function Le(e, t, n, r, i, o) {
+ var a,
+ s;
+ if ("object" == typeof t) {
+ for (s in "string" != typeof n && (r = r || n, n = void 0), t)
+ Le(e, s, n, r, t[s], o);
+ return e
+ }
+ if (null == r && null == i ? (i = n, r = n = void 0) : null == i && ("string" == typeof n ? (i = r, r = void 0) : (i = r, r = n, n = void 0)), !1 === i)
+ i = qe;
+ else if (!i)
+ return e;
+ return 1 === o && (a = i, (i = function(e) {
+ return ce().off(e), a.apply(this, arguments)
+ }).guid = a.guid || (a.guid = ce.guid++)), e.each(function() {
+ ce.event.add(this, t, i, r, n)
+ })
+ }
+ function He(e, r, t) {
+ t ? (_.set(e, r, !1), ce.event.add(e, r, {
+ namespace: !1,
+ handler: function(e) {
+ var t,
+ n = _.get(this, r);
+ if (1 & e.isTrigger && this[r]) {
+ if (n)
+ (ce.event.special[r] || {}).delegateType && e.stopPropagation();
+ else if (n = ae.call(arguments), _.set(this, r, n), this[r](), t = _.get(this, r), _.set(this, r, !1), n !== t)
+ return e.stopImmediatePropagation(), e.preventDefault(), t
+ } else
+ n && (_.set(this, r, ce.event.trigger(n[0], n.slice(1), this)), e.stopPropagation(), e.isImmediatePropagationStopped = Ne)
+ }
+ })) : void 0 === _.get(e, r) && ce.event.add(e, r, Ne)
+ }
+ ce.event = {
+ global: {},
+ add: function(t, e, n, r, i) {
+ var o,
+ a,
+ s,
+ u,
+ l,
+ c,
+ f,
+ p,
+ d,
+ h,
+ g,
+ v = _.get(t);
+ if ($(t)) {
+ n.handler && (n = (o = n).handler, i = o.selector),
+ i && ce.find.matchesSelector(J, i),
+ n.guid || (n.guid = ce.guid++),
+ (u = v.events) || (u = v.events = Object.create(null)),
+ (a = v.handle) || (a = v.handle = function(e) {
+ return "undefined" != typeof ce && ce.event.triggered !== e.type ? ce.event.dispatch.apply(t, arguments) : void 0
+ }),
+ l = (e = (e || "").match(D) || [""]).length;
+ while (l--)
+ d = g = (s = De.exec(e[l]) || [])[1],
+ h = (s[2] || "").split(".").sort(),
+ d && (f = ce.event.special[d] || {}, d = (i ? f.delegateType : f.bindType) || d, f = ce.event.special[d] || {}, c = ce.extend({
+ type: d,
+ origType: g,
+ data: r,
+ handler: n,
+ guid: n.guid,
+ selector: i,
+ needsContext: i && ce.expr.match.needsContext.test(i),
+ namespace: h.join(".")
+ }, o), (p = u[d]) || ((p = u[d] = []).delegateCount = 0, f.setup && !1 !== f.setup.call(t, r, h, a) || t.addEventListener && t.addEventListener(d, a)), f.add && (f.add.call(t, c), c.handler.guid || (c.handler.guid = n.guid)), i ? p.splice(p.delegateCount++, 0, c) : p.push(c), ce.event.global[d] = !0)
+ }
+ },
+ remove: function(e, t, n, r, i) {
+ var o,
+ a,
+ s,
+ u,
+ l,
+ c,
+ f,
+ p,
+ d,
+ h,
+ g,
+ v = _.hasData(e) && _.get(e);
+ if (v && (u = v.events)) {
+ l = (t = (t || "").match(D) || [""]).length;
+ while (l--)
+ if (d = g = (s = De.exec(t[l]) || [])[1], h = (s[2] || "").split(".").sort(), d) {
+ f = ce.event.special[d] || {},
+ p = u[d = (r ? f.delegateType : f.bindType) || d] || [],
+ s = s[2] && new RegExp("(^|\\.)" + h.join("\\.(?:.*\\.|)") + "(\\.|$)"),
+ a = o = p.length;
+ while (o--)
+ c = p[o],
+ !i && g !== c.origType || n && n.guid !== c.guid || s && !s.test(c.namespace) || r && r !== c.selector && ("**" !== r || !c.selector) || (p.splice(o, 1), c.selector && p.delegateCount--, f.remove && f.remove.call(e, c));
+ a && !p.length && (f.teardown && !1 !== f.teardown.call(e, h, v.handle) || ce.removeEvent(e, d, v.handle), delete u[d])
+ } else
+ for (d in u)
+ ce.event.remove(e, d + t[l], n, r, !0);
+ ce.isEmptyObject(u) && _.remove(e, "handle events")
+ }
+ },
+ dispatch: function(e) {
+ var t,
+ n,
+ r,
+ i,
+ o,
+ a,
+ s = new Array(arguments.length),
+ u = ce.event.fix(e),
+ l = (_.get(this, "events") || Object.create(null))[u.type] || [],
+ c = ce.event.special[u.type] || {};
+ for (s[0] = u, t = 1; t < arguments.length; t++)
+ s[t] = arguments[t];
+ if (u.delegateTarget = this, !c.preDispatch || !1 !== c.preDispatch.call(this, u)) {
+ a = ce.event.handlers.call(this, u, l),
+ t = 0;
+ while ((i = a[t++]) && !u.isPropagationStopped()) {
+ u.currentTarget = i.elem,
+ n = 0;
+ while ((o = i.handlers[n++]) && !u.isImmediatePropagationStopped())
+ u.rnamespace && !1 !== o.namespace && !u.rnamespace.test(o.namespace) || (u.handleObj = o, u.data = o.data, void 0 !== (r = ((ce.event.special[o.origType] || {}).handle || o.handler).apply(i.elem, s)) && !1 === (u.result = r) && (u.preventDefault(), u.stopPropagation()))
+ }
+ return c.postDispatch && c.postDispatch.call(this, u), u.result
+ }
+ },
+ handlers: function(e, t) {
+ var n,
+ r,
+ i,
+ o,
+ a,
+ s = [],
+ u = t.delegateCount,
+ l = e.target;
+ if (u && l.nodeType && !("click" === e.type && 1 <= e.button))
+ for (; l !== this; l = l.parentNode || this)
+ if (1 === l.nodeType && ("click" !== e.type || !0 !== l.disabled)) {
+ for (o = [], a = {}, n = 0; n < u; n++)
+ void 0 === a[i = (r = t[n]).selector + " "] && (a[i] = r.needsContext ? -1 < ce(i, this).index(l) : ce.find(i, this, null, [l]).length),
+ a[i] && o.push(r);
+ o.length && s.push({
+ elem: l,
+ handlers: o
+ })
+ }
+ return l = this, u < t.length && s.push({
+ elem: l,
+ handlers: t.slice(u)
+ }), s
+ },
+ addProp: function(t, e) {
+ Object.defineProperty(ce.Event.prototype, t, {
+ enumerable: !0,
+ configurable: !0,
+ get: v(e) ? function() {
+ if (this.originalEvent)
+ return e(this.originalEvent)
+ } : function() {
+ if (this.originalEvent)
+ return this.originalEvent[t]
+ },
+ set: function(e) {
+ Object.defineProperty(this, t, {
+ enumerable: !0,
+ configurable: !0,
+ writable: !0,
+ value: e
+ })
+ }
+ })
+ },
+ fix: function(e) {
+ return e[ce.expando] ? e : new ce.Event(e)
+ },
+ special: {
+ load: {
+ noBubble: !0
+ },
+ click: {
+ setup: function(e) {
+ var t = this || e;
+ return we.test(t.type) && t.click && fe(t, "input") && He(t, "click", !0), !1
+ },
+ trigger: function(e) {
+ var t = this || e;
+ return we.test(t.type) && t.click && fe(t, "input") && He(t, "click"), !0
+ },
+ _default: function(e) {
+ var t = e.target;
+ return we.test(t.type) && t.click && fe(t, "input") && _.get(t, "click") || fe(t, "a")
+ }
+ },
+ beforeunload: {
+ postDispatch: function(e) {
+ void 0 !== e.result && e.originalEvent && (e.originalEvent.returnValue = e.result)
+ }
+ }
+ }
+ },
+ ce.removeEvent = function(e, t, n) {
+ e.removeEventListener && e.removeEventListener(t, n)
+ },
+ ce.Event = function(e, t) {
+ if (!(this instanceof ce.Event))
+ return new ce.Event(e, t);
+ e && e.type ? (this.originalEvent = e, this.type = e.type, this.isDefaultPrevented = e.defaultPrevented || void 0 === e.defaultPrevented && !1 === e.returnValue ? Ne : qe, this.target = e.target && 3 === e.target.nodeType ? e.target.parentNode : e.target, this.currentTarget = e.currentTarget, this.relatedTarget = e.relatedTarget) : this.type = e,
+ t && ce.extend(this, t),
+ this.timeStamp = e && e.timeStamp || Date.now(),
+ this[ce.expando] = !0
+ },
+ ce.Event.prototype = {
+ constructor: ce.Event,
+ isDefaultPrevented: qe,
+ isPropagationStopped: qe,
+ isImmediatePropagationStopped: qe,
+ isSimulated: !1,
+ preventDefault: function() {
+ var e = this.originalEvent;
+ this.isDefaultPrevented = Ne,
+ e && !this.isSimulated && e.preventDefault()
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+ this.isPropagationStopped = Ne,
+ e && !this.isSimulated && e.stopPropagation()
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+ this.isImmediatePropagationStopped = Ne,
+ e && !this.isSimulated && e.stopImmediatePropagation(),
+ this.stopPropagation()
+ }
+ },
+ ce.each({
+ altKey: !0,
+ bubbles: !0,
+ cancelable: !0,
+ changedTouches: !0,
+ ctrlKey: !0,
+ detail: !0,
+ eventPhase: !0,
+ metaKey: !0,
+ pageX: !0,
+ pageY: !0,
+ shiftKey: !0,
+ view: !0,
+ "char": !0,
+ code: !0,
+ charCode: !0,
+ key: !0,
+ keyCode: !0,
+ button: !0,
+ buttons: !0,
+ clientX: !0,
+ clientY: !0,
+ offsetX: !0,
+ offsetY: !0,
+ pointerId: !0,
+ pointerType: !0,
+ screenX: !0,
+ screenY: !0,
+ targetTouches: !0,
+ toElement: !0,
+ touches: !0,
+ which: !0
+ }, ce.event.addProp),
+ ce.each({
+ focus: "focusin",
+ blur: "focusout"
+ }, function(r, i) {
+ function o(e) {
+ if (C.documentMode) {
+ var t = _.get(this, "handle"),
+ n = ce.event.fix(e);
+ n.type = "focusin" === e.type ? "focus" : "blur",
+ n.isSimulated = !0,
+ t(e),
+ n.target === n.currentTarget && t(n)
+ } else
+ ce.event.simulate(i, e.target, ce.event.fix(e))
+ }
+ ce.event.special[r] = {
+ setup: function() {
+ var e;
+ if (He(this, r, !0), !C.documentMode)
+ return !1;
+ (e = _.get(this, i)) || this.addEventListener(i, o),
+ _.set(this, i, (e || 0) + 1)
+ },
+ trigger: function() {
+ return He(this, r), !0
+ },
+ teardown: function() {
+ var e;
+ if (!C.documentMode)
+ return !1;
+ (e = _.get(this, i) - 1) ? _.set(this, i, e) : (this.removeEventListener(i, o), _.remove(this, i))
+ },
+ _default: function(e) {
+ return _.get(e.target, r)
+ },
+ delegateType: i
+ },
+ ce.event.special[i] = {
+ setup: function() {
+ var e = this.ownerDocument || this.document || this,
+ t = C.documentMode ? this : e,
+ n = _.get(t, i);
+ n || (C.documentMode ? this.addEventListener(i, o) : e.addEventListener(r, o, !0)),
+ _.set(t, i, (n || 0) + 1)
+ },
+ teardown: function() {
+ var e = this.ownerDocument || this.document || this,
+ t = C.documentMode ? this : e,
+ n = _.get(t, i) - 1;
+ n ? _.set(t, i, n) : (C.documentMode ? this.removeEventListener(i, o) : e.removeEventListener(r, o, !0), _.remove(t, i))
+ }
+ }
+ }),
+ ce.each({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+ }, function(e, i) {
+ ce.event.special[e] = {
+ delegateType: i,
+ bindType: i,
+ handle: function(e) {
+ var t,
+ n = e.relatedTarget,
+ r = e.handleObj;
+ return n && (n === this || ce.contains(this, n)) || (e.type = r.origType, t = r.handler.apply(this, arguments), e.type = i), t
+ }
+ }
+ }),
+ ce.fn.extend({
+ on: function(e, t, n, r) {
+ return Le(this, e, t, n, r)
+ },
+ one: function(e, t, n, r) {
+ return Le(this, e, t, n, r, 1)
+ },
+ off: function(e, t, n) {
+ var r,
+ i;
+ if (e && e.preventDefault && e.handleObj)
+ return r = e.handleObj, ce(e.delegateTarget).off(r.namespace ? r.origType + "." + r.namespace : r.origType, r.selector, r.handler), this;
+ if ("object" == typeof e) {
+ for (i in e)
+ this.off(i, t, e[i]);
+ return this
+ }
+ return !1 !== t && "function" != typeof t || (n = t, t = void 0), !1 === n && (n = qe), this.each(function() {
+ ce.event.remove(this, e, n, t)
+ })
+ }
+ });
+ var Oe = /
+
+
+
+
+ {{ config('app.siteTitle') }} - {{ config('app.name') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @include("/widget/head")
+
+
+ @if (count($aList) == 0)
+
+ @else
+
+
+
+
+ @if (@$aTag['name'])
+
+ @endif
+
+ @if ($search)
+
+ @endif
+
+ @if ($sTypeSub)
+
+
+
+
{{$sTypeSub}}{{count($aList)}}
+
+
+ @endif
+
+
+
+ @include("/article/listAjax")
+
+
+
+
+
+
+
+
+
+
+ @endif
+
+
+ @include("/widget/foot")
+
+
+
+
+
+