Browse Source

Merge pull request #2321 from SSPanel-UIM/dev

Dev 20231219
M1Screw 1 year ago
parent
commit
aaf8e77f33

+ 111 - 90
composer.lock

@@ -123,16 +123,16 @@
         },
         },
         {
         {
             "name": "aws/aws-sdk-php",
             "name": "aws/aws-sdk-php",
-            "version": "3.293.5",
+            "version": "3.294.1",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
                 "url": "https://github.com/aws/aws-sdk-php.git",
                 "url": "https://github.com/aws/aws-sdk-php.git",
-                "reference": "f2002e52b382b45231da3f9552033f769acfebd8"
+                "reference": "63c720229a9c9cdedff6bac98d6e72be8cc241f1"
             },
             },
             "dist": {
             "dist": {
                 "type": "zip",
                 "type": "zip",
-                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/f2002e52b382b45231da3f9552033f769acfebd8",
-                "reference": "f2002e52b382b45231da3f9552033f769acfebd8",
+                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/63c720229a9c9cdedff6bac98d6e72be8cc241f1",
+                "reference": "63c720229a9c9cdedff6bac98d6e72be8cc241f1",
                 "shasum": ""
                 "shasum": ""
             },
             },
             "require": {
             "require": {
@@ -212,9 +212,9 @@
             "support": {
             "support": {
                 "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
                 "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
                 "issues": "https://github.com/aws/aws-sdk-php/issues",
                 "issues": "https://github.com/aws/aws-sdk-php/issues",
-                "source": "https://github.com/aws/aws-sdk-php/tree/3.293.5"
+                "source": "https://github.com/aws/aws-sdk-php/tree/3.294.1"
             },
             },
-            "time": "2023-12-06T19:09:15+00:00"
+            "time": "2023-12-15T19:25:52+00:00"
         },
         },
         {
         {
             "name": "bacon/bacon-qr-code",
             "name": "bacon/bacon-qr-code",
@@ -394,16 +394,16 @@
         },
         },
         {
         {
             "name": "carbonphp/carbon-doctrine-types",
             "name": "carbonphp/carbon-doctrine-types",
-            "version": "3.0.0",
+            "version": "3.1.0",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
                 "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git",
                 "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git",
-                "reference": "49856fbc09fe91b5433381faec60e3620ad364ad"
+                "reference": "a31d3358a2a5d6ae947df1691d1f321418a5f3d5"
             },
             },
             "dist": {
             "dist": {
                 "type": "zip",
                 "type": "zip",
-                "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/49856fbc09fe91b5433381faec60e3620ad364ad",
-                "reference": "49856fbc09fe91b5433381faec60e3620ad364ad",
+                "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/a31d3358a2a5d6ae947df1691d1f321418a5f3d5",
+                "reference": "a31d3358a2a5d6ae947df1691d1f321418a5f3d5",
                 "shasum": ""
                 "shasum": ""
             },
             },
             "require": {
             "require": {
@@ -443,7 +443,7 @@
             ],
             ],
             "support": {
             "support": {
                 "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues",
                 "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues",
-                "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.0.0"
+                "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.1.0"
             },
             },
             "funding": [
             "funding": [
                 {
                 {
@@ -459,7 +459,7 @@
                     "type": "tidelift"
                     "type": "tidelift"
                 }
                 }
             ],
             ],
