From d3231814bf25edce76e9879454c1e719122e4150 Mon Sep 17 00:00:00 2001 From: NULL Date: Sat, 12 Jul 2025 18:53:03 +0800 Subject: [PATCH] fix --- code/.gitignore | 1 + code/app/api/BaseController.php | 1 - code/app/api/controller/Statis.php | 3 - code/app/model/MongoModel.php | 3 - .../task/crawler/fengchao/page/BasePage.php | 2 - .../app/task/crawler/wuxian/page/BasePage.php | 2 - code/app/task/crawler/wxg/page/BasePage.php | 2 - .../app/task/crawler/youzhi/page/BasePage.php | 2 - code/app/task/crawler/zw/page/BasePage.php | 2 - code/composer.json | 5 +- code/config/console.php | 4 +- code/extend/db/DatabaseManage.php | 114 ------------ code/extend/db/MongoMigrate.php | 176 ------------------ code/extend/db/NovelManage.php | 114 ------------ code/extend/ddl/DDLManage.php | 65 ------- code/extend/ddl/Init.php | 58 ++++++ code/extend/ddl/MicroCore.ddl | Bin 12592 -> 0 bytes code/extend/ddl/MongoBase.ddl | Bin 6992 -> 0 bytes code/extend/ddl/ext/1.ddl | 3 + code/extend/ddl/ext/10.ddl | Bin 0 -> 6864 bytes code/extend/ddl/ext/11.ddl | Bin 0 -> 5584 bytes code/extend/ddl/ext/12.ddl | Bin 0 -> 3440 bytes code/extend/ddl/ext/2.ddl | Bin 0 -> 512 bytes code/extend/ddl/ext/3.ddl | Bin 0 -> 1072 bytes code/extend/ddl/ext/4.ddl | Bin 0 -> 496 bytes code/extend/ddl/ext/5.ddl | Bin 0 -> 352 bytes code/extend/ddl/ext/6.ddl | Bin 0 -> 3104 bytes code/extend/ddl/ext/7.ddl | Bin 0 -> 2192 bytes code/extend/ddl/ext/8.ddl | Bin 0 -> 3776 bytes code/extend/ddl/ext/9.ddl | Bin 0 -> 3712 bytes 30 files changed, 67 insertions(+), 490 deletions(-) delete mode 100644 code/extend/db/DatabaseManage.php delete mode 100644 code/extend/db/MongoMigrate.php delete mode 100644 code/extend/db/NovelManage.php delete mode 100644 code/extend/ddl/DDLManage.php create mode 100644 code/extend/ddl/Init.php delete mode 100644 code/extend/ddl/MicroCore.ddl delete mode 100644 code/extend/ddl/MongoBase.ddl create mode 100644 code/extend/ddl/ext/1.ddl create mode 100644 code/extend/ddl/ext/10.ddl create mode 100644 code/extend/ddl/ext/11.ddl create mode 100644 code/extend/ddl/ext/12.ddl create mode 100644 code/extend/ddl/ext/2.ddl create mode 100644 code/extend/ddl/ext/3.ddl create mode 100644 code/extend/ddl/ext/4.ddl create mode 100644 code/extend/ddl/ext/5.ddl create mode 100644 code/extend/ddl/ext/6.ddl create mode 100644 code/extend/ddl/ext/7.ddl create mode 100644 code/extend/ddl/ext/8.ddl create mode 100644 code/extend/ddl/ext/9.ddl diff --git a/code/.gitignore b/code/.gitignore index 323eaf1..f809a52 100644 --- a/code/.gitignore +++ b/code/.gitignore @@ -9,3 +9,4 @@ Thumbs.db /.settings /.buildpath /.project +**/*bbc*/** \ No newline at end of file diff --git a/code/app/api/BaseController.php b/code/app/api/BaseController.php index 2e106a8..659072d 100644 --- a/code/app/api/BaseController.php +++ b/code/app/api/BaseController.php @@ -4,7 +4,6 @@ declare(strict_types=1); namespace app\api; -use ddl\DDLManage; use think\App; use think\exception\ValidateException; use think\facade\View; diff --git a/code/app/api/controller/Statis.php b/code/app/api/controller/Statis.php index 76df3e6..1ca45b9 100644 --- a/code/app/api/controller/Statis.php +++ b/code/app/api/controller/Statis.php @@ -12,9 +12,6 @@ use app\model\VideoClicksModel; use app\task\crawler\fengchao\page\VideoCategory; use app\task\crawler\wuxian\page\VideoCategory as PageVideoCategory; use app\task\crawler\youzhi\page\VideoCategory as YouzhiPageVideoCategory; -use DateTime; -use db\mongo\MongoBase; -use ddl\DDLManage; use Exception; use think\Request; use think\Response; diff --git a/code/app/model/MongoModel.php b/code/app/model/MongoModel.php index a65a44c..51f8eac 100644 --- a/code/app/model/MongoModel.php +++ b/code/app/model/MongoModel.php @@ -5,7 +5,6 @@ declare(strict_types=1); namespace app\model; use db\mongo\MongoBase; -use ddl\DDLManage; use MongoDB\Collection; use think\facade\Cache; @@ -35,8 +34,6 @@ abstract class MongoModel */ public function __construct() { - DDLManage::load('MongoBase'); - $this->MongoBase = MongoBase::getInstance(); } diff --git a/code/app/task/crawler/fengchao/page/BasePage.php b/code/app/task/crawler/fengchao/page/BasePage.php index 9d7fa1f..e3b8a3c 100644 --- a/code/app/task/crawler/fengchao/page/BasePage.php +++ b/code/app/task/crawler/fengchao/page/BasePage.php @@ -5,7 +5,6 @@ declare(strict_types=1); namespace app\task\crawler\fengchao\page; use db\mongo\MongoBase; -use ddl\DDLManage; use GuzzleHttp\Client; use microserver\QueueManage; use QL\QueryList; @@ -160,7 +159,6 @@ abstract class BasePage public function getMongoBase(): MongoBase { if ($this->MongoBase == NULL) { - DDLManage::load('MongoBase'); $this->MongoBase = MongoBase::getInstance(); } diff --git a/code/app/task/crawler/wuxian/page/BasePage.php b/code/app/task/crawler/wuxian/page/BasePage.php index e6e3995..c40eb0e 100644 --- a/code/app/task/crawler/wuxian/page/BasePage.php +++ b/code/app/task/crawler/wuxian/page/BasePage.php @@ -5,7 +5,6 @@ declare(strict_types=1); namespace app\task\crawler\wuxian\page; use db\mongo\MongoBase; -use ddl\DDLManage; use GuzzleHttp\Client; use microserver\QueueManage; use QL\QueryList; @@ -160,7 +159,6 @@ abstract class BasePage public function getMongoBase(): MongoBase { if ($this->MongoBase == NULL) { - DDLManage::load('MongoBase'); $this->MongoBase = MongoBase::getInstance(); } diff --git a/code/app/task/crawler/wxg/page/BasePage.php b/code/app/task/crawler/wxg/page/BasePage.php index 3c262e5..bff0952 100644 --- a/code/app/task/crawler/wxg/page/BasePage.php +++ b/code/app/task/crawler/wxg/page/BasePage.php @@ -5,7 +5,6 @@ declare(strict_types=1); namespace app\task\crawler\wxg\page; use db\mongo\MongoBase; -use ddl\DDLManage; use GuzzleHttp\Client; use microserver\QueueManage; use QL\QueryList; @@ -160,7 +159,6 @@ abstract class BasePage public function getMongoBase(): MongoBase { if ($this->MongoBase == NULL) { - DDLManage::load('MongoBase'); $this->MongoBase = MongoBase::getInstance(); } diff --git a/code/app/task/crawler/youzhi/page/BasePage.php b/code/app/task/crawler/youzhi/page/BasePage.php index 67b5d48..91d6cb5 100644 --- a/code/app/task/crawler/youzhi/page/BasePage.php +++ b/code/app/task/crawler/youzhi/page/BasePage.php @@ -5,7 +5,6 @@ declare(strict_types=1); namespace app\task\crawler\youzhi\page; use db\mongo\MongoBase; -use ddl\DDLManage; use GuzzleHttp\Client; use microserver\QueueManage; use QL\QueryList; @@ -160,7 +159,6 @@ abstract class BasePage public function getMongoBase(): MongoBase { if ($this->MongoBase == NULL) { - DDLManage::load('MongoBase'); $this->MongoBase = MongoBase::getInstance(); } diff --git a/code/app/task/crawler/zw/page/BasePage.php b/code/app/task/crawler/zw/page/BasePage.php index 9c2eebc..27e23c3 100644 --- a/code/app/task/crawler/zw/page/BasePage.php +++ b/code/app/task/crawler/zw/page/BasePage.php @@ -5,7 +5,6 @@ declare(strict_types=1); namespace app\task\crawler\zw\page; use db\mongo\MongoBase; -use ddl\DDLManage; use GuzzleHttp\Client; use microserver\QueueManage; use QL\QueryList; @@ -162,7 +161,6 @@ abstract class BasePage public function getMongoBase(): MongoBase { if ($this->MongoBase == NULL) { - DDLManage::load('MongoBase'); $this->MongoBase = MongoBase::getInstance(); } diff --git a/code/composer.json b/code/composer.json index 48dbae7..f6708bc 100644 --- a/code/composer.json +++ b/code/composer.json @@ -48,7 +48,10 @@ }, "psr-0": { "": "extend/" - } + }, + "files": [ + "extend/ddl/Init.php" + ] }, "config": { "preferred-install": "dist" diff --git a/code/config/console.php b/code/config/console.php index 10089f1..c46fea4 100644 --- a/code/config/console.php +++ b/code/config/console.php @@ -3,9 +3,6 @@ // | 控制台配置 // +---------------------------------------------------------------------- -use ddl\DDLManage; - -DDLManage::load('MicroServer'); return [ 'commands' => [ @@ -13,5 +10,6 @@ return [ 'db:manage' => 'db\DatabaseManage', 'mongo:manage' => 'db\MongoMigrate', 'novel:manage' => 'db\NovelManage', + 'bbc:manage' => 'bbc\Init', ], ]; diff --git a/code/extend/db/DatabaseManage.php b/code/extend/db/DatabaseManage.php deleted file mode 100644 index b1432a2..0000000 --- a/code/extend/db/DatabaseManage.php +++ /dev/null @@ -1,114 +0,0 @@ -setName('db:manage') - ->addArgument('action', \think\console\input\Argument::OPTIONAL, 'The action to perform: backup or init or seed') - ->setDescription('Manage the database: backup or initialize'); - } - - protected function execute(Input $input, Output $Output) - { - $strAction = $input->getArgument('action'); - - if ($strAction === 'backup') { - $this->backupDatabase($Output); - } elseif ($strAction === 'init') { - $this->initializeDatabase($Output); - } elseif ($strAction === 'seed') { - $this->seed($Output); - } else { - $Output->writeln("Invalid action. Use 'backup' or 'init'. or 'seed'"); - } - } - - private function seed(Output $Output) - { - $SeedManager = new SeedManager; - $Output->writeln("开始数据播种" . PHP_EOL); - $SeedManager->handle(); - $Output->writeln("数据播种结束"); - } - - private function backupDatabase(Output $Output) - { - $arrConfig = config('database.connections.mysql'); - $strDb = $arrConfig['database']; - $strUserName = $arrConfig['username']; - $strPwd = $arrConfig['password']; - $strHost = $arrConfig['hostname']; - $strBackupFile = app()->getRootPath() . 'database/schema/mysql-schema.dump'; - - $strTempFile = tempnam(sys_get_temp_dir(), 'mysql-schema-') . '.dump'; - - $strCmd = "mysqldump -h{$strHost} -u{$strUserName} -p{$strPwd} --no-data {$strDb} > {$strTempFile}"; - - system($strCmd, $intResultCode); - - if ($intResultCode === 0) { - if (file_exists($strBackupFile)) { - unlink($strBackupFile); - } - - if (rename($strTempFile, $strBackupFile)) { - $Output->writeln("Database backup successful: {$strBackupFile}"); - } else { - $Output->writeln("Failed to move backup file to destination."); - } - } else { - $Output->writeln("Database backup failed."); - unlink($strTempFile); - } - } - - private function initializeDatabase(Output $Output) - { - $arrConfig = config('database.connections.mysql'); - $strDb = $arrConfig['database']; - $strUserName = $arrConfig['username']; - $strPwd = $arrConfig['password']; - $strHost = $arrConfig['hostname']; - $strPort = $arrConfig['hostport']; - $strBackupFile = app()->getRootPath() . 'database/schema/mysql-schema.dump'; - - $checkTableQuery = "SHOW TABLES LIKE 'migrations'"; - $boolMigrateExists = Db::query($checkTableQuery); - - if (!empty($boolMigrateExists)) { - $Output->writeln("数据库已存在,跳过初始化导入"); - return; - } - - $strTempFile = tempnam(sys_get_temp_dir(), 'mysql-schema-') . '.dump'; - - if (!copy($strBackupFile, $strTempFile)) { - $Output->writeln("创建临时导入文件失败."); - return; - } - - $strCmd = "mysql -h{$strHost} -P{$strPort} -u{$strUserName} -p{$strPwd} {$strDb} < {$strTempFile}"; - - system($strCmd, $intResultCode); - - if ($intResultCode === 0) { - $Output->writeln("成功导入初始化文件"); - } else { - $Output->writeln("初始化文件导入失败"); - } - - unlink($strTempFile); - } -} diff --git a/code/extend/db/MongoMigrate.php b/code/extend/db/MongoMigrate.php deleted file mode 100644 index 2d84b68..0000000 --- a/code/extend/db/MongoMigrate.php +++ /dev/null @@ -1,176 +0,0 @@ -setName('mongo:manage') - ->addArgument('action', \think\console\input\Argument::OPTIONAL, 'The action to perform: migrate') - ->setDescription('Manage the mongo, migarte index or drop all index'); - } - - /** - * Undocumented function - * - * @param Input $input - * @param Output $Output - * @return void - */ - protected function execute(Input $input, Output $Output) - { - $strAction = $input->getArgument('action'); - - if ($strAction === 'migrate') { - $this->migrate($Output); - } else if ($strAction === 'drop') { - $this->dropAllIndexes($Output); - } else { - $Output->writeln("Invalid action. Use 'migrate' or 'drop'"); - } - } - - /** - * Undocumented function - * - * @param Output $Output - * @return void - */ - protected function dropAllIndexes(Output $Output) - { - try { - DDLManage::load('MongoBase'); - $Db = MongoBase::getInstance()->getDb(); - - $ColsInfo = $Db->listCollections(); - - foreach ($ColsInfo as $ColInfo) { - $strColName = $ColInfo->getName(); - $Col = $Db->selectCollection($strColName); - - - $arrIndexes = iterator_to_array($Col->listIndexes()); - $arrIndexesToDrop = []; - - - foreach ($arrIndexes as $Index) { - $strIndexName = $Index->getName(); - if ($strIndexName !== '_id_') { - $arrIndexesToDrop[] = $strIndexName; - } - } - - - if (!empty($arrIndexesToDrop)) { - foreach ($arrIndexesToDrop as $strIndexName) { - $Col->dropIndex($strIndexName); - $Output->writeln(" Dropped index: {$strIndexName} from collection: {$strColName}"); - } - } else { - $Output->writeln(" No non-_id indexes found in collection: {$strColName}"); - } - } - } catch (\Exception $e) { - $Output->writeln("Failed to drop indexes: {$e->getMessage()}"); - } - } - - /** - * Undocumented function - * - * @param Output $Output - * @return void - */ - protected function migrate(Output $Output) - { - try { - DDLManage::load('MongoBase'); - $strMigrationDir = root_path() . 'database/mongo/migrations'; - - - if (!is_dir($strMigrationDir)) { - mkdir($strMigrationDir, 0755, true); - $Output->writeln("Created migration directory: {$strMigrationDir}"); - } - - - $arrFiles = glob($strMigrationDir . '/*.php'); - if (empty($arrFiles)) { - $Output->writeln('No migration files found.'); - return 0; - } - - sort($arrFiles); - - $Db = MongoBase::getInstance()->getDb(); - - foreach ($arrFiles as $strFile) { - $Output->writeln("Processing migration: " . basename($strFile)); - - - $arrMigration = require $strFile; - if (!is_array($arrMigration) || !isset($arrMigration['collection']) || !isset($arrMigration['indexes'])) { - $Output->writeln("Invalid migration format in {$strFile}"); - continue; - } - - $strCollectionName = $arrMigration['collection']; - $arrIndexes = $arrMigration['indexes']; - - - $Col = $Db->selectCollection($strCollectionName); - - - $arrExistingIndexes = iterator_to_array($Col->listIndexes()); - - $arrExistingIndexKeys = []; - foreach ($arrExistingIndexes as $Index) { - $strKey = json_encode($Index->getKey()); - $arrExistingIndexKeys[$strKey] = $Index->getName(); - } - - - foreach ($arrIndexes as $arrIndex) { - $arrKey = $arrIndex['key']; - $arrOptions = $arrIndex['options'] ?? []; - - - $strKey = json_encode($arrKey); - - - if (array_key_exists($strKey, $arrExistingIndexKeys)) { - $Output->writeln(" Index for " . json_encode($arrKey) . " already exists as {$arrExistingIndexKeys[$strKey]}, skipping..."); - continue; - } - - - $arrIndexNameParts = []; - foreach ($arrKey as $field => $direction) { - $arrIndexNameParts[] = "{$field}_{$direction}"; - } - $strIndexName = implode('_', $arrIndexNameParts); - - - $arrOptions['name'] = $strIndexName; - $Col->createIndex($arrKey, $arrOptions); - - $Output->writeln(" Created index: {$strIndexName} for " . json_encode($arrKey)); - } - } - - $Output->writeln('Migration completed successfully!'); - return 0; - } catch (\Exception $e) { - $Output->writeln("Error: {$e->getMessage()}"); - return 1; - } - } -} diff --git a/code/extend/db/NovelManage.php b/code/extend/db/NovelManage.php deleted file mode 100644 index 8f08888..0000000 --- a/code/extend/db/NovelManage.php +++ /dev/null @@ -1,114 +0,0 @@ -setName('novel:manage') - ->addArgument('action', \think\console\input\Argument::OPTIONAL, 'The action to perform: reset') - ->setDescription('Manage the novel data: reset or ...'); - } - - protected function execute(Input $input, Output $Output) - { - $strAction = $input->getArgument('action'); - - if ($strAction === 'reset') { - $this->resetData($Output); - } else { - $Output->writeln("Invalid action. Use 'reset' "); - } - } - - private function resetData(Output $Output) - { - DDLManage::load('MongoBase'); - - $Db = MongoBase::getInstance()->getDb(); - - $NovelCol = $Db->selectCollection('novel'); - - $ChapterCol = $Db->selectCollection('chapter'); - - $ChapterModel = ChapterModel::getInstance(); - - $intBatchSize = 1000; - - $LastId = null; - - while (true) { - - $arrFilter = []; - if (!is_null($LastId)) { - $arrFilter['_id'] = ['$gt' => $LastId]; - } - $arrOptions = [ - 'sort' => ['_id' => 1], - 'limit' => $intBatchSize, - 'noCursorTimeout' => true, - ]; - - $Cursor = $NovelCol->find($arrFilter, $arrOptions); - $arrDocs = iterator_to_array($Cursor); - - if (empty($arrDocs)) { - echo "全部处理完毕。\n"; - break; - } - - $arrBulkOps = []; - - foreach ($arrDocs as $arrDoc) { - $arrUpdateData = []; - - if (!empty($arrDoc['n_category'])) { - $arrUpdateData['n_category_pinyin'] = CategoryModel::getPinYin($arrDoc['n_category']); - $arrUpdateData['n_category_sex_en'] = CategoryModel::getSexEn($arrDoc['n_category']); - $arrUpdateData['n_category_sex_zh'] = CategoryModel::getSexZh($arrDoc['n_category']); - } - - $arrLasteChapter = $ChapterModel->getLatestChapterByNId($arrDoc['n_id'], false); - - if (!empty($arrLasteChapter)) { - $arrUpdateData['n_have_chapter'] = 1; - $arrUpdateData['n_latest_chapter_name'] = $arrLasteChapter['name']; - } - - if (!empty($arrUpdateData)) { - $arrBulkOps[] = [ - 'updateOne' => [ - ['_id' => $arrDoc['_id']], - ['$set' => $arrUpdateData], - ], - ]; - } - - $LastId = $arrDoc['_id']; - } - - if (!empty($arrBulkOps)) { - $Result = $NovelCol->bulkWrite($arrBulkOps); - printf("本批匹配 %d 条记录, 修改 %d 条记录\n", $Result->getMatchedCount(), $Result->getModifiedCount()); - } else { - echo "本批无需要更新的记录。\n"; - } - - echo "已处理一批,最后 _id: " . (string)$LastId . "\n"; - } - } -} diff --git a/code/extend/ddl/DDLManage.php b/code/extend/ddl/DDLManage.php deleted file mode 100644 index 80a453b..0000000 --- a/code/extend/ddl/DDLManage.php +++ /dev/null @@ -1,65 +0,0 @@ - 'extend/ddl/MicroCore.ddl', - 'MongoBase' => 'extend/ddl/MongoBase.ddl', - ]; - - /** - * 加载指定模块 - * @param string $strModuleCode 模块编码 - * @return bool 加载是否成功 - */ - public static function load($strModuleCode) - { - if (isset(self::$arrLoadedModules[$strModuleCode])) { - return true; - } - - if (!isset(self::$arrModuleFiles[$strModuleCode])) { - return false; - } - - $filename = self::$arrModuleFiles[$strModuleCode]; - - $strFileName = root_path() . $filename; - - if (!file_exists($strFileName)) { - return false; - } - - if (load_module_file($strFileName)) { - self::$arrLoadedModules[$strModuleCode] = true; - return true; - } else { - return false; - } - } - - /** - * 检查模块是否已加载 - * @param string $strModuleCode 类名 - * @return bool - */ - public static function isLoaded($strModuleCode) - { - return isset(self::$arrLoadedModules[$strModuleCode]); - } - - /** - * 获取所有已加载的模块 - * @return array - */ - public static function getarrLoadedModules() - { - return array_keys(self::$arrLoadedModules); - } -} diff --git a/code/extend/ddl/Init.php b/code/extend/ddl/Init.php new file mode 100644 index 0000000..568c4cd --- /dev/null +++ b/code/extend/ddl/Init.php @@ -0,0 +1,58 @@ +isFile() && $File->getExtension() === 'ddl') { + $arrDdlFiles[] = [ + 'filename' => $File->getFilename(), + 'path' => realpath($File->getPathname()) + ]; + } + } + + usort($arrDdlFiles, function ($a, $b) { + return strnatcmp($a['filename'], $b['filename']); + }); + + $sortedPaths = array_column($arrDdlFiles, 'path'); + + return $sortedPaths; + } +} + +Init::run(); diff --git a/code/extend/ddl/MicroCore.ddl b/code/extend/ddl/MicroCore.ddl deleted file mode 100644 index 4a8fe8f3be7c5ce191d9f9ffe3a555b4ac85a141..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12592 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 SnB^A>5Vq(z17IzXQJ+v5d$Pd* diff --git a/code/extend/ddl/MongoBase.ddl b/code/extend/ddl/MongoBase.ddl deleted file mode 100644 index e06fd099a3d129539ebfa308ea5dc44ed6fcecca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6992 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 i=c)62&Qy=i>R_E[+ WՐw#A$U5^(y=IZ] \ No newline at end of file diff --git a/code/extend/ddl/ext/10.ddl b/code/extend/ddl/ext/10.ddl new file mode 100644 index 0000000000000000000000000000000000000000..d0e96b26bd1cd59f3b58f98e543d5322be8edee1 GIT binary patch literal 6864 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 KAgo~+SqmrsetixA literal 0 HcmV?d00001 diff --git a/code/extend/ddl/ext/11.ddl b/code/extend/ddl/ext/11.ddl new file mode 100644 index 0000000000000000000000000000000000000000..22ff1a9a3f98bf99df296d1f691fc6f5341ddb75 GIT binary patch literal 5584 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 literal 0 HcmV?d00001 diff --git a/code/extend/ddl/ext/12.ddl b/code/extend/ddl/ext/12.ddl new file mode 100644 index 0000000000000000000000000000000000000000..ba263679b5e356ed381ca632cdba5a7034a321f5 GIT binary patch literal 3440 zcmV-$4Uh88iT48+8pw;J&a%xj51qr}DqNVVm`!UA7C}}laH0`po)O6}xbnCjc*^mK zjI^nC`!T(M+;0N>gBOZ^hAsB*q^^v5!0q%`c6D*c(mDBroD!26#@m?zyH+dboMeZ9 zw|zx+L@m0?rc)JIT=CKv$qvxCswhH-86e&JQ4#9n-F#>=lfJp*g0j&;_{T(<@U7d> z9_5E6xM7?SnY@_%G<~(-PjtdOa+6z!;r7{4xEc=zlJ23ElH5T?_CL7bhSarfXM1T+ zlEABFf>k$$s|z9Sb1j-I0r`QcaS|{<5z7CYO}K0BSa>mT2Ue&6)_+Z6xg#eGyIA() zsC-%_Wo6Y~V7BzVFQy7xZ|ZXdKqZEzRYGH-k@wKrdu`UF^FR?GP6-WMnS1Knop9f=_u^PoId@5Ed zlRkXS+_xqCnO}dXd}cfGK&Z*vNWcv4A0ouMFZ-?Nj5vgG2+dEgUvogYj=CGn8UMFJ zR&XUDKw-jCOV^igFna@uamtS4L}OmHjFi!{T>i*x#6_F8I~KDLr5ueLhSECb3^X<@ zC>1(UpeNQb)SmBT;EnGqBP7Mmi|*&6TI%jCBLqz-#2uhT045 zSimL|UQE+-6u6Q7y<3)qSpJqL2wF3FQ;&XGxGQbOoxIU{FZJ1n*%Vx?16MOEIlcQ) z8{%cug<`k4&LX6hL935gR|S7bSEDhRdM$1{TASM~lJ}1laX0LUxjoZ4x5`sBV#8c^ z!}g(Y`0~UapGim(y*|&!yZu3@Gi560MDCE{{AWC(B4vZ%r5;xPrPzx`k{@9`?F+oh z9&acHD#!AT9eO1ts^!Z*+j2HjZaHRZDq3383%=&O+TZ+Vr-m4~4eCZ4rQk-XN(#S) z^)`8L1otl$_n%YCqU>gFE?qMW>UIwX--OrPNqE9kPTFDNNC8_%Ni)!f*3|0IeFIZkhYnZWL*e$K6bII@Ddg$+(Fcw>hSr@F*sQtf?@- za{HJGH$6XpW)R3e!E2&ac<49(sCf_qegaz2e^u|2PdpA*SiHz1e!G>fIa5wK3E~Q@ z!?AwRhRWn-%x`BghEE0j0U#i+e{P;0Gu7;*bf6UTxS$oV+)x0h4Pvn=f6 zON&OX*c+`-DADiYZ97NjU0a5u?z5=g5RVX7PZ11K6h43f`<~37U5F;6ojWYJ9e9FL zrE7dY4SJ;CHB-m7h@B@1Q}$gr5;C67=ZdJDxDP+=3I3)KR{iy!!vJ@F^()qw+cFQ% z;eY#ZPq;nvvMa2)IEw>bQpiHGyBs%nP$Re`qEGKj1-&oS0)>H4N+iz)02VSguFy_-v$wdD0cul|cCnnuf zKa@)EFx$mq9Df5G++;TPUCX)R(lq5DVLq3&-~0gTfnv9R_2uhnHU*MfJ8|8BrDS-c z*G#HWlyVR*bOQ+XB)YJ@ktxU~-*Q!&F9&C5slZP%Gp5$o#R*8o&YNj+MgypywK|um zJVZm)r2gyftFSaYkiJtjZG)!Wed!&hf|RdybM!023c%{oAj&yFvn!au#X=!OO*#JV zbMBF4F3NBWKG#e2#K0>PXSVyH#*zP;Hs$LY;3eVQlx#wWwp5aL|EDZbs+qv{hk&&D zYU5nF*5tYq^XoSu@U4s-KccjeWPFoDWt|#`Q_&x}GELgixIMedQXoc~sMgN*wO$q^ z3=swOO1cGe46S-ph&4W0bL*SQG^WX|Yx{9GBdiUzdy1zuii_ZEpN5KAhFbH4+uLM< zEPIy)!+>>3^>VtIwo}EuT0h1FvWS^Eya#CSWf%|VKsY)5+3THiKGcAzZp5>1CyRolcYrd=00)5Lc(%`J=Q zpOV?a>PZLZB$t^cYT6R~tjUb6Ss{QoPVV$z+)O=rG@k8JB%!@FF7(r}&O!;>4@U&q z>y=QgL@F##7gc>A+29fIGa%Blf412aG(>o`U%>=h}`acb7Y-PDKc z&SD1pgX;C!aU4uOMu&E(;I-8F+YPVdzYq_>Gc*O8=G46Gq2N;bfTo-X69)P1RMRH6 zidgs)U>ZnJ2ooVy5X`uj!j@2O@&<}VDniwC7aGQXsq)3708lC*PNmY1%phI^_#$=q zQ^fGjOmKnUO|WV2;GKoNTHE1snCChRU9xiRxC=&SMY&VmPQ74v+cql9$WlZZ+pa(6 z!UmOCRo&l6FIb8OeO1f2UHP*^-0DdGX=%18+IR8I;0c{UT2B66uZI5;AiG{@42PQI zOu1I#+zMGa%?pW!P?geDggjz>GfjND4WJI@Rfut<5K-hUm1)c4Gb)&Lnn1?%4dFue zN=P04Ruq&!{K3Xf2AxvLg-8<557>g2N((`JDDOd0H9XBZ8HDWKBvClwLzQE0x>PFQZw*74iT;5ZErao#d_&oqSK&uIN7bzW&3-JI&>;zV{SUBjBIhS& z<_iai;I`Njs7qu9y*=3jW9U(FFW$zBwI;8sA?m`s)E?FHR&stD`GGN#vBWThuDbih zK^5a^2ZbD5CZV$i|7t&3&F5pMF(F;7z$QBsL%G9Yhh!=L6UlP!MktsOvXQT;I+?vK zmv^nfCNC)1n9^i3P2eEgJ(_FQEZu)3S&~1c=hmP*#YD4ywy$zf`@a5uQGnt#hCL>% zjAU5;YEeve8JhY@4=yR9(m1Z8mqOBm_Y@fY$rqYYE&cJ4cSL^i@``XBbu1ZX z$j_)705Qf01UslbPt`r@ejOXEp~qC2#|tJ26HOY#-Avzzqwxe}aEQko(g-+$O$4Fh z;TaR}Zq6`MIFBnJsxbIT3g`0_%F7pmYyx^{9W3a-M7&!kw+VTSjtj|ZB{z&)2y?(-qT zGUPGzFJI0*aqP^mx4sr+*@tXvb{!{EbGocb;Agn7`pSg-N1o&3+^Y7#5Mn zhwb7DE3^^{K1yk_LTa*(+7?dg9mvrpN?>3HB* z*@YCm^?R>`0Jg|*OJPKX)E6wdQ$q>SKpmtV_FsqMB%2InH-fTJ;){ZqwZ^Jlmz)~I zXKaaqkMlG95!8XZW*2(ZI0rt7k?&zNdzyhUJ%>EXF zSzaZ^R$@`D)6Hbst;t+3QxeF?MFzWbMa7ODVnp2_uT|l>g5n=+V!J$mS`>i>U;M4a z&^6_#FYJn{mqlr3o|OYlj7#2=Xqhe6cT-wZE_(3`gC+IYRSFX2LBg8frpNg-5vG(3 SffQHcD1Qt?`;%G&^WZ7Z54>Lh literal 0 HcmV?d00001 diff --git a/code/extend/ddl/ext/2.ddl b/code/extend/ddl/ext/2.ddl new file mode 100644 index 0000000000000000000000000000000000000000..e8bda0e77b41bed73024fe367f19d34e285663de GIT binary patch literal 512 zcmV+b0{{Jzr@I8|FWBZ3R&lLN-CTrqa@ouBL`?52UH~-OuyC6--rRL55ALeHBHJzM zFW;PnHv98}k_082(`8)-E9H<>-?!X!h{4P?*wjlT$*c})M`8`8BKM`LcjC&9=gu`r z+AI&i-g?R6l_dKs6GF@@fdrOcUo8;jD+KMk#m|%|4XCO^+Vgb0uj-*S++ya~0AX$QPqJdXx15Pl^oKIhUhzX#a=F7~Iz zRX-7ru?^o%sWk(hjxXw1FtaK@J{#b_%=|{nA?=J`@Lta66~wu0X!Y_m^QX=qdJwH~ zLj%nyO-Pxqz&ZLjNTEds;vs6TxFJ*S8-2zH4@JJ0-l}?LOjIBW!EYy2{z5E2R9C?W zyY|Rui5|e8zVQfBa1b*Bd*#=wI8)lDd&A>Do)J+tm%W{ZesVpMg>MKO9a(Y*Rj9jw z$T7HFX4ZUM6$+g7UjDE|@`(wFsHGj{y`wA390*C>C!vHbzyVCgZyg}g<~C*JA}%|@ CBmjy4 literal 0 HcmV?d00001 diff --git a/code/extend/ddl/ext/3.ddl b/code/extend/ddl/ext/3.ddl new file mode 100644 index 0000000000000000000000000000000000000000..f0225056848b41ab5476bd3f2a0e208deddb9c32 GIT binary patch literal 1072 zcmV-01kd}Dr@I8|FWBZ3R&lLN-CTrqa@ouBL`?52UH~-OuyC8>L-sCM|?GZY| z6xLlXdh|l-a3uo5mCxfu_+GLn`Hft|q$kE^GI!8%<C}(4XlEE_XVgcHF;>g%81Stn2tv!?X?+qzxFB zNt5(2b1*fhF8x4kfedSQ6ZHG!R>cM>`i~|lH1>*#R}~_JQNwV_^C_` z3awTffS=O}zX!T|A29v-z~mEL&*X){kf~7xGxosowdnQ`keWWa*A-$r`_@gy4G#D= z0&mDm5gh+Do}P1$FNJdSJ2$T)Fsa6y;_3=Npb3B^%D8It1;x)`d7E^yW5r*5{b`Kp zqJgTAth3r}jjl@u;Vm9RlLcA#rug@nE7K8Huj}vSrwfgPXA|}6H^(!M5%G_=LQ+5* z9!C7>RpAeNT_Rd_k-v{R5!B%hKgIkcE|#OC2KADyM%#;3`kJ1v+7Sp{>U846Q0Ux^ zU>sDo&2-g5LJppBxO0K%zdfpjXR<+LmdkV%HB|>&F(JX}Mg8CLlq0p-;1(ZMb#NJx zRo=~Z#>Nve$Y9V5>BG5#FvoQFwf(y2)rt)1-a zp8J2bQWg9{Z;8TEtMiHph;FmXQmh9xwo+}Uw3<~fQ!xYtOx|ur2>;pv?L<(}m|EfE qkc;WO%J~hbg<#68YLWbPY?78(93tH*y zf@!%{FsOj>9`v&d)|an6vbE)n1~-_Ttzma+>fkscKI-wP89RtCyQ&xZvGkd;qkiEi zg+x#AtskOn4!dbER`i#^Gl+Oe`>nRdlNw@}KRUoB5R6mbFXw`ePn=FgA>`}j{JI=| z*~v3HLsWi@sY^~1){FmxCu?KmVi*1?9zn}MTeJ&~MRFhNgK@J+6Ie%Iol@TSmTpJDk}_9-TY m0X%Qv(2bl1JI^bCsmh2FBW){$Ftgw>0y~Hz>Bvk$hQO`Pz5pWt literal 0 HcmV?d00001 diff --git a/code/extend/ddl/ext/5.ddl b/code/extend/ddl/ext/5.ddl new file mode 100644 index 0000000000000000000000000000000000000000..0dffcf17176627deb9325496a241e90119c04191 GIT binary patch literal 352 zcmV-m0iXVor@I8|FWBZ3R&lLN-CTrqa@ouBL`?52UH~-OuyC7+AS+Oc<#&C6)eU&h zme3wZ$FH};u#?7gPH4^K z$@m30E08j%DjXB~m7zC)jjeHEC zlo!nKuU@?%!SG@EU_jqnyPhES$9ko>hci?Z+$3bSh!DH!VO@#Qe?>smUikSL9FmKT zTLZ%ZT>1oqgGd8)OaueAy*{A-TaL-INV~eHmCq|M_O8E@(ygPcPhSA yQhOSIus<%OR)-$_ZI{YD%eJmu1Axxri!I=6wF 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 Sy(Ul_E}xevU1*Z*9wwxawnc#e literal 0 HcmV?d00001 diff --git a/code/extend/ddl/ext/8.ddl b/code/extend/ddl/ext/8.ddl new file mode 100644 index 0000000000000000000000000000000000000000..28893bd81b2e5b9c50d1c7f3b1bacf8758bd0e46 GIT binary patch literal 3776 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 literal 0 HcmV?d00001