-            "time": "2023-10-01T14:36:55+00:00"
+            "time": "2023-12-10T15:33:53+00:00"
         },
         },
         {
         {
             "name": "clue/stream-filter",
             "name": "clue/stream-filter",
@@ -529,16 +529,16 @@
         },
         },
         {
         {
             "name": "composer/ca-bundle",
             "name": "composer/ca-bundle",
-            "version": "1.3.7",
+            "version": "1.4.0",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
                 "url": "https://github.com/composer/ca-bundle.git",
                 "url": "https://github.com/composer/ca-bundle.git",
-                "reference": "76e46335014860eec1aa5a724799a00a2e47cc85"
+                "reference": "b66d11b7479109ab547f9405b97205640b17d385"
             },
             },
             "dist": {
             "dist": {
                 "type": "zip",
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/ca-bundle/zipball/76e46335014860eec1aa5a724799a00a2e47cc85",
-                "reference": "76e46335014860eec1aa5a724799a00a2e47cc85",
+                "url": "https://api.github.com/repos/composer/ca-bundle/zipball/b66d11b7479109ab547f9405b97205640b17d385",
+                "reference": "b66d11b7479109ab547f9405b97205640b17d385",
                 "shasum": ""
                 "shasum": ""
             },
             },
             "require": {
             "require": {
@@ -550,7 +550,7 @@
                 "phpstan/phpstan": "^0.12.55",
                 "phpstan/phpstan": "^0.12.55",
                 "psr/log": "^1.0",
                 "psr/log": "^1.0",
                 "symfony/phpunit-bridge": "^4.2 || ^5",
                 "symfony/phpunit-bridge": "^4.2 || ^5",
-                "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0"
+                "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0"
             },
             },
             "type": "library",
             "type": "library",
             "extra": {
             "extra": {
@@ -585,7 +585,7 @@
             "support": {
             "support": {
                 "irc": "irc://irc.freenode.org/composer",
                 "irc": "irc://irc.freenode.org/composer",
                 "issues": "https://github.com/composer/ca-bundle/issues",
                 "issues": "https://github.com/composer/ca-bundle/issues",
-                "source": "https://github.com/composer/ca-bundle/tree/1.3.7"
+                "source": "https://github.com/composer/ca-bundle/tree/1.4.0"
             },
             },
             "funding": [
             "funding": [
                 {
                 {
@@ -601,7 +601,7 @@
                     "type": "tidelift"
                     "type": "tidelift"
                 }
                 }
             ],
             ],
-            "time": "2023-08-30T09:31:38+00:00"
+            "time": "2023-12-18T12:05:55+00:00"
         },
         },
         {
         {
             "name": "dasprid/enum",
             "name": "dasprid/enum",
@@ -1200,7 +1200,7 @@
         },
         },
         {
         {
             "name": "illuminate/collections",
             "name": "illuminate/collections",
-            "version": "v10.35.0",
+            "version": "v10.37.3",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
                 "url": "https://github.com/illuminate/collections.git",
                 "url": "https://github.com/illuminate/collections.git",
@@ -1255,7 +1255,7 @@
         },
         },
         {
         {
             "name": "illuminate/conditionable",
             "name": "illuminate/conditionable",
-            "version": "v10.35.0",
+            "version": "v10.37.3",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
                 "url": "https://github.com/illuminate/conditionable.git",
                 "url": "https://github.com/illuminate/conditionable.git",
@@ -1301,7 +1301,7 @@
         },
         },
         {
         {
             "name": "illuminate/container",
             "name": "illuminate/container",
-            "version": "v10.35.0",
+            "version": "v10.37.3",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
                 "url": "https://github.com/illuminate/container.git",
                 "url": "https://github.com/illuminate/container.git",
@@ -1352,7 +1352,7 @@
         },
         },
         {
         {
             "name": "illuminate/contracts",
             "name": "illuminate/contracts",
-            "version": "v10.35.0",
+            "version": "v10.37.3",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
                 "url": "https://github.com/illuminate/contracts.git",
                 "url": "https://github.com/illuminate/contracts.git",
@@ -1400,16 +1400,16 @@
         },
         },
         {
         {
             "name": "illuminate/database",
             "name": "illuminate/database",
-            "version": "v10.35.0",
+            "version": "v10.37.3",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
                 "url": "https://github.com/illuminate/database.git",
                 "url": "https://github.com/illuminate/database.git",
-                "reference": "3368e28e7ecc5b66fc749104ce75982971823216"
+                "reference": "dff792e535f4a581d89b027bed5bb26972a5c056"
             },
             },
             "dist": {
             "dist": {
                 "type": "zip",
                 "type": "zip",
-                "url": "https://api.github.com/repos/illuminate/database/zipball/3368e28e7ecc5b66fc749104ce75982971823216",
-                "reference": "3368e28e7ecc5b66fc749104ce75982971823216",
+                "url": "https://api.github.com/repos/illuminate/database/zipball/dff792e535f4a581d89b027bed5bb26972a5c056",
+                "reference": "dff792e535f4a581d89b027bed5bb26972a5c056",
                 "shasum": ""
                 "shasum": ""
             },
             },
             "require": {
             "require": {
@@ -1465,11 +1465,11 @@
                 "issues": "https://github.com/laravel/framework/issues",
                 "issues": "https://github.com/laravel/framework/issues",
                 "source": "https://github.com/laravel/framework"
                 "source": "https://github.com/laravel/framework"
             },
             },
-            "time": "2023-12-04T22:26:42+00:00"
+            "time": "2023-12-13T12:12:40+00:00"
         },
         },
         {
         {
             "name": "illuminate/macroable",
             "name": "illuminate/macroable",
-            "version": "v10.35.0",
+            "version": "v10.37.3",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
                 "url": "https://github.com/illuminate/macroable.git",
                 "url": "https://github.com/illuminate/macroable.git",
@@ -1515,7 +1515,7 @@
         },
         },
         {
         {
             "name": "illuminate/pagination",
             "name": "illuminate/pagination",
-            "version": "v10.35.0",
+            "version": "v10.37.3",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
                 "url": "https://github.com/illuminate/pagination.git",
                 "url": "https://github.com/illuminate/pagination.git",
@@ -1565,16 +1565,16 @@
         },
         },
         {
         {
             "name": "illuminate/support",
             "name": "illuminate/support",
-            "version": "v10.35.0",
+            "version": "v10.37.3",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
                 "url": "https://github.com/illuminate/support.git",
                 "url": "https://github.com/illuminate/support.git",
-                "reference": "84fd6e3a041c93bf8dca1349caf994023ee5c9e0"
+                "reference": "c28657bdda8014017197e2a40edd7d162ce03e8a"
             },
             },
             "dist": {
             "dist": {
                 "type": "zip",
                 "type": "zip",
-                "url": "https://api.github.com/repos/illuminate/support/zipball/84fd6e3a041c93bf8dca1349caf994023ee5c9e0",
-                "reference": "84fd6e3a041c93bf8dca1349caf994023ee5c9e0",
+                "url": "https://api.github.com/repos/illuminate/support/zipball/c28657bdda8014017197e2a40edd7d162ce03e8a",
+                "reference": "c28657bdda8014017197e2a40edd7d162ce03e8a",
                 "shasum": ""
                 "shasum": ""
             },
             },
             "require": {
             "require": {
@@ -1632,7 +1632,7 @@
                 "issues": "https://github.com/laravel/framework/issues",
                 "issues": "https://github.com/laravel/framework/issues",
                 "source": "https://github.com/laravel/framework"
                 "source": "https://github.com/laravel/framework"
             },
             },
-            "time": "2023-12-04T22:26:42+00:00"
+            "time": "2023-12-12T19:36:09+00:00"
         },
         },
         {
         {
             "name": "irazasyed/telegram-bot-sdk",
             "name": "irazasyed/telegram-bot-sdk",
@@ -2300,16 +2300,16 @@
         },
         },
         {
         {
             "name": "nesbot/carbon",
             "name": "nesbot/carbon",
-            "version": "2.72.0",
+            "version": "2.72.1",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
                 "url": "https://github.com/briannesbitt/Carbon.git",
                 "url": "https://github.com/briannesbitt/Carbon.git",
-                "reference": "a6885fcbad2ec4360b0e200ee0da7d9b7c90786b"
+                "reference": "2b3b3db0a2d0556a177392ff1a3bf5608fa09f78"
             },
             },
             "dist": {
             "dist": {
                 "type": "zip",
                 "type": "zip",
-                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/a6885fcbad2ec4360b0e200ee0da7d9b7c90786b",
-                "reference": "a6885fcbad2ec4360b0e200ee0da7d9b7c90786b",
+                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/2b3b3db0a2d0556a177392ff1a3bf5608fa09f78",
+                "reference": "2b3b3db0a2d0556a177392ff1a3bf5608fa09f78",
                 "shasum": ""
                 "shasum": ""
             },
             },
             "require": {
             "require": {
@@ -2403,7 +2403,7 @@
                     "type": "tidelift"
                     "type": "tidelift"
                 }
                 }
             ],
             ],
-            "time": "2023-11-28T10:13:25+00:00"
+            "time": "2023-12-08T23:47:49+00:00"
         },
         },
         {
         {
             "name": "nikic/fast-route",
             "name": "nikic/fast-route",
@@ -4778,16 +4778,16 @@
         },
         },
         {
         {
             "name": "stripe/stripe-php",
             "name": "stripe/stripe-php",
-            "version": "v13.5.0",
+            "version": "v13.6.0",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
                 "url": "https://github.com/stripe/stripe-php.git",
                 "url": "https://github.com/stripe/stripe-php.git",
-                "reference": "a688c0ee7c0a2d162dee5c80b85d017cdd8d5e37"
+                "reference": "6863bd70637fa1e2c022eceec44b89b7687634a1"
             },
             },
             "dist": {
             "dist": {
                 "type": "zip",
                 "type": "zip",
-                "url": "https://api.github.com/repos/stripe/stripe-php/zipball/a688c0ee7c0a2d162dee5c80b85d017cdd8d5e37",
-                "reference": "a688c0ee7c0a2d162dee5c80b85d017cdd8d5e37",
+                "url": "https://api.github.com/repos/stripe/stripe-php/zipball/6863bd70637fa1e2c022eceec44b89b7687634a1",
+                "reference": "6863bd70637fa1e2c022eceec44b89b7687634a1",
                 "shasum": ""
                 "shasum": ""
             },
             },
             "require": {
             "require": {
@@ -4831,9 +4831,9 @@
             ],
             ],
             "support": {
             "support": {
                 "issues": "https://github.com/stripe/stripe-php/issues",
                 "issues": "https://github.com/stripe/stripe-php/issues",
-                "source": "https://github.com/stripe/stripe-php/tree/v13.5.0"
+                "source": "https://github.com/stripe/stripe-php/tree/v13.6.0"
             },
             },
-            "time": "2023-11-30T18:11:45+00:00"
+            "time": "2023-12-07T21:13:50+00:00"
         },
         },
         {
         {
             "name": "symfony/deprecation-contracts",
             "name": "symfony/deprecation-contracts",
@@ -6988,16 +6988,16 @@
         },
         },
         {
         {
             "name": "friendsofphp/php-cs-fixer",
             "name": "friendsofphp/php-cs-fixer",
-            "version": "v3.40.2",
+            "version": "v3.41.1",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
                 "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
                 "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
-                "reference": "4344562a516b76afe8f2d64b2e52214c30d64ed8"
+                "reference": "8b6ae8dcbaf23f09680643ab832a4a3a260265f6"
             },
             },
             "dist": {
             "dist": {
                 "type": "zip",
                 "type": "zip",
-                "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/4344562a516b76afe8f2d64b2e52214c30d64ed8",
-                "reference": "4344562a516b76afe8f2d64b2e52214c30d64ed8",
+                "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/8b6ae8dcbaf23f09680643ab832a4a3a260265f6",
+                "reference": "8b6ae8dcbaf23f09680643ab832a4a3a260265f6",
                 "shasum": ""
                 "shasum": ""
             },
             },
             "require": {
             "require": {
@@ -7027,8 +7027,6 @@
                 "php-cs-fixer/accessible-object": "^1.1",
                 "php-cs-fixer/accessible-object": "^1.1",
                 "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4",
                 "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4",
                 "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4",
                 "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4",
-                "phpspec/prophecy": "^1.17",
-                "phpspec/prophecy-phpunit": "^2.0",
                 "phpunit/phpunit": "^9.6",
                 "phpunit/phpunit": "^9.6",
                 "symfony/phpunit-bridge": "^6.3.8 || ^7.0",
                 "symfony/phpunit-bridge": "^6.3.8 || ^7.0",
                 "symfony/yaml": "^5.4 || ^6.0 || ^7.0"
                 "symfony/yaml": "^5.4 || ^6.0 || ^7.0"
@@ -7069,7 +7067,7 @@
             ],
             ],
             "support": {
             "support": {
                 "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
                 "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
-                "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.40.2"
+                "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.41.1"
             },
             },
             "funding": [
             "funding": [
                 {
                 {
@@ -7077,7 +7075,7 @@
                     "type": "github"
                     "type": "github"
                 }
                 }
             ],
             ],
-            "time": "2023-12-03T09:21:33+00:00"
+            "time": "2023-12-10T19:59:27+00:00"
         },
         },
         {
         {
             "name": "justinrainbow/json-schema",
             "name": "justinrainbow/json-schema",
@@ -7292,16 +7290,16 @@
         },
         },
         {
         {
             "name": "nikic/php-parser",
             "name": "nikic/php-parser",
-            "version": "v4.17.1",
+            "version": "v4.18.0",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
                 "url": "https://github.com/nikic/PHP-Parser.git",
                 "url": "https://github.com/nikic/PHP-Parser.git",
-                "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d"
+                "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999"
             },
             },
             "dist": {
             "dist": {
                 "type": "zip",
                 "type": "zip",
-                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d",
-                "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d",
+                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999",
+                "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999",
                 "shasum": ""
                 "shasum": ""
             },
             },
             "require": {
             "require": {
@@ -7342,9 +7340,9 @@
             ],
             ],
             "support": {
             "support": {
                 "issues": "https://github.com/nikic/PHP-Parser/issues",
                 "issues": "https://github.com/nikic/PHP-Parser/issues",
-                "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1"
+                "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0"
             },
             },
-            "time": "2023-08-13T19:53:39+00:00"
+            "time": "2023-12-10T21:03:43+00:00"
         },
         },
         {
         {
             "name": "nunomaduro/phpinsights",
             "name": "nunomaduro/phpinsights",
@@ -7622,16 +7620,16 @@
         },
         },
         {
         {
             "name": "phpstan/phpdoc-parser",
             "name": "phpstan/phpdoc-parser",
-            "version": "1.24.4",
+            "version": "1.24.5",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
                 "url": "https://github.com/phpstan/phpdoc-parser.git",
                 "url": "https://github.com/phpstan/phpdoc-parser.git",
-                "reference": "6bd0c26f3786cd9b7c359675cb789e35a8e07496"
+                "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc"
             },
             },
             "dist": {
             "dist": {
                 "type": "zip",
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6bd0c26f3786cd9b7c359675cb789e35a8e07496",
-                "reference": "6bd0c26f3786cd9b7c359675cb789e35a8e07496",
+                "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fedf211ff14ec8381c9bf5714e33a7a552dd1acc",
+                "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc",
                 "shasum": ""
                 "shasum": ""
             },
             },
             "require": {
             "require": {
@@ -7663,22 +7661,22 @@
             "description": "PHPDoc parser with support for nullable, intersection and generic types",
             "description": "PHPDoc parser with support for nullable, intersection and generic types",
             "support": {
             "support": {
                 "issues": "https://github.com/phpstan/phpdoc-parser/issues",
                 "issues": "https://github.com/phpstan/phpdoc-parser/issues",
-                "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.4"
+                "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.5"
             },
             },
-            "time": "2023-11-26T18:29:22+00:00"
+            "time": "2023-12-16T09:33:33+00:00"
         },
         },
         {
         {
             "name": "phpunit/php-code-coverage",
             "name": "phpunit/php-code-coverage",
-            "version": "10.1.9",
+            "version": "10.1.10",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
                 "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
-                "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735"
+                "reference": "599109c8ca6bae97b23482d557d2874c25a65e59"
             },
             },
             "dist": {
             "dist": {
                 "type": "zip",
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/a56a9ab2f680246adcf3db43f38ddf1765774735",
-                "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/599109c8ca6bae97b23482d557d2874c25a65e59",
+                "reference": "599109c8ca6bae97b23482d557d2874c25a65e59",
                 "shasum": ""
                 "shasum": ""
             },
             },
             "require": {
             "require": {
@@ -7735,7 +7733,7 @@
             "support": {
             "support": {
                 "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
                 "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
                 "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
                 "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
-                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.9"
+                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.10"
             },
             },
             "funding": [
             "funding": [
                 {
                 {
@@ -7743,7 +7741,7 @@
                     "type": "github"
                     "type": "github"
                 }
                 }
             ],
             ],
-            "time": "2023-11-23T12:23:20+00:00"
+            "time": "2023-12-11T06:28:43+00:00"
         },
         },
         {
         {
             "name": "phpunit/php-file-iterator",
             "name": "phpunit/php-file-iterator",
@@ -7990,16 +7988,16 @@
         },
         },
         {
         {
             "name": "phpunit/phpunit",
             "name": "phpunit/phpunit",
-            "version": "10.5.2",
+            "version": "10.5.3",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
-                "reference": "5aedff46afba98dddecaa12349ec044d9103d4fe"
+                "reference": "6fce887c71076a73f32fd3e0774a6833fc5c7f19"
             },
             },
             "dist": {
             "dist": {
                 "type": "zip",
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5aedff46afba98dddecaa12349ec044d9103d4fe",
-                "reference": "5aedff46afba98dddecaa12349ec044d9103d4fe",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6fce887c71076a73f32fd3e0774a6833fc5c7f19",
+                "reference": "6fce887c71076a73f32fd3e0774a6833fc5c7f19",
                 "shasum": ""
                 "shasum": ""
             },
             },
             "require": {
             "require": {
@@ -8071,7 +8069,7 @@
             "support": {
             "support": {
                 "issues": "https://github.com/sebastianbergmann/phpunit/issues",
                 "issues": "https://github.com/sebastianbergmann/phpunit/issues",
                 "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
                 "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
-                "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.2"
+                "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.3"
             },
             },
             "funding": [
             "funding": [
                 {
                 {
@@ -8087,7 +8085,7 @@
                     "type": "tidelift"
                     "type": "tidelift"
                 }
                 }
             ],
             ],
-            "time": "2023-12-05T14:54:33+00:00"
+            "time": "2023-12-13T07:25:23+00:00"
         },
         },
         {
         {
             "name": "psr/cache",
             "name": "psr/cache",
@@ -9120,16 +9118,16 @@
         },
         },
         {
         {
             "name": "squizlabs/php_codesniffer",
             "name": "squizlabs/php_codesniffer",
-            "version": "3.7.2",
+            "version": "3.8.0",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
-                "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
-                "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879"
+                "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git",
+                "reference": "5805f7a4e4958dbb5e944ef1e6edae0a303765e7"
             },
             },
             "dist": {
             "dist": {
                 "type": "zip",
                 "type": "zip",
-                "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879",
-                "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879",
+                "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/5805f7a4e4958dbb5e944ef1e6edae0a303765e7",
+                "reference": "5805f7a4e4958dbb5e944ef1e6edae0a303765e7",
                 "shasum": ""
                 "shasum": ""
             },
             },
             "require": {
             "require": {
@@ -9139,7 +9137,7 @@
                 "php": ">=5.4.0"
                 "php": ">=5.4.0"
             },
             },
             "require-dev": {
             "require-dev": {
-                "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
+                "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0"
             },
             },
             "bin": [
             "bin": [
                 "bin/phpcs",
                 "bin/phpcs",
@@ -9158,22 +9156,45 @@
             "authors": [
             "authors": [
                 {
                 {
                     "name": "Greg Sherwood",
                     "name": "Greg Sherwood",
-                    "role": "lead"
+                    "role": "Former lead"
+                },
+                {
+                    "name": "Juliette Reinders Folmer",
+                    "role": "Current lead"
+                },
+                {
+                    "name": "Contributors",
+                    "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors"
                 }
                 }
             ],
             ],
             "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
             "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
-            "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
+            "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer",
             "keywords": [
             "keywords": [
                 "phpcs",
                 "phpcs",
                 "standards",
                 "standards",
                 "static analysis"
                 "static analysis"
             ],
             ],
             "support": {
             "support": {
-                "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
-                "source": "https://github.com/squizlabs/PHP_CodeSniffer",
-                "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
+                "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues",
+                "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy",
+                "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer",
+                "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki"
             },
             },
-            "time": "2023-02-22T23:07:41+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/PHPCSStandards",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/jrfnl",
+                    "type": "github"
+                },
+                {
+                    "url": "https://opencollective.com/php_codesniffer",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2023-12-08T12:32:31+00:00"
         },
         },
         {
         {
             "name": "symfony/cache",
             "name": "symfony/cache",

+ 43 - 2
config/appprofile.example.php

@@ -2,6 +2,47 @@
 
 
 declare(strict_types=1);
 declare(strict_types=1);
 
 
+$_ENV['V2RayJson_Config'] = [
+    'log' => [
+        'error' => [
+            'level' => 'error',
+            'type' => 'console',
+        ],
+        'access' => [
+            'type' => 'none',
+        ],
+    ],
+    'dns' => [
+        'nameServer' => [
+            [
+                'address' => '1.1.1.1',
+            ],
+            [
+                'address' => '1.0.0.1',
+            ],
+        ],
+    ],
+    'inbounds' => [
+        [
+            'protocol' => 'socks',
+            'settings' => [
+                'udpEnabled' => true,
+                'address' => '127.0.0.1',
+                'packetEncoding' => 'packet',
+            ],
+            'port' => 7892,
+            'listen' => '127.0.0.1',
+        ],
+        [
+            'protocol' => 'http',
+            'settings' => [],
+            'port' => 7893,
+            'listen' => '127.0.0.1',
+        ],
+    ],
+    'outbounds' => [],
+];
+
 $_ENV['SingBox_Config'] = [
 $_ENV['SingBox_Config'] = [
     'log' => [
     'log' => [
         'level' => 'error',
         'level' => 'error',
@@ -64,7 +105,7 @@ $_ENV['SingBox_Config'] = [
                 'http_proxy' => [
                 'http_proxy' => [
                     'enabled' => true,
                     'enabled' => true,
                     'server' => '127.0.0.1',
                     'server' => '127.0.0.1',
-                    'server_port' => 8100,
+                    'server_port' => 7891,
                 ],
                 ],
             ],
             ],
             'sniff' => true,
             'sniff' => true,
@@ -72,7 +113,7 @@ $_ENV['SingBox_Config'] = [
         [
         [
             'type' => 'mixed',
             'type' => 'mixed',
             'listen' => '127.0.0.1',
             'listen' => '127.0.0.1',
-            'listen_port' => 8100,
+            'listen_port' => 7891,
             'sniff' => true,
             'sniff' => true,
             'domain_strategy' => 'prefer_ipv4',
             'domain_strategy' => 'prefer_ipv4',
         ],
         ],

+ 12 - 0
config/clients.json

@@ -20,6 +20,18 @@
                 }
                 }
             ]
             ]
         },
         },
+        {
+            "name": "Clash.Meta For Android",
+            "tagMethod": "github_release",
+            "gitRepo": "MetaCubeX/ClashMetaForAndroid",
+            "savePath": "public/clients/",
+            "downloads": [
+                {
+                    "sourceName": "cmfa-%tagName1%-meta-universal-release.apk ",
+                    "saveName": "CMFA.apk"
+                }
+            ]
+        },
         {
         {
             "name": "sing-box",
             "name": "sing-box",
             "tagMethod": "github_release",
             "tagMethod": "github_release",

+ 14 - 0
resources/views/tabler/user/index.tpl

@@ -189,6 +189,9 @@
                                         <p>
                                         <p>
                                             通用订阅(sing-box):<code>{$UniversalSub}/singbox</code>
                                             通用订阅(sing-box):<code>{$UniversalSub}/singbox</code>
                                         </p>
                                         </p>
+                                        <p>
+                                            通用订阅(v2rayjson):<code>{$UniversalSub}/v2rayjson</code>
+                                        </p>
                                         {if $public_setting['enable_ss_sub']}
                                         {if $public_setting['enable_ss_sub']}
                                             <p>
                                             <p>
                                                 通用订阅(sip008):<code>{$UniversalSub}/sip008</code>
                                                 通用订阅(sip008):<code>{$UniversalSub}/sip008</code>
@@ -207,6 +210,10 @@
                                                class="copy btn btn-primary">
                                                class="copy btn btn-primary">
                                                 复制通用订阅(sing-box)
                                                 复制通用订阅(sing-box)
                                             </a>
                                             </a>
+                                            <a data-clipboard-text="{$UniversalSub}/v2rayjson"
+                                               class="copy btn btn-primary">
+                                                复制通用订阅(v2rayjson)
+                                            </a>
                                             {if $public_setting['enable_ss_sub']}
                                             {if $public_setting['enable_ss_sub']}
                                                 <a data-clipboard-text="{$UniversalSub}/sip008"
                                                 <a data-clipboard-text="{$UniversalSub}/sip008"
                                                    class="copy btn btn-primary">
                                                    class="copy btn btn-primary">
@@ -336,6 +343,13 @@
                                         适用于 sing-box 的订阅:<code>{$UniversalSub}/singbox</code>
                                         适用于 sing-box 的订阅:<code>{$UniversalSub}/singbox</code>
                                     </p>
                                     </p>
                                     <div class="btn-list justify-content-start">
                                     <div class="btn-list justify-content-start">
+                                        <a {if $config['enable_r2_client_download']}
+                                            href="/user/clients/CMFA.apk"
+                                        {else}
+                                            href="/clients/CMFA.apk"
+                                        {/if} class="btn btn-azure">
+                                            下载 Clash.Meta For Android
+                                        </a>
                                         <a data-clipboard-text="{$UniversalSub}/clash"
                                         <a data-clipboard-text="{$UniversalSub}/clash"
                                            class="copy btn btn-primary">
                                            class="copy btn btn-primary">
                                             复制 Clash 订阅链接
                                             复制 Clash 订阅链接

+ 1 - 1
resources/views/tabler/user/subscribe_log.tpl

@@ -9,7 +9,7 @@
                         <span class="home-title">订阅记录</span>
                         <span class="home-title">订阅记录</span>
                     </h2>
                     </h2>
                     <div class="page-pretitle my-3">
                     <div class="page-pretitle my-3">
-                        <span class="home-subtitle">在最近 {$config['subscribeLog_keep_days']} 天内所有的订阅记录</span>
+                        <span class="home-subtitle">在最近 {$subscribe_log_retention_days} 天内所有的订阅记录</span>
                     </div>
                     </div>
                 </div>
                 </div>
             </div>
             </div>

+ 2 - 2
src/Controllers/SubController.php

@@ -36,7 +36,7 @@ final class SubController extends BaseController
     {
     {
         $err_msg = '订阅链接无效';
         $err_msg = '订阅链接无效';
         $subtype = $args['subtype'];
         $subtype = $args['subtype'];
-        $subtype_list = ['json', 'clash', 'sip008', 'singbox', 'sip002', 'ss', 'v2ray', 'trojan'];
+        $subtype_list = ['json', 'clash', 'sip008', 'singbox', 'v2rayjson', 'sip002', 'ss', 'v2ray', 'trojan'];
 
 
         if (! $_ENV['Subscribe'] ||
         if (! $_ENV['Subscribe'] ||
             ! in_array($subtype, $subtype_list) ||
             ! in_array($subtype, $subtype_list) ||
@@ -65,7 +65,7 @@ final class SubController extends BaseController
 
 
         $content_type = match ($subtype) {
         $content_type = match ($subtype) {
             'clash' => 'application/yaml',
             'clash' => 'application/yaml',
-            'json','sip008','singbox' => 'application/json',
+            'json','sip008','singbox', 'v2rayjson' => 'application/json',
             default => 'text/plain',
             default => 'text/plain',
         };
         };
 
 

+ 1 - 0
src/Controllers/User/ClientController.php

@@ -25,6 +25,7 @@ final class ClientController extends BaseController
             'Clash.Verge.exe',
             'Clash.Verge.exe',
             'Clash.Verge_aarch64.dmg',
             'Clash.Verge_aarch64.dmg',
             'Clash.Verge.AppImage.tar.gz',
             'Clash.Verge.AppImage.tar.gz',
+            'CMFA.apk',
             'SFA.apk',
             'SFA.apk',
             'SFM.zip',
             'SFM.zip',
         ];
         ];

+ 2 - 0
src/Controllers/User/SubLogController.php

@@ -5,6 +5,7 @@ declare(strict_types=1);
 namespace App\Controllers\User;
 namespace App\Controllers\User;
 
 
 use App\Controllers\BaseController;
 use App\Controllers\BaseController;
+use App\Models\Config;
 use App\Models\SubscribeLog;
 use App\Models\SubscribeLog;
 use App\Utils\Tools;
 use App\Utils\Tools;
 use Exception;
 use Exception;
@@ -28,6 +29,7 @@ final class SubLogController extends BaseController
         }
         }
 
 
         return $response->write($this->view()
         return $response->write($this->view()
+            ->assign('subscribe_log_retention_days', Config::obtain('subscribe_log_retention_days'))
             ->assign('logs', $logs)
             ->assign('logs', $logs)
             ->fetch('user/subscribe_log.tpl'));
             ->fetch('user/subscribe_log.tpl'));
     }
     }

+ 8 - 2
src/Services/Bot/Telegram/Callback.php

@@ -742,16 +742,20 @@ final class Callback
                     'text' => 'SingBox',
                     'text' => 'SingBox',
                     'callback_data' => 'user.subscribe|singbox',
                     'callback_data' => 'user.subscribe|singbox',
                 ],
                 ],
+                [
+                    'text' => 'V2RayJson',
+                    'callback_data' => 'user.subscribe|v2rayjson',
+                ],
                 [
                 [
                     'text' => 'Shadowsocks',
                     'text' => 'Shadowsocks',
                     'callback_data' => 'user.subscribe|ss',
                     'callback_data' => 'user.subscribe|ss',
                 ],
                 ],
+            ],
+            [
                 [
                 [
                     'text' => 'SIP002',
                     'text' => 'SIP002',
                     'callback_data' => 'user.subscribe|sip002',
                     'callback_data' => 'user.subscribe|sip002',
                 ],
                 ],
-            ],
-            [
                 [
                 [
                     'text' => 'V2Ray',
                     'text' => 'V2Ray',
                     'callback_data' => 'user.subscribe|v2',
                     'callback_data' => 'user.subscribe|v2',
@@ -825,6 +829,8 @@ final class Callback
                     '<code>' . $UniversalSub_Url . '/clash</code>' . PHP_EOL . PHP_EOL,
                     '<code>' . $UniversalSub_Url . '/clash</code>' . PHP_EOL . PHP_EOL,
                 'singbox' => 'SingBox 通用订阅地址:' . PHP_EOL . PHP_EOL .
                 'singbox' => 'SingBox 通用订阅地址:' . PHP_EOL . PHP_EOL .
                     '<code>' . $UniversalSub_Url . '/singbox</code>' . PHP_EOL . PHP_EOL,
                     '<code>' . $UniversalSub_Url . '/singbox</code>' . PHP_EOL . PHP_EOL,
+                'v2rayjson' => 'V2RayJson 通用订阅地址:' . PHP_EOL . PHP_EOL .
+                    '<code>' . $UniversalSub_Url . '/v2rayjson</code>' . PHP_EOL . PHP_EOL,
                 'sip008' => 'SIP008 通用订阅地址:' . PHP_EOL . PHP_EOL .
                 'sip008' => 'SIP008 通用订阅地址:' . PHP_EOL . PHP_EOL .
                     '<code>' . $UniversalSub_Url . '/sip008</code>' . PHP_EOL . PHP_EOL,
                     '<code>' . $UniversalSub_Url . '/sip008</code>' . PHP_EOL . PHP_EOL,
                 'ss' => 'Shadowsocks 客户端订阅地址:' . PHP_EOL . PHP_EOL .
                 'ss' => 'Shadowsocks 客户端订阅地址:' . PHP_EOL . PHP_EOL .

+ 2 - 2
src/Services/Bot/Telegram/Commands/MenuCommand.php

@@ -57,13 +57,13 @@ final class MenuCommand extends Command
             // 回送信息
             // 回送信息
             return $this->replyWithMessage(
             return $this->replyWithMessage(
                 [
                 [
-                    'text' => $reply['text'],
+                    'text' => $reply['text'] ?? 'Hi!',
                     'parse_mode' => 'Markdown',
                     'parse_mode' => 'Markdown',
                     'disable_web_page_preview' => false,
                     'disable_web_page_preview' => false,
                     'reply_to_message_id' => null,
                     'reply_to_message_id' => null,
                     'reply_markup' => json_encode(
                     'reply_markup' => json_encode(
                         [
                         [
-                            'inline_keyboard' => $reply['keyboard'],
+                            'inline_keyboard' => $reply['keyboard'] ?? [],
                         ]
                         ]
                     ),
                     ),
                 ]
                 ]

+ 3 - 1
src/Services/Subscribe.php

@@ -14,6 +14,7 @@ use App\Services\Subscribe\SIP008;
 use App\Services\Subscribe\SS;
 use App\Services\Subscribe\SS;
 use App\Services\Subscribe\Trojan;
 use App\Services\Subscribe\Trojan;
 use App\Services\Subscribe\V2Ray;
 use App\Services\Subscribe\V2Ray;
+use App\Services\Subscribe\V2RayJson;
 use App\Utils\Tools;
 use App\Utils\Tools;
 use Illuminate\Support\Collection;
 use Illuminate\Support\Collection;
 
 
@@ -61,7 +62,7 @@ final class Subscribe
         return self::getClient($type)->getContent($user);
         return self::getClient($type)->getContent($user);
     }
     }
 
 
-    public static function getClient($type): Json|SS|SIP002|V2Ray|Trojan|Clash|SIP008|SingBox
+    public static function getClient($type): Json|SS|SIP002|V2Ray|Trojan|Clash|SIP008|SingBox|V2RayJson
     {
     {
         return match ($type) {
         return match ($type) {
             'ss' => new SS(),
             'ss' => new SS(),
@@ -71,6 +72,7 @@ final class Subscribe
             'clash' => new Clash(),
             'clash' => new Clash(),
             'sip008' => new SIP008(),
             'sip008' => new SIP008(),
             'singbox' => new SingBox(),
             'singbox' => new SingBox(),
+            'v2rayjson' => new V2RayJson(),
             default => new Json(),
             default => new Json(),
         };
         };
     }
     }

+ 183 - 0
src/Services/Subscribe/V2RayJson.php

@@ -0,0 +1,183 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Services\Subscribe;
+
+use App\Services\Subscribe;
+use function array_filter;
+use function array_merge;
+use function json_decode;
+use function json_encode;
+
+final class V2RayJson extends Base
+{
+    public function getContent($user): string
+    {
+        $nodes = [];
+        $v2rayjson_config = $_ENV['V2RayJson_Config'];
+        $nodes_raw = Subscribe::getUserSubNodes($user);
+
+        foreach ($nodes_raw as $node_raw) {
+            $node_custom_config = json_decode($node_raw->custom_config, true);
+
+            switch ((int) $node_raw->sort) {
+                case 0:
+                    $node = [
+                        'protocol' => 'shadowsocks',
+                        'settings' => [
+                            'address' => $node_raw->server,
+                            'port' => (int) $user->port,
+                            'method' => $user->method,
+                            'password' => $user->passwd,
+                        ],
+                        'tag' => $node_raw->name,
+                    ];
+
+                    break;
+                case 1:
+                    $ss_2022_port = $node_custom_config['offset_port_user'] ?? ($node_custom_config['offset_port_node'] ?? 443);
+                    $method = $node_custom_config['method'] ?? '2022-blake3-aes-128-gcm';
+
+                    $pk_len = match ($method) {
+                        '2022-blake3-aes-128-gcm' => 16,
+                        default => 32,
+                    };
+
+                    $user_pk = $user->getSs2022Pk($pk_len);
+
+                    $node = [
+                        'protocol' => 'shadowsocks2022',
+                        'settings' => [
+                            'address' => $node_raw->server,
+                            'port' => (int) $ss_2022_port,
+                            'method' => $user->method,
+                            'psk' => $user_pk,
+                        ],
+                        'tag' => $node_raw->name,
+                    ];
+
+                    break;
+                case 11:
+                    $v2_port = $node_custom_config['offset_port_user'] ?? ($node_custom_config['offset_port_node'] ?? 443);
+                    $security = $node_custom_config['security'] ?? 'none';
+                    $transport = $node_custom_config['network'] ?? 'tcp';
+                    $host = $node_custom_config['header']['request']['headers']['Host'][0] ??
+                        $node_custom_config['host'] ?? $node_raw->server;
+                    $path = $node_custom_config['header']['request']['path'][0] ?? $node_custom_config['path'] ?? '';
+                    $headers = $node_custom_config['header']['request']['headers'] ?? [];
+                    $service_name = $node_custom_config['servicename'] ?? '';
+                    $meek_url = $node_custom_config['meek_url'] ?? '';
+
+                    $node = [
+                        'protocol' => 'vmess',
+                        'settings' => [
+                            'address' => $node_raw->server,
+                            'port' => (int) $v2_port,
+                            'uuid' => $user->uuid,
+                        ],
+                        'tag' => $node_raw->name,
+                        'streamSettings' => [
+                            'transport' => $transport,
+                            'transportSettings' => [
+                                'ws' => [
+                                    'path' => $transport === 'ws' ? $path : '',
+                                    'header' => $headers,
+                                ],
+                                'grpc' => [
+                                    'host' => $transport === 'grpc' ? $host : '',
+                                    'service_name' => $service_name,
+                                ],
+                                'meek' => [
+                                    'url' => $meek_url,
+                                ],
+                                'httpupgrade' => [
+                                    'path' => $transport === 'httpupgrade' ? $path : '',
+                                    'host' => $transport === 'httpupgrade' ? $host : '',
+                                ],
+                            ],
+                            'security' => $security,
+                            'securitySettings' => [
+                                'tls' => [
+                                    'server_name' => $security === ('tls' || 'auto') ? $host : '',
+                                ],
+                            ],
+                        ],
+                    ];
+
+                    $node['streamSettings']['transportSettings']['ws'] = array_filter($node['streamSettings']['transportSettings']['ws']);
+                    $node['streamSettings']['transportSettings']['grpc'] = array_filter($node['streamSettings']['transportSettings']['grpc']);
+                    $node['streamSettings']['transportSettings']['meek'] = array_filter($node['streamSettings']['transportSettings']['meek']);
+                    $node['streamSettings']['transportSettings']['httpupgrade'] = array_filter($node['streamSettings']['transportSettings']['httpupgrade']);
+                    $node['streamSettings']['transportSettings'] = array_filter($node['streamSettings']['transportSettings']);
+                    $node['streamSettings']['securitySettings']['tls'] = array_filter($node['streamSettings']['securitySettings']['tls']);
+                    $node['streamSettings']['securitySettings'] = array_filter($node['streamSettings']['securitySettings']);
+
+                    break;
+                case 14:
+                    $trojan_port = $node_custom_config['offset_port_user'] ?? ($node_custom_config['offset_port_node'] ?? 443);
+                    $host = $node_custom_config['host'] ?? $node_raw->server;
+                    $allow_insecure = $node_custom_config['allow_insecure'] ?? '0';
+                    $transport = $node_custom_config['network'] ?? '';
+                    $path = $node_custom_config['header']['request']['path'][0] ?? $node_custom_config['path'] ?? '';
+                    $headers = $node_custom_config['header']['request']['headers'] ?? [];
+                    $service_name = $node_custom_config['servicename'] ?? '';
+
+                    $node = [
+                        'protocol' => 'trojan',
+                        'settings' => [
+                            'address' => $node_raw->server,
+                            'port' => (int) $trojan_port,
+                            'password' => $user->uuid,
+                        ],
+                        'tag' => $node_raw->name,
+                        'streamSettings' => [
+                            'transport' => $transport,
+                            'transportSettings' => [
+                                'ws' => [
+                                    'path' => $transport === 'ws' ? $path : '',
+                                    'header' => $headers,
+                                ],
+                                'grpc' => [
+                                    'host' => $transport === 'grpc' ? $host : '',
+                                    'service_name' => $service_name,
+                                ],
+                                'httpupgrade' => [
+                                    'path' => $transport === 'httpupgrade' ? $path : '',
+                                    'host' => $transport === 'httpupgrade' ? $host : '',
+                                ],
+                            ],
+                            'security' => 'tls',
+                            'securitySettings' => [
+                                'tls' => [
+                                    'allow_insecure' => (bool) $allow_insecure,
+                                    'server_name' => $host,
+                                ],
+                            ],
+                        ],
+                    ];
+
+                    $node['streamSettings']['transportSettings']['ws'] = array_filter($node['streamSettings']['transportSettings']['ws']);
+                    $node['streamSettings']['transportSettings']['grpc'] = array_filter($node['streamSettings']['transportSettings']['grpc']);
+                    $node['streamSettings']['transportSettings']['httpupgrade'] = array_filter($node['streamSettings']['transportSettings']['httpupgrade']);
+                    $node['streamSettings']['transportSettings'] = array_filter($node['streamSettings']['transportSettings']);
+                    $node['streamSettings']['securitySettings'] = array_filter($node['streamSettings']['securitySettings']);
+
+                    break;
+                default:
+                    $node = [];
+                    break;
+            }
+
+            if ($node === []) {
+                continue;
+            }
+
+            $nodes[] = $node;
+        }
+
+        $v2rayjson_config['outbounds'] = array_merge($v2rayjson_config['outbounds'], $nodes);
+
+        return json_encode($v2rayjson_config);
+    }
+}