commit 960876a1bff6d1024109cb18789c2e87b5562175 Author: Error202 Date: Sun Jun 11 09:28:12 2023 +0300 init diff --git a/.bowerrc b/.bowerrc new file mode 100644 index 0000000..a39b5b0 --- /dev/null +++ b/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory" : "vendor/bower-asset" +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..460198d --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +# phpstorm project files +.idea + +# netbeans project files +nbproject + +# zend studio for eclipse project files +.buildpath +.project +.settings + +# windows thumbnail cache +Thumbs.db + +# composer vendor dir +/vendor + +# composer itself is not needed +composer.phar + +# composer lock +composer.lock + +# Mac DS_Store Files +.DS_Store + +# phpunit itself is not needed +phpunit.phar +# local phpunit config +/phpunit.xml + +tests/_output/* +tests/_support/_generated + +#vagrant folder +/.vagrant + +# PostgreSQL database files +/pgdata diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..ee872b9 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,29 @@ +Copyright © 2008 by Yii Software LLC (http://www.yiisoft.com) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of Yii Software LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..37fc76d --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ +init: docker-down-clear docker-up +up: docker-up +down: docker-down +restart: down up + +docker-up: + docker-compose up -d + +docker-down: + docker-compose down --remove-orphans + +docker-down-clear: + docker-compose down -v --remove-orphans + diff --git a/README.md b/README.md new file mode 100644 index 0000000..981a7f9 --- /dev/null +++ b/README.md @@ -0,0 +1,233 @@ +

+ + + +

Yii 2 Basic Project Template

+
+

+ +Yii 2 Basic Project Template is a skeleton [Yii 2](https://www.yiiframework.com/) application best for +rapidly creating small projects. + +The template contains the basic features including user login/logout and a contact page. +It includes all commonly used configurations that would allow you to focus on adding new +features to your application. + +[![Latest Stable Version](https://img.shields.io/packagist/v/yiisoft/yii2-app-basic.svg)](https://packagist.org/packages/yiisoft/yii2-app-basic) +[![Total Downloads](https://img.shields.io/packagist/dt/yiisoft/yii2-app-basic.svg)](https://packagist.org/packages/yiisoft/yii2-app-basic) +[![build](https://github.com/yiisoft/yii2-app-basic/workflows/build/badge.svg)](https://github.com/yiisoft/yii2-app-basic/actions?query=workflow%3Abuild) + +DIRECTORY STRUCTURE +------------------- + + assets/ contains assets definition + commands/ contains console commands (controllers) + config/ contains application configurations + controllers/ contains Web controller classes + mail/ contains view files for e-mails + models/ contains model classes + runtime/ contains files generated during runtime + tests/ contains various tests for the basic application + vendor/ contains dependent 3rd-party packages + views/ contains view files for the Web application + web/ contains the entry script and Web resources + + + +REQUIREMENTS +------------ + +The minimum requirement by this project template that your Web server supports PHP 7.4. + + +INSTALLATION +------------ + +### Install via Composer + +If you do not have [Composer](https://getcomposer.org/), you may install it by following the instructions +at [getcomposer.org](https://getcomposer.org/doc/00-intro.md#installation-nix). + +You can then install this project template using the following command: + +~~~ +composer create-project --prefer-dist yiisoft/yii2-app-basic basic +~~~ + +Now you should be able to access the application through the following URL, assuming `basic` is the directory +directly under the Web root. + +~~~ +http://localhost/basic/web/ +~~~ + +### Install from an Archive File + +Extract the archive file downloaded from [yiiframework.com](https://www.yiiframework.com/download/) to +a directory named `basic` that is directly under the Web root. + +Set cookie validation key in `config/web.php` file to some random secret string: + +```php +'request' => [ + // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation + 'cookieValidationKey' => '', +], +``` + +You can then access the application through the following URL: + +~~~ +http://localhost/basic/web/ +~~~ + + +### Install with Docker + +Update your vendor packages + + docker-compose run --rm php composer update --prefer-dist + +Run the installation triggers (creating cookie validation code) + + docker-compose run --rm php composer install + +Start the container + + docker-compose up -d + +You can then access the application through the following URL: + + http://127.0.0.1:8000 + +**NOTES:** +- Minimum required Docker engine version `17.04` for development (see [Performance tuning for volume mounts](https://docs.docker.com/docker-for-mac/osxfs-caching/)) +- The default configuration uses a host-volume in your home directory `.docker-composer` for composer caches + + +CONFIGURATION +------------- + +### Database + +Edit the file `config/db.php` with real data, for example: + +```php +return [ + 'class' => 'yii\db\Connection', + 'dsn' => 'mysql:host=localhost;dbname=yii2basic', + 'username' => 'root', + 'password' => '1234', + 'charset' => 'utf8', +]; +``` + +**NOTES:** +- Yii won't create the database for you, this has to be done manually before you can access it. +- Check and edit the other files in the `config/` directory to customize your application as required. +- Refer to the README in the `tests` directory for information specific to basic application tests. + + +TESTING +------- + +Tests are located in `tests` directory. They are developed with [Codeception PHP Testing Framework](https://codeception.com/). +By default, there are 3 test suites: + +- `unit` +- `functional` +- `acceptance` + +Tests can be executed by running + +``` +vendor/bin/codecept run +``` + +The command above will execute unit and functional tests. Unit tests are testing the system components, while functional +tests are for testing user interaction. Acceptance tests are disabled by default as they require additional setup since +they perform testing in real browser. + + +### Running acceptance tests + +To execute acceptance tests do the following: + +1. Rename `tests/acceptance.suite.yml.example` to `tests/acceptance.suite.yml` to enable suite configuration + +2. Replace `codeception/base` package in `composer.json` with `codeception/codeception` to install full-featured + version of Codeception + +3. Update dependencies with Composer + + ``` + composer update + ``` + +4. Download [Selenium Server](https://www.seleniumhq.org/download/) and launch it: + + ``` + java -jar ~/selenium-server-standalone-x.xx.x.jar + ``` + + In case of using Selenium Server 3.0 with Firefox browser since v48 or Google Chrome since v53 you must download [GeckoDriver](https://github.com/mozilla/geckodriver/releases) or [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/downloads) and launch Selenium with it: + + ``` + # for Firefox + java -jar -Dwebdriver.gecko.driver=~/geckodriver ~/selenium-server-standalone-3.xx.x.jar + + # for Google Chrome + java -jar -Dwebdriver.chrome.driver=~/chromedriver ~/selenium-server-standalone-3.xx.x.jar + ``` + + As an alternative way you can use already configured Docker container with older versions of Selenium and Firefox: + + ``` + docker run --net=host selenium/standalone-firefox:2.53.0 + ``` + +5. (Optional) Create `yii2basic_test` database and update it by applying migrations if you have them. + + ``` + tests/bin/yii migrate + ``` + + The database configuration can be found at `config/test_db.php`. + + +6. Start web server: + + ``` + tests/bin/yii serve + ``` + +7. Now you can run all available tests + + ``` + # run all available tests + vendor/bin/codecept run + + # run acceptance tests + vendor/bin/codecept run acceptance + + # run only unit and functional tests + vendor/bin/codecept run unit,functional + ``` + +### Code coverage support + +By default, code coverage is disabled in `codeception.yml` configuration file, you should uncomment needed rows to be able +to collect code coverage. You can run your tests and collect coverage with the following command: + +``` +#collect coverage for all tests +vendor/bin/codecept run --coverage --coverage-html --coverage-xml + +#collect coverage only for unit tests +vendor/bin/codecept run unit --coverage --coverage-html --coverage-xml + +#collect coverage for unit and functional tests +vendor/bin/codecept run functional,unit --coverage --coverage-html --coverage-xml +``` + +You can see code coverage output under the `tests/_output` directory. diff --git a/assets/AppAsset.php b/assets/AppAsset.php new file mode 100644 index 0000000..3d40487 --- /dev/null +++ b/assets/AppAsset.php @@ -0,0 +1,31 @@ + + * @since 2.0 + */ +class AppAsset extends AssetBundle +{ + public $basePath = '@webroot'; + public $baseUrl = '@web'; + public $css = [ + 'css/site.css', + ]; + public $js = [ + ]; + public $depends = [ + 'yii\web\YiiAsset', + 'yii\bootstrap5\BootstrapAsset' + ]; +} diff --git a/codeception.yml b/codeception.yml new file mode 100644 index 0000000..dd8febc --- /dev/null +++ b/codeception.yml @@ -0,0 +1,27 @@ +actor: Tester +bootstrap: _bootstrap.php +paths: + tests: tests + output: tests/_output + data: tests/_data + helpers: tests/_support +settings: + memory_limit: 1024M + colors: true +modules: + config: + Yii2: + configFile: 'config/test.php' + +# To enable code coverage: +#coverage: +# #c3_url: http://localhost:8080/index-test.php/ +# enabled: true +# #remote: true +# #remote_config: '../codeception.yml' +# whitelist: +# include: +# - models/* +# - controllers/* +# - commands/* +# - mail/* diff --git a/commands/HelloController.php b/commands/HelloController.php new file mode 100644 index 0000000..9ec914d --- /dev/null +++ b/commands/HelloController.php @@ -0,0 +1,34 @@ + + * @since 2.0 + */ +class HelloController extends Controller +{ + /** + * This command echoes what you have entered as the message. + * @param string $message the message to be echoed. + * @return int Exit code + */ + public function actionIndex($message = 'hello world') + { + echo $message . "\n"; + + return ExitCode::OK; + } +} diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..59b9380 --- /dev/null +++ b/composer.json @@ -0,0 +1,75 @@ +{ + "name": "yiisoft/yii2-app-basic", + "description": "Yii 2 Basic Project Template", + "keywords": ["yii2", "framework", "basic", "project template"], + "homepage": "https://www.yiiframework.com/", + "type": "project", + "license": "BSD-3-Clause", + "support": { + "issues": "https://github.com/yiisoft/yii2/issues?state=open", + "forum": "https://www.yiiframework.com/forum/", + "wiki": "https://www.yiiframework.com/wiki/", + "irc": "irc://irc.freenode.net/yii", + "source": "https://github.com/yiisoft/yii2" + }, + "minimum-stability": "stable", + "require": { + "php": ">=7.4.0", + "yiisoft/yii2": "~2.0.45", + "yiisoft/yii2-bootstrap5": "~2.0.2", + "yiisoft/yii2-symfonymailer": "~2.0.3" + }, + "require-dev": { + "yiisoft/yii2-debug": "~2.1.0", + "yiisoft/yii2-gii": "~2.2.0", + "yiisoft/yii2-faker": "~2.0.0", + "phpunit/phpunit": "~9.5.0", + "codeception/codeception": "^5.0.0 || ^4.0", + "codeception/lib-innerbrowser": "^4.0 || ^3.0 || ^1.1", + "codeception/module-asserts": "^3.0 || ^1.1", + "codeception/module-yii2": "^1.1", + "codeception/module-filesystem": "^3.0 || ^2.0 || ^1.1", + "codeception/verify": "^3.0 || ^2.2", + "symfony/browser-kit": "^6.0 || >=2.7 <=4.2.4" + }, + "config": { + "allow-plugins": { + "yiisoft/yii2-composer" : true + }, + "process-timeout": 1800, + "fxp-asset": { + "enabled": false + } + }, + "scripts": { + "post-install-cmd": [ + "yii\\composer\\Installer::postInstall" + ], + "post-create-project-cmd": [ + "yii\\composer\\Installer::postCreateProject", + "yii\\composer\\Installer::postInstall" + ] + }, + "extra": { + "yii\\composer\\Installer::postCreateProject": { + "setPermission": [ + { + "runtime": "0777", + "web/assets": "0777", + "yii": "0755" + } + ] + }, + "yii\\composer\\Installer::postInstall": { + "generateCookieValidationKey": [ + "config/web.php" + ] + } + }, + "repositories": [ + { + "type": "composer", + "url": "https://asset-packagist.org" + } + ] +} diff --git a/config/__autocomplete.php b/config/__autocomplete.php new file mode 100644 index 0000000..d99dea5 --- /dev/null +++ b/config/__autocomplete.php @@ -0,0 +1,33 @@ + 'basic-console', + 'basePath' => dirname(__DIR__), + 'bootstrap' => ['log'], + 'controllerNamespace' => 'app\commands', + 'aliases' => [ + '@bower' => '@vendor/bower-asset', + '@npm' => '@vendor/npm-asset', + '@tests' => '@app/tests', + ], + 'components' => [ + 'cache' => [ + 'class' => 'yii\caching\FileCache', + ], + 'log' => [ + 'targets' => [ + [ + 'class' => 'yii\log\FileTarget', + 'levels' => ['error', 'warning'], + ], + ], + ], + 'db' => $db, + ], + 'params' => $params, + /* + 'controllerMap' => [ + 'fixture' => [ // Fixture generation command line. + 'class' => 'yii\faker\FixtureController', + ], + ], + */ +]; + +if (YII_ENV_DEV) { + // configuration adjustments for 'dev' environment + $config['bootstrap'][] = 'gii'; + $config['modules']['gii'] = [ + 'class' => 'yii\gii\Module', + ]; + // configuration adjustments for 'dev' environment + // requires version `2.1.21` of yii2-debug module + $config['bootstrap'][] = 'debug'; + $config['modules']['debug'] = [ + 'class' => 'yii\debug\Module', + // uncomment the following to add your IP if you are not connecting from localhost. + //'allowedIPs' => ['127.0.0.1', '::1'], + ]; +} + +return $config; diff --git a/config/db.php b/config/db.php new file mode 100644 index 0000000..bc75e61 --- /dev/null +++ b/config/db.php @@ -0,0 +1,14 @@ + 'yii\db\Connection', + 'dsn' => 'mysql:host=localhost;dbname=yii2basic', + 'username' => 'root', + 'password' => '', + 'charset' => 'utf8', + + // Schema cache options (for production environment) + //'enableSchemaCache' => true, + //'schemaCacheDuration' => 60, + //'schemaCache' => 'cache', +]; diff --git a/config/params.php b/config/params.php new file mode 100644 index 0000000..981c621 --- /dev/null +++ b/config/params.php @@ -0,0 +1,7 @@ + 'admin@example.com', + 'senderEmail' => 'noreply@example.com', + 'senderName' => 'Example.com mailer', +]; diff --git a/config/test.php b/config/test.php new file mode 100644 index 0000000..317bc1c --- /dev/null +++ b/config/test.php @@ -0,0 +1,46 @@ + 'basic-tests', + 'basePath' => dirname(__DIR__), + 'aliases' => [ + '@bower' => '@vendor/bower-asset', + '@npm' => '@vendor/npm-asset', + ], + 'language' => 'en-US', + 'components' => [ + 'db' => $db, + 'mailer' => [ + 'class' => \yii\symfonymailer\Mailer::class, + 'viewPath' => '@app/mail', + // send all mails to a file by default. + 'useFileTransport' => true, + 'messageClass' => 'yii\symfonymailer\Message' + ], + 'assetManager' => [ + 'basePath' => __DIR__ . '/../web/assets', + ], + 'urlManager' => [ + 'showScriptName' => true, + ], + 'user' => [ + 'identityClass' => 'app\models\User', + ], + 'request' => [ + 'cookieValidationKey' => 'test', + 'enableCsrfValidation' => false, + // but if you absolutely need it set cookie domain to localhost + /* + 'csrfCookie' => [ + 'domain' => 'localhost', + ], + */ + ], + ], + 'params' => $params, +]; diff --git a/config/test_db.php b/config/test_db.php new file mode 100644 index 0000000..f4290e0 --- /dev/null +++ b/config/test_db.php @@ -0,0 +1,6 @@ + 'basic', + 'basePath' => dirname(__DIR__), + 'bootstrap' => ['log'], + 'aliases' => [ + '@bower' => '@vendor/bower-asset', + '@npm' => '@vendor/npm-asset', + ], + 'components' => [ + 'request' => [ + // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation + 'cookieValidationKey' => 'kxzoL3hScKXhQzb-QNrA75YJw7mrG_Su', + ], + 'cache' => [ + 'class' => 'yii\caching\FileCache', + ], + 'user' => [ + 'identityClass' => 'app\models\User', + 'enableAutoLogin' => true, + ], + 'errorHandler' => [ + 'errorAction' => 'site/error', + ], + 'mailer' => [ + 'class' => \yii\symfonymailer\Mailer::class, + 'viewPath' => '@app/mail', + // send all mails to a file by default. + 'useFileTransport' => true, + ], + 'log' => [ + 'traceLevel' => YII_DEBUG ? 3 : 0, + 'targets' => [ + [ + 'class' => 'yii\log\FileTarget', + 'levels' => ['error', 'warning'], + ], + ], + ], + 'db' => $db, + 'urlManager' => [ + 'enablePrettyUrl' => true, + 'showScriptName' => false, + 'rules' => [ + ], + ], + ], + 'params' => $params, +]; + +if (YII_ENV_DEV) { + // configuration adjustments for 'dev' environment + $config['bootstrap'][] = 'debug'; + $config['modules']['debug'] = [ + 'class' => 'yii\debug\Module', + // uncomment the following to add your IP if you are not connecting from localhost. + //'allowedIPs' => ['127.0.0.1', '::1'], + ]; + + $config['bootstrap'][] = 'gii'; + $config['modules']['gii'] = [ + 'class' => 'yii\gii\Module', + // uncomment the following to add your IP if you are not connecting from localhost. + //'allowedIPs' => ['127.0.0.1', '::1'], + ]; +} + +return $config; diff --git a/controllers/SiteController.php b/controllers/SiteController.php new file mode 100644 index 0000000..67c3f50 --- /dev/null +++ b/controllers/SiteController.php @@ -0,0 +1,128 @@ + [ + 'class' => AccessControl::class, + 'only' => ['logout'], + 'rules' => [ + [ + 'actions' => ['logout'], + 'allow' => true, + 'roles' => ['@'], + ], + ], + ], + 'verbs' => [ + 'class' => VerbFilter::class, + 'actions' => [ + 'logout' => ['post'], + ], + ], + ]; + } + + /** + * {@inheritdoc} + */ + public function actions() + { + return [ + 'error' => [ + 'class' => 'yii\web\ErrorAction', + ], + 'captcha' => [ + 'class' => 'yii\captcha\CaptchaAction', + 'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null, + ], + ]; + } + + /** + * Displays homepage. + * + * @return string + */ + public function actionIndex() + { + return $this->render('index'); + } + + /** + * Login action. + * + * @return Response|string + */ + public function actionLogin() + { + if (!Yii::$app->user->isGuest) { + return $this->goHome(); + } + + $model = new LoginForm(); + if ($model->load(Yii::$app->request->post()) && $model->login()) { + return $this->goBack(); + } + + $model->password = ''; + return $this->render('login', [ + 'model' => $model, + ]); + } + + /** + * Logout action. + * + * @return Response + */ + public function actionLogout() + { + Yii::$app->user->logout(); + + return $this->goHome(); + } + + /** + * Displays contact page. + * + * @return Response|string + */ + public function actionContact() + { + $model = new ContactForm(); + if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail'])) { + Yii::$app->session->setFlash('contactFormSubmitted'); + + return $this->refresh(); + } + return $this->render('contact', [ + 'model' => $model, + ]); + } + + /** + * Displays about page. + * + * @return string + */ + public function actionAbout() + { + return $this->render('about'); + } +} diff --git a/controllers/api/TestController.php b/controllers/api/TestController.php new file mode 100644 index 0000000..bc6f6dc --- /dev/null +++ b/controllers/api/TestController.php @@ -0,0 +1,15 @@ + +beginPage() ?> + + + + + <?= Html::encode($this->title) ?> + head() ?> + + + beginBody() ?> + + endBody() ?> + + +endPage() ?> diff --git a/mail/layouts/text.php b/mail/layouts/text.php new file mode 100644 index 0000000..c376864 --- /dev/null +++ b/mail/layouts/text.php @@ -0,0 +1,13 @@ +beginPage(); +$this->beginBody(); +echo $content; +$this->endBody(); +$this->endPage(); diff --git a/models/ContactForm.php b/models/ContactForm.php new file mode 100644 index 0000000..f001d21 --- /dev/null +++ b/models/ContactForm.php @@ -0,0 +1,65 @@ + 'Verification Code', + ]; + } + + /** + * Sends an email to the specified email address using the information collected by this model. + * @param string $email the target email address + * @return bool whether the model passes validation + */ + public function contact($email) + { + if ($this->validate()) { + Yii::$app->mailer->compose() + ->setTo($email) + ->setFrom([Yii::$app->params['senderEmail'] => Yii::$app->params['senderName']]) + ->setReplyTo([$this->email => $this->name]) + ->setSubject($this->subject) + ->setTextBody($this->body) + ->send(); + + return true; + } + return false; + } +} diff --git a/models/LoginForm.php b/models/LoginForm.php new file mode 100644 index 0000000..dce15cc --- /dev/null +++ b/models/LoginForm.php @@ -0,0 +1,81 @@ +hasErrors()) { + $user = $this->getUser(); + + if (!$user || !$user->validatePassword($this->password)) { + $this->addError($attribute, 'Incorrect username or password.'); + } + } + } + + /** + * Logs in a user using the provided username and password. + * @return bool whether the user is logged in successfully + */ + public function login() + { + if ($this->validate()) { + return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0); + } + return false; + } + + /** + * Finds user by [[username]] + * + * @return User|null + */ + public function getUser() + { + if ($this->_user === false) { + $this->_user = User::findByUsername($this->username); + } + + return $this->_user; + } +} diff --git a/models/User.php b/models/User.php new file mode 100644 index 0000000..2e3fb25 --- /dev/null +++ b/models/User.php @@ -0,0 +1,104 @@ + [ + 'id' => '100', + 'username' => 'admin', + 'password' => 'admin', + 'authKey' => 'test100key', + 'accessToken' => '100-token', + ], + '101' => [ + 'id' => '101', + 'username' => 'demo', + 'password' => 'demo', + 'authKey' => 'test101key', + 'accessToken' => '101-token', + ], + ]; + + + /** + * {@inheritdoc} + */ + public static function findIdentity($id) + { + return isset(self::$users[$id]) ? new static(self::$users[$id]) : null; + } + + /** + * {@inheritdoc} + */ + public static function findIdentityByAccessToken($token, $type = null) + { + foreach (self::$users as $user) { + if ($user['accessToken'] === $token) { + return new static($user); + } + } + + return null; + } + + /** + * Finds user by username + * + * @param string $username + * @return static|null + */ + public static function findByUsername($username) + { + foreach (self::$users as $user) { + if (strcasecmp($user['username'], $username) === 0) { + return new static($user); + } + } + + return null; + } + + /** + * {@inheritdoc} + */ + public function getId() + { + return $this->id; + } + + /** + * {@inheritdoc} + */ + public function getAuthKey() + { + return $this->authKey; + } + + /** + * {@inheritdoc} + */ + public function validateAuthKey($authKey) + { + return $this->authKey === $authKey; + } + + /** + * Validates password + * + * @param string $password password to validate + * @return bool if password provided is valid for current user + */ + public function validatePassword($password) + { + return $this->password === $password; + } +} diff --git a/requirements.php b/requirements.php new file mode 100644 index 0000000..c1a6bf6 --- /dev/null +++ b/requirements.php @@ -0,0 +1,162 @@ +Error\n\n" + . "

The path to yii framework seems to be incorrect.

\n" + . '

You need to install Yii framework via composer or adjust the framework path in file ' . basename(__FILE__) . ".

\n" + . '

Please refer to the README on how to install Yii.

\n"; + + if (!empty($_SERVER['argv'])) { + // do not print HTML when used in console mode + echo strip_tags($message); + } else { + echo $message; + } + exit(1); +} + +require_once($frameworkPath . '/requirements/YiiRequirementChecker.php'); +$requirementsChecker = new YiiRequirementChecker(); + +$gdMemo = $imagickMemo = 'Either GD PHP extension with FreeType support or ImageMagick PHP extension with PNG support is required for image CAPTCHA.'; +$gdOK = $imagickOK = false; + +if (extension_loaded('imagick')) { + $imagick = new Imagick(); + $imagickFormats = $imagick->queryFormats('PNG'); + if (in_array('PNG', $imagickFormats)) { + $imagickOK = true; + } else { + $imagickMemo = 'Imagick extension should be installed with PNG support in order to be used for image CAPTCHA.'; + } +} + +if (extension_loaded('gd')) { + $gdInfo = gd_info(); + if (!empty($gdInfo['FreeType Support'])) { + $gdOK = true; + } else { + $gdMemo = 'GD extension should be installed with FreeType support in order to be used for image CAPTCHA.'; + } +} + +/** + * Adjust requirements according to your application specifics. + */ +$requirements = array( + // Database : + array( + 'name' => 'PDO extension', + 'mandatory' => true, + 'condition' => extension_loaded('pdo'), + 'by' => 'All DB-related classes', + ), + array( + 'name' => 'PDO SQLite extension', + 'mandatory' => false, + 'condition' => extension_loaded('pdo_sqlite'), + 'by' => 'All DB-related classes', + 'memo' => 'Required for SQLite database.', + ), + array( + 'name' => 'PDO MySQL extension', + 'mandatory' => false, + 'condition' => extension_loaded('pdo_mysql'), + 'by' => 'All DB-related classes', + 'memo' => 'Required for MySQL database.', + ), + array( + 'name' => 'PDO PostgreSQL extension', + 'mandatory' => false, + 'condition' => extension_loaded('pdo_pgsql'), + 'by' => 'All DB-related classes', + 'memo' => 'Required for PostgreSQL database.', + ), + // Cache : + array( + 'name' => 'Memcache extension', + 'mandatory' => false, + 'condition' => extension_loaded('memcache') || extension_loaded('memcached'), + 'by' => 'MemCache', + 'memo' => extension_loaded('memcached') ? 'To use memcached set MemCache::useMemcached to true.' : '' + ), + // CAPTCHA: + array( + 'name' => 'GD PHP extension with FreeType support', + 'mandatory' => false, + 'condition' => $gdOK, + 'by' => 'Captcha', + 'memo' => $gdMemo, + ), + array( + 'name' => 'ImageMagick PHP extension with PNG support', + 'mandatory' => false, + 'condition' => $imagickOK, + 'by' => 'Captcha', + 'memo' => $imagickMemo, + ), + // PHP ini : + 'phpExposePhp' => array( + 'name' => 'Expose PHP', + 'mandatory' => false, + 'condition' => $requirementsChecker->checkPhpIniOff("expose_php"), + 'by' => 'Security reasons', + 'memo' => '"expose_php" should be disabled at php.ini', + ), + 'phpAllowUrlInclude' => array( + 'name' => 'PHP allow url include', + 'mandatory' => false, + 'condition' => $requirementsChecker->checkPhpIniOff("allow_url_include"), + 'by' => 'Security reasons', + 'memo' => '"allow_url_include" should be disabled at php.ini', + ), + 'phpSmtp' => array( + 'name' => 'PHP mail SMTP', + 'mandatory' => false, + 'condition' => strlen(ini_get('SMTP')) > 0, + 'by' => 'Email sending', + 'memo' => 'PHP mail SMTP server required', + ), +); + +// OPcache check +if (!version_compare(phpversion(), '5.5', '>=')) { + $requirements[] = array( + 'name' => 'APC extension', + 'mandatory' => false, + 'condition' => extension_loaded('apc'), + 'by' => 'ApcCache', + ); +} + +$result = $requirementsChecker->checkYii()->check($requirements)->getResult(); +$requirementsChecker->render(); +exit($result['summary']['errors'] === 0 ? 0 : 1); diff --git a/runtime/.gitignore b/runtime/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/runtime/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/tests/_bootstrap.php b/tests/_bootstrap.php new file mode 100644 index 0000000..131da42 --- /dev/null +++ b/tests/_bootstrap.php @@ -0,0 +1,6 @@ +amOnPage(Url::toRoute('/site/about')); + $I->see('About', 'h1'); + } +} diff --git a/tests/acceptance/ContactCest.php b/tests/acceptance/ContactCest.php new file mode 100644 index 0000000..90f9848 --- /dev/null +++ b/tests/acceptance/ContactCest.php @@ -0,0 +1,34 @@ +amOnPage(Url::toRoute('/site/contact')); + } + + public function contactPageWorks(AcceptanceTester $I) + { + $I->wantTo('ensure that contact page works'); + $I->see('Contact', 'h1'); + } + + public function contactFormCanBeSubmitted(AcceptanceTester $I) + { + $I->amGoingTo('submit contact form with correct data'); + $I->fillField('#contactform-name', 'tester'); + $I->fillField('#contactform-email', 'tester@example.com'); + $I->fillField('#contactform-subject', 'test subject'); + $I->fillField('#contactform-body', 'test content'); + $I->fillField('#contactform-verifycode', 'testme'); + + $I->click('contact-button'); + + $I->wait(2); // wait for button to be clicked + + $I->dontSeeElement('#contact-form'); + $I->see('Thank you for contacting us. We will respond to you as soon as possible.'); + } +} diff --git a/tests/acceptance/HomeCest.php b/tests/acceptance/HomeCest.php new file mode 100644 index 0000000..e65df16 --- /dev/null +++ b/tests/acceptance/HomeCest.php @@ -0,0 +1,18 @@ +amOnPage(Url::toRoute('/site/index')); + $I->see('My Company'); + + $I->seeLink('About'); + $I->click('About'); + $I->wait(2); // wait for page to be opened + + $I->see('This is the About page.'); + } +} diff --git a/tests/acceptance/LoginCest.php b/tests/acceptance/LoginCest.php new file mode 100644 index 0000000..6f5cb2f --- /dev/null +++ b/tests/acceptance/LoginCest.php @@ -0,0 +1,21 @@ +amOnPage(Url::toRoute('/site/login')); + $I->see('Login', 'h1'); + + $I->amGoingTo('try to login with correct credentials'); + $I->fillField('input[name="LoginForm[username]"]', 'admin'); + $I->fillField('input[name="LoginForm[password]"]', 'admin'); + $I->click('login-button'); + $I->wait(2); // wait for button to be clicked + + $I->expectTo('see user info'); + $I->see('Logout'); + } +} diff --git a/tests/acceptance/_bootstrap.php b/tests/acceptance/_bootstrap.php new file mode 100644 index 0000000..b3d9bbc --- /dev/null +++ b/tests/acceptance/_bootstrap.php @@ -0,0 +1 @@ + [ + 'db' => require __DIR__ . '/../../config/test_db.php' + ] + ] +); + + +$application = new yii\console\Application($config); +$exitCode = $application->run(); +exit($exitCode); diff --git a/tests/bin/yii.bat b/tests/bin/yii.bat new file mode 100644 index 0000000..ce14c92 --- /dev/null +++ b/tests/bin/yii.bat @@ -0,0 +1,20 @@ +@echo off + +rem ------------------------------------------------------------- +rem Yii command line bootstrap script for Windows. +rem +rem @author Qiang Xue +rem @link https://www.yiiframework.com/ +rem @copyright Copyright (c) 2008 Yii Software LLC +rem @license https://www.yiiframework.com/license/ +rem ------------------------------------------------------------- + +@setlocal + +set YII_PATH=%~dp0 + +if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe + +"%PHP_COMMAND%" "%YII_PATH%yii" %* + +@endlocal diff --git a/tests/functional.suite.yml b/tests/functional.suite.yml new file mode 100644 index 0000000..9d8cf14 --- /dev/null +++ b/tests/functional.suite.yml @@ -0,0 +1,14 @@ +# Codeception Test Suite Configuration + +# suite for functional (integration) tests. +# emulate web requests and make application process them. +# (tip: better to use with frameworks). + +# RUN `build` COMMAND AFTER ADDING/REMOVING MODULES. +#basic/web/index.php +actor: FunctionalTester +modules: + enabled: + - Filesystem + - Yii2 + - Asserts diff --git a/tests/functional/ContactFormCest.php b/tests/functional/ContactFormCest.php new file mode 100644 index 0000000..d17ef52 --- /dev/null +++ b/tests/functional/ContactFormCest.php @@ -0,0 +1,57 @@ +amOnRoute('site/contact'); + } + + public function openContactPage(\FunctionalTester $I) + { + $I->see('Contact', 'h1'); + } + + public function submitEmptyForm(\FunctionalTester $I) + { + $I->submitForm('#contact-form', []); + $I->expectTo('see validations errors'); + $I->see('Contact', 'h1'); + $I->see('Name cannot be blank'); + $I->see('Email cannot be blank'); + $I->see('Subject cannot be blank'); + $I->see('Body cannot be blank'); + $I->see('The verification code is incorrect'); + } + + public function submitFormWithIncorrectEmail(\FunctionalTester $I) + { + $I->submitForm('#contact-form', [ + 'ContactForm[name]' => 'tester', + 'ContactForm[email]' => 'tester.email', + 'ContactForm[subject]' => 'test subject', + 'ContactForm[body]' => 'test content', + 'ContactForm[verifyCode]' => 'testme', + ]); + $I->expectTo('see that email address is wrong'); + $I->dontSee('Name cannot be blank', '.help-inline'); + $I->see('Email is not a valid email address.'); + $I->dontSee('Subject cannot be blank', '.help-inline'); + $I->dontSee('Body cannot be blank', '.help-inline'); + $I->dontSee('The verification code is incorrect', '.help-inline'); + } + + public function submitFormSuccessfully(\FunctionalTester $I) + { + $I->submitForm('#contact-form', [ + 'ContactForm[name]' => 'tester', + 'ContactForm[email]' => 'tester@example.com', + 'ContactForm[subject]' => 'test subject', + 'ContactForm[body]' => 'test content', + 'ContactForm[verifyCode]' => 'testme', + ]); + $I->seeEmailIsSent(); + $I->dontSeeElement('#contact-form'); + $I->see('Thank you for contacting us. We will respond to you as soon as possible.'); + } +} diff --git a/tests/functional/LoginFormCest.php b/tests/functional/LoginFormCest.php new file mode 100644 index 0000000..7a83a27 --- /dev/null +++ b/tests/functional/LoginFormCest.php @@ -0,0 +1,59 @@ +amOnRoute('site/login'); + } + + public function openLoginPage(\FunctionalTester $I) + { + $I->see('Login', 'h1'); + + } + + // demonstrates `amLoggedInAs` method + public function internalLoginById(\FunctionalTester $I) + { + $I->amLoggedInAs(100); + $I->amOnPage('/'); + $I->see('Logout (admin)'); + } + + // demonstrates `amLoggedInAs` method + public function internalLoginByInstance(\FunctionalTester $I) + { + $I->amLoggedInAs(\app\models\User::findByUsername('admin')); + $I->amOnPage('/'); + $I->see('Logout (admin)'); + } + + public function loginWithEmptyCredentials(\FunctionalTester $I) + { + $I->submitForm('#login-form', []); + $I->expectTo('see validations errors'); + $I->see('Username cannot be blank.'); + $I->see('Password cannot be blank.'); + } + + public function loginWithWrongCredentials(\FunctionalTester $I) + { + $I->submitForm('#login-form', [ + 'LoginForm[username]' => 'admin', + 'LoginForm[password]' => 'wrong', + ]); + $I->expectTo('see validations errors'); + $I->see('Incorrect username or password.'); + } + + public function loginSuccessfully(\FunctionalTester $I) + { + $I->submitForm('#login-form', [ + 'LoginForm[username]' => 'admin', + 'LoginForm[password]' => 'admin', + ]); + $I->see('Logout (admin)'); + $I->dontSeeElement('form#login-form'); + } +} \ No newline at end of file diff --git a/tests/functional/_bootstrap.php b/tests/functional/_bootstrap.php new file mode 100644 index 0000000..b3d9bbc --- /dev/null +++ b/tests/functional/_bootstrap.php @@ -0,0 +1 @@ +attributes = [ + 'name' => 'Tester', + 'email' => 'tester@example.com', + 'subject' => 'very important letter subject', + 'body' => 'body of current message', + 'verifyCode' => 'testme', + ]; + + verify($model->contact('admin@example.com'))->notEmpty(); + + // using Yii2 module actions to check email was sent + $this->tester->seeEmailIsSent(); + + /** @var MessageInterface $emailMessage */ + $emailMessage = $this->tester->grabLastSentEmail(); + verify($emailMessage)->instanceOf('yii\mail\MessageInterface'); + verify($emailMessage->getTo())->arrayHasKey('admin@example.com'); + verify($emailMessage->getFrom())->arrayHasKey('noreply@example.com'); + verify($emailMessage->getReplyTo())->arrayHasKey('tester@example.com'); + verify($emailMessage->getSubject())->equals('very important letter subject'); + verify($emailMessage->toString())->stringContainsString('body of current message'); + } +} diff --git a/tests/unit/models/LoginFormTest.php b/tests/unit/models/LoginFormTest.php new file mode 100644 index 0000000..3c1dcdd --- /dev/null +++ b/tests/unit/models/LoginFormTest.php @@ -0,0 +1,51 @@ +user->logout(); + } + + public function testLoginNoUser() + { + $this->model = new LoginForm([ + 'username' => 'not_existing_username', + 'password' => 'not_existing_password', + ]); + + verify($this->model->login())->false(); + verify(\Yii::$app->user->isGuest)->true(); + } + + public function testLoginWrongPassword() + { + $this->model = new LoginForm([ + 'username' => 'demo', + 'password' => 'wrong_password', + ]); + + verify($this->model->login())->false(); + verify(\Yii::$app->user->isGuest)->true(); + verify($this->model->errors)->arrayHasKey('password'); + } + + public function testLoginCorrect() + { + $this->model = new LoginForm([ + 'username' => 'demo', + 'password' => 'demo', + ]); + + verify($this->model->login())->true(); + verify(\Yii::$app->user->isGuest)->false(); + verify($this->model->errors)->arrayHasNotKey('password'); + } + +} diff --git a/tests/unit/models/UserTest.php b/tests/unit/models/UserTest.php new file mode 100644 index 0000000..28986cb --- /dev/null +++ b/tests/unit/models/UserTest.php @@ -0,0 +1,44 @@ +notEmpty(); + verify($user->username)->equals('admin'); + + verify(User::findIdentity(999))->empty(); + } + + public function testFindUserByAccessToken() + { + verify($user = User::findIdentityByAccessToken('100-token'))->notEmpty(); + verify($user->username)->equals('admin'); + + verify(User::findIdentityByAccessToken('non-existing'))->empty(); + } + + public function testFindUserByUsername() + { + verify($user = User::findByUsername('admin'))->notEmpty(); + verify(User::findByUsername('not-admin'))->empty(); + } + + /** + * @depends testFindUserByUsername + */ + public function testValidateUser() + { + $user = User::findByUsername('admin'); + verify($user->validateAuthKey('test100key'))->notEmpty(); + verify($user->validateAuthKey('test102key'))->empty(); + + verify($user->validatePassword('admin'))->notEmpty(); + verify($user->validatePassword('123456'))->empty(); + } + +} diff --git a/tests/unit/widgets/AlertTest.php b/tests/unit/widgets/AlertTest.php new file mode 100644 index 0000000..e9857a1 --- /dev/null +++ b/tests/unit/widgets/AlertTest.php @@ -0,0 +1,261 @@ +session->setFlash('error', $message); + + $renderingResult = Alert::widget(); + + verify($renderingResult)->stringContainsString($message); + verify($renderingResult)->stringContainsString('alert-danger'); + + verify($renderingResult)->stringNotContainsString('alert-success'); + verify($renderingResult)->stringNotContainsString('alert-info'); + verify($renderingResult)->stringNotContainsString('alert-warning'); + } + + public function testMultipleErrorMessages() + { + $firstMessage = 'This is the first error message'; + $secondMessage = 'This is the second error message'; + + Yii::$app->session->setFlash('error', [$firstMessage, $secondMessage]); + + $renderingResult = Alert::widget(); + + verify($renderingResult)->stringContainsString($firstMessage); + verify($renderingResult)->stringContainsString($secondMessage); + verify($renderingResult)->stringContainsString('alert-danger'); + + verify($renderingResult)->stringNotContainsString('alert-success'); + verify($renderingResult)->stringNotContainsString('alert-info'); + verify($renderingResult)->stringNotContainsString('alert-warning'); + } + + public function testSingleDangerMessage() + { + $message = 'This is a danger message'; + + Yii::$app->session->setFlash('danger', $message); + + $renderingResult = Alert::widget(); + + verify($renderingResult)->stringContainsString($message); + verify($renderingResult)->stringContainsString('alert-danger'); + + verify($renderingResult)->stringNotContainsString('alert-success'); + verify($renderingResult)->stringNotContainsString('alert-info'); + verify($renderingResult)->stringNotContainsString('alert-warning'); + } + + public function testMultipleDangerMessages() + { + $firstMessage = 'This is the first danger message'; + $secondMessage = 'This is the second danger message'; + + Yii::$app->session->setFlash('danger', [$firstMessage, $secondMessage]); + + $renderingResult = Alert::widget(); + + verify($renderingResult)->stringContainsString($firstMessage); + verify($renderingResult)->stringContainsString($secondMessage); + verify($renderingResult)->stringContainsString('alert-danger'); + + verify($renderingResult)->stringNotContainsString('alert-success'); + verify($renderingResult)->stringNotContainsString('alert-info'); + verify($renderingResult)->stringNotContainsString('alert-warning'); + } + + public function testSingleSuccessMessage() + { + $message = 'This is a success message'; + + Yii::$app->session->setFlash('success', $message); + + $renderingResult = Alert::widget(); + + verify($renderingResult)->stringContainsString($message); + verify($renderingResult)->stringContainsString('alert-success'); + + verify($renderingResult)->stringNotContainsString('alert-danger'); + verify($renderingResult)->stringNotContainsString('alert-info'); + verify($renderingResult)->stringNotContainsString('alert-warning'); + } + + public function testMultipleSuccessMessages() + { + $firstMessage = 'This is the first danger message'; + $secondMessage = 'This is the second danger message'; + + Yii::$app->session->setFlash('success', [$firstMessage, $secondMessage]); + + $renderingResult = Alert::widget(); + + verify($renderingResult)->stringContainsString($firstMessage); + verify($renderingResult)->stringContainsString($secondMessage); + verify($renderingResult)->stringContainsString('alert-success'); + + verify($renderingResult)->stringNotContainsString('alert-danger'); + verify($renderingResult)->stringNotContainsString('alert-info'); + verify($renderingResult)->stringNotContainsString('alert-warning'); + } + + public function testSingleInfoMessage() + { + $message = 'This is an info message'; + + Yii::$app->session->setFlash('info', $message); + + $renderingResult = Alert::widget(); + + verify($renderingResult)->stringContainsString($message); + verify($renderingResult)->stringContainsString('alert-info'); + + verify($renderingResult)->stringNotContainsString('alert-danger'); + verify($renderingResult)->stringNotContainsString('alert-success'); + verify($renderingResult)->stringNotContainsString('alert-warning'); + } + + public function testMultipleInfoMessages() + { + $firstMessage = 'This is the first info message'; + $secondMessage = 'This is the second info message'; + + Yii::$app->session->setFlash('info', [$firstMessage, $secondMessage]); + + $renderingResult = Alert::widget(); + + verify($renderingResult)->stringContainsString($firstMessage); + verify($renderingResult)->stringContainsString($secondMessage); + verify($renderingResult)->stringContainsString('alert-info'); + + verify($renderingResult)->stringNotContainsString('alert-danger'); + verify($renderingResult)->stringNotContainsString('alert-success'); + verify($renderingResult)->stringNotContainsString('alert-warning'); + } + + public function testSingleWarningMessage() + { + $message = 'This is a warning message'; + + Yii::$app->session->setFlash('warning', $message); + + $renderingResult = Alert::widget(); + + verify($renderingResult)->stringContainsString($message); + verify($renderingResult)->stringContainsString('alert-warning'); + + verify($renderingResult)->stringNotContainsString('alert-danger'); + verify($renderingResult)->stringNotContainsString('alert-success'); + verify($renderingResult)->stringNotContainsString('alert-info'); + } + + public function testMultipleWarningMessages() + { + $firstMessage = 'This is the first warning message'; + $secondMessage = 'This is the second warning message'; + + Yii::$app->session->setFlash('warning', [$firstMessage, $secondMessage]); + + $renderingResult = Alert::widget(); + + verify($renderingResult)->stringContainsString($firstMessage); + verify($renderingResult)->stringContainsString($secondMessage); + verify($renderingResult)->stringContainsString('alert-warning'); + + verify($renderingResult)->stringNotContainsString('alert-danger'); + verify($renderingResult)->stringNotContainsString('alert-success'); + verify($renderingResult)->stringNotContainsString('alert-info'); + } + + public function testSingleMixedMessages() { + $errorMessage = 'This is an error message'; + $dangerMessage = 'This is a danger message'; + $successMessage = 'This is a success message'; + $infoMessage = 'This is a info message'; + $warningMessage = 'This is a warning message'; + + Yii::$app->session->setFlash('error', $errorMessage); + Yii::$app->session->setFlash('danger', $dangerMessage); + Yii::$app->session->setFlash('success', $successMessage); + Yii::$app->session->setFlash('info', $infoMessage); + Yii::$app->session->setFlash('warning', $warningMessage); + + $renderingResult = Alert::widget(); + + verify($renderingResult)->stringContainsString($errorMessage); + verify($renderingResult)->stringContainsString($dangerMessage); + verify($renderingResult)->stringContainsString($successMessage); + verify($renderingResult)->stringContainsString($infoMessage); + verify($renderingResult)->stringContainsString($warningMessage); + + verify($renderingResult)->stringContainsString('alert-danger'); + verify($renderingResult)->stringContainsString('alert-success'); + verify($renderingResult)->stringContainsString('alert-info'); + verify($renderingResult)->stringContainsString('alert-warning'); + } + + public function testMultipleMixedMessages() { + $firstErrorMessage = 'This is the first error message'; + $secondErrorMessage = 'This is the second error message'; + $firstDangerMessage = 'This is the first danger message'; + $secondDangerMessage = 'This is the second'; + $firstSuccessMessage = 'This is the first success message'; + $secondSuccessMessage = 'This is the second success message'; + $firstInfoMessage = 'This is the first info message'; + $secondInfoMessage = 'This is the second info message'; + $firstWarningMessage = 'This is the first warning message'; + $secondWarningMessage = 'This is the second warning message'; + + Yii::$app->session->setFlash('error', [$firstErrorMessage, $secondErrorMessage]); + Yii::$app->session->setFlash('danger', [$firstDangerMessage, $secondDangerMessage]); + Yii::$app->session->setFlash('success', [$firstSuccessMessage, $secondSuccessMessage]); + Yii::$app->session->setFlash('info', [$firstInfoMessage, $secondInfoMessage]); + Yii::$app->session->setFlash('warning', [$firstWarningMessage, $secondWarningMessage]); + + $renderingResult = Alert::widget(); + + verify($renderingResult)->stringContainsString($firstErrorMessage); + verify($renderingResult)->stringContainsString($secondErrorMessage); + verify($renderingResult)->stringContainsString($firstDangerMessage); + verify($renderingResult)->stringContainsString($secondDangerMessage); + verify($renderingResult)->stringContainsString($firstSuccessMessage); + verify($renderingResult)->stringContainsString($secondSuccessMessage); + verify($renderingResult)->stringContainsString($firstInfoMessage); + verify($renderingResult)->stringContainsString($secondInfoMessage); + verify($renderingResult)->stringContainsString($firstWarningMessage); + verify($renderingResult)->stringContainsString($secondWarningMessage); + + verify($renderingResult)->stringContainsString('alert-danger'); + verify($renderingResult)->stringContainsString('alert-success'); + verify($renderingResult)->stringContainsString('alert-info'); + verify($renderingResult)->stringContainsString('alert-warning'); + } + + public function testFlashIntegrity() + { + $errorMessage = 'This is an error message'; + $unrelatedMessage = 'This is a message that is not related to the alert widget'; + + Yii::$app->session->setFlash('error', $errorMessage); + Yii::$app->session->setFlash('unrelated', $unrelatedMessage); + + Alert::widget(); + + // Simulate redirect + Yii::$app->session->close(); + Yii::$app->session->open(); + + verify(Yii::$app->session->getFlash('error'))->empty(); + verify(Yii::$app->session->getFlash('unrelated'))->equals($unrelatedMessage); + } +} diff --git a/views/layouts/main.php b/views/layouts/main.php new file mode 100644 index 0000000..d4fcbcb --- /dev/null +++ b/views/layouts/main.php @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/views/site/about.php b/views/site/about.php new file mode 100644 index 0000000..ea006ec --- /dev/null +++ b/views/site/about.php @@ -0,0 +1,18 @@ +title = 'About'; +$this->params['breadcrumbs'][] = $this->title; +?> +
+

title) ?>

+ +

+ This is the About page. You may modify the following file to customize its content: +

+ + +
diff --git a/views/site/contact.php b/views/site/contact.php new file mode 100644 index 0000000..597fabc --- /dev/null +++ b/views/site/contact.php @@ -0,0 +1,68 @@ +title = 'Contact'; +$this->params['breadcrumbs'][] = $this->title; +?> +
+

title) ?>

+ + session->hasFlash('contactFormSubmitted')): ?> + +
+ Thank you for contacting us. We will respond to you as soon as possible. +
+ +

+ Note that if you turn on the Yii debugger, you should be able + to view the mail message on the mail panel of the debugger. + mailer->useFileTransport): ?> + Because the application is in development mode, the email is not sent but saved as + a file under mailer->fileTransportPath) ?>. + Please configure the useFileTransport property of the mail + application component to be false to enable email sending. + +

+ + + +

+ If you have business inquiries or other questions, please fill out the following form to contact us. + Thank you. +

+ +
+
+ + 'contact-form']); ?> + + field($model, 'name')->textInput(['autofocus' => true]) ?> + + field($model, 'email') ?> + + field($model, 'subject') ?> + + field($model, 'body')->textarea(['rows' => 6]) ?> + + field($model, 'verifyCode')->widget(Captcha::class, [ + 'template' => '
{image}
{input}
', + ]) ?> + +
+ 'btn btn-primary', 'name' => 'contact-button']) ?> +
+ + + +
+
+ + +
diff --git a/views/site/error.php b/views/site/error.php new file mode 100644 index 0000000..4a37b25 --- /dev/null +++ b/views/site/error.php @@ -0,0 +1,27 @@ +title = $name; +?> +
+ +

title) ?>

+ +
+ +
+ +

+ The above error occurred while the Web server was processing your request. +

+

+ Please contact us if you think this is a server error. Thank you. +

+ +
diff --git a/views/site/index.php b/views/site/index.php new file mode 100644 index 0000000..df5df7c --- /dev/null +++ b/views/site/index.php @@ -0,0 +1,53 @@ +title = 'My Yii Application'; +?> +
+ +
+

Congratulations!

+ +

You have successfully created your Yii-powered application.

+ +

Get started with Yii

+
+ +
+ +
+
+

Heading

+ +

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et + dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip + ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu + fugiat nulla pariatur.

+ +

Yii Documentation »

+
+
+

Heading

+ +

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et + dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip + ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu + fugiat nulla pariatur.

+ +

Yii Forum »

+
+
+

Heading

+ +

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et + dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip + ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu + fugiat nulla pariatur.

+ +

Yii Extensions »

+
+
+ +
+
diff --git a/views/site/login.php b/views/site/login.php new file mode 100644 index 0000000..db003c0 --- /dev/null +++ b/views/site/login.php @@ -0,0 +1,55 @@ +title = 'Login'; +$this->params['breadcrumbs'][] = $this->title; +?> + diff --git a/vue3/.gitignore b/vue3/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/vue3/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/vue3/.vscode/extensions.json b/vue3/.vscode/extensions.json new file mode 100644 index 0000000..c0a6e5a --- /dev/null +++ b/vue3/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] +} diff --git a/vue3/README.md b/vue3/README.md new file mode 100644 index 0000000..e62e093 --- /dev/null +++ b/vue3/README.md @@ -0,0 +1,7 @@ +# Vue 3 + Vite + +This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 ` + + diff --git a/vue3/package-lock.json b/vue3/package-lock.json new file mode 100644 index 0000000..60a59fd --- /dev/null +++ b/vue3/package-lock.json @@ -0,0 +1,798 @@ +{ + "name": "yvv", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "yvv", + "version": "0.0.0", + "dependencies": { + "axios": "^1.4.0", + "vue": "^3.2.47" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.1.0", + "vite": "^4.3.9" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", + "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz", + "integrity": "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", + "dependencies": { + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", + "dependencies": { + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0", + "postcss": "^8.1.10", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", + "dependencies": { + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", + "dependencies": { + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", + "dependencies": { + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", + "dependencies": { + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" + }, + "peerDependencies": { + "vue": "3.3.4" + } + }, + "node_modules/@vue/shared": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "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==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "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==", + "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==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/postcss": { + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "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" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "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==" + }, + "node_modules/rollup": { + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.24.1.tgz", + "integrity": "sha512-REHe5dx30ERBRFS0iENPHy+t6wtSEYkjrhwNsLyh3qpRaZ1+aylvMUdMBUHWUD/RjjLmLzEvY8Z9XRlpcdIkHA==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vite": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "dev": true, + "dependencies": { + "esbuild": "^0.17.5", + "postcss": "^8.4.23", + "rollup": "^3.21.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" + } + } + } +} diff --git a/vue3/package.json b/vue3/package.json new file mode 100644 index 0000000..d034caf --- /dev/null +++ b/vue3/package.json @@ -0,0 +1,19 @@ +{ + "name": "yvv", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "axios": "^1.4.0", + "vue": "^3.2.47" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.1.0", + "vite": "^4.3.9" + } +} diff --git a/vue3/public/vite.svg b/vue3/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/vue3/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vue3/src/App.vue b/vue3/src/App.vue new file mode 100644 index 0000000..9d6e8df --- /dev/null +++ b/vue3/src/App.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/vue3/src/assets/vue.svg b/vue3/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/vue3/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vue3/src/main.js b/vue3/src/main.js new file mode 100644 index 0000000..499b10e --- /dev/null +++ b/vue3/src/main.js @@ -0,0 +1,7 @@ +import { createApp } from 'vue' +import './style.css' +import App from './App.vue' + +const app = createApp(App) + +app.mount('#app') diff --git a/vue3/src/services/http.client.js b/vue3/src/services/http.client.js new file mode 100644 index 0000000..9e39e78 --- /dev/null +++ b/vue3/src/services/http.client.js @@ -0,0 +1,9 @@ +import axios from "axios" + +const httpClient = axios.create({ + baseURL: '/api', + timeout: 15000, + headers: {"Content-Type": "application/json"}, +}) + +export default httpClient diff --git a/vue3/src/services/test.service.js b/vue3/src/services/test.service.js new file mode 100644 index 0000000..915593e --- /dev/null +++ b/vue3/src/services/test.service.js @@ -0,0 +1,9 @@ +import httpClient from './http.client.js' + +class TestService { + getRecords() { + return httpClient.get('/test/index').then() + } +} + +export default new TestService() diff --git a/vue3/src/style.css b/vue3/src/style.css new file mode 100644 index 0000000..84a0050 --- /dev/null +++ b/vue3/src/style.css @@ -0,0 +1,89 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +.card { + padding: 2em; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/vue3/vite.config.js b/vue3/vite.config.js new file mode 100644 index 0000000..5aa41f9 --- /dev/null +++ b/vue3/vite.config.js @@ -0,0 +1,20 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vitejs.dev/config/ +export default defineConfig({ + server: { + proxy: { + "/api": { + target: "http://localhost:8001", + changeOrigin: true, + secure: false, + ws: true, + }, + }, + }, + build: { + outDir: '../web', + }, + plugins: [vue()], +}) diff --git a/web/.htaccess b/web/.htaccess new file mode 100644 index 0000000..197199e --- /dev/null +++ b/web/.htaccess @@ -0,0 +1,4 @@ +RewriteEngine on +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME} !-f +RewriteRule . index.php [L] diff --git a/web/assets/index-c05be89e.css b/web/assets/index-c05be89e.css new file mode 100644 index 0000000..1c17a44 --- /dev/null +++ b/web/assets/index-c05be89e.css @@ -0,0 +1 @@ +:root{font-family:Inter,system-ui,Avenir,Helvetica,Arial,sans-serif;line-height:1.5;font-weight:400;color-scheme:light dark;color:#ffffffde;background-color:#242424;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-text-size-adjust:100%}a{font-weight:500;color:#646cff;text-decoration:inherit}a:hover{color:#535bf2}body{margin:0;display:flex;place-items:center;min-width:320px;min-height:100vh}h1{font-size:3.2em;line-height:1.1}button{border-radius:8px;border:1px solid transparent;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#1a1a1a;cursor:pointer;transition:border-color .25s}button:hover{border-color:#646cff}button:focus,button:focus-visible{outline:4px auto -webkit-focus-ring-color}.card{padding:2em}#app{max-width:1280px;margin:0 auto;padding:2rem;text-align:center}@media (prefers-color-scheme: light){:root{color:#213547;background-color:#fff}a:hover{color:#747bff}button{background-color:#f9f9f9}}.logo[data-v-1d75a1d6]{height:6em;padding:1.5em;will-change:filter;transition:filter .3s}.logo[data-v-1d75a1d6]:hover{filter:drop-shadow(0 0 2em #646cffaa)}.logo.vue[data-v-1d75a1d6]:hover{filter:drop-shadow(0 0 2em #42b883aa)} diff --git a/web/assets/index-c9f5c948.css b/web/assets/index-c9f5c948.css new file mode 100644 index 0000000..bfe4bce --- /dev/null +++ b/web/assets/index-c9f5c948.css @@ -0,0 +1 @@ +:root{font-family:Inter,system-ui,Avenir,Helvetica,Arial,sans-serif;line-height:1.5;font-weight:400;color-scheme:light dark;color:#ffffffde;background-color:#242424;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-text-size-adjust:100%}a{font-weight:500;color:#646cff;text-decoration:inherit}a:hover{color:#535bf2}body{margin:0;display:flex;place-items:center;min-width:320px;min-height:100vh}h1{font-size:3.2em;line-height:1.1}button{border-radius:8px;border:1px solid transparent;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#1a1a1a;cursor:pointer;transition:border-color .25s}button:hover{border-color:#646cff}button:focus,button:focus-visible{outline:4px auto -webkit-focus-ring-color}.card{padding:2em}#app{max-width:1280px;margin:0 auto;padding:2rem;text-align:center}@media (prefers-color-scheme: light){:root{color:#213547;background-color:#fff}a:hover{color:#747bff}button{background-color:#f9f9f9}}.logo[data-v-46b2d863]{height:6em;padding:1.5em;will-change:filter;transition:filter .3s}.logo[data-v-46b2d863]:hover{filter:drop-shadow(0 0 2em #646cffaa)}.logo.vue[data-v-46b2d863]:hover{filter:drop-shadow(0 0 2em #42b883aa)} diff --git a/web/assets/index-d563b5ec.js b/web/assets/index-d563b5ec.js new file mode 100644 index 0000000..cfe7018 --- /dev/null +++ b/web/assets/index-d563b5ec.js @@ -0,0 +1,3 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const o of s)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(s){const o={};return s.integrity&&(o.integrity=s.integrity),s.referrerPolicy&&(o.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?o.credentials="include":s.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(s){if(s.ep)return;s.ep=!0;const o=n(s);fetch(s.href,o)}})();function Yn(e,t){const n=Object.create(null),r=e.split(",");for(let s=0;s!!n[s.toLowerCase()]:s=>!!n[s]}const q={},Ye=[],de=()=>{},Ro=()=>!1,So=/^on[^a-z]/,Gt=e=>So.test(e),Qn=e=>e.startsWith("onUpdate:"),Q=Object.assign,Zn=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Co=Object.prototype.hasOwnProperty,L=(e,t)=>Co.call(e,t),N=Array.isArray,Qe=e=>en(e)==="[object Map]",ps=e=>en(e)==="[object Set]",v=e=>typeof e=="function",X=e=>typeof e=="string",Gn=e=>typeof e=="symbol",W=e=>e!==null&&typeof e=="object",ms=e=>W(e)&&v(e.then)&&v(e.catch),gs=Object.prototype.toString,en=e=>gs.call(e),Po=e=>en(e).slice(8,-1),bs=e=>en(e)==="[object Object]",er=e=>X(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,jt=Yn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),tn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Fo=/-(\w)/g,et=tn(e=>e.replace(Fo,(t,n)=>n?n.toUpperCase():"")),No=/\B([A-Z])/g,ot=tn(e=>e.replace(No,"-$1").toLowerCase()),_s=tn(e=>e.charAt(0).toUpperCase()+e.slice(1)),En=tn(e=>e?`on${_s(e)}`:""),_t=(e,t)=>!Object.is(e,t),wn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Io=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Pr;const Mn=()=>Pr||(Pr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function tr(e){if(N(e)){const t={};for(let n=0;n{if(n){const r=n.split(Mo);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function nr(e){let t="";if(X(e))t=e;else if(N(e))for(let n=0;nX(e)?e:e==null?"":N(e)||W(e)&&(e.toString===gs||!v(e.toString))?JSON.stringify(e,Es,2):String(e),Es=(e,t)=>t&&t.__v_isRef?Es(e,t.value):Qe(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s])=>(n[`${r} =>`]=s,n),{})}:ps(t)?{[`Set(${t.size})`]:[...t.values()]}:W(t)&&!N(t)&&!bs(t)?String(t):t;let ce;class Ho{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=ce,!t&&ce&&(this.index=(ce.scopes||(ce.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=ce;try{return ce=this,t()}finally{ce=n}}}on(){ce=this}off(){ce=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},ws=e=>(e.w&ve)>0,xs=e=>(e.n&ve)>0,qo=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r{(d==="length"||d>=f)&&l.push(u)})}else switch(n!==void 0&&l.push(i.get(n)),t){case"add":N(e)?er(n)&&l.push(i.get("length")):(l.push(i.get(qe)),Qe(e)&&l.push(i.get(Bn)));break;case"delete":N(e)||(l.push(i.get(qe)),Qe(e)&&l.push(i.get(Bn)));break;case"set":Qe(e)&&l.push(i.get(qe));break}if(l.length===1)l[0]&&Dn(l[0]);else{const f=[];for(const u of l)u&&f.push(...u);Dn(rr(f))}}function Dn(e,t){const n=N(e)?e:[...e];for(const r of n)r.computed&&Nr(r);for(const r of n)r.computed||Nr(r)}function Nr(e,t){(e!==ue||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const Wo=Yn("__proto__,__v_isRef,__isVue"),As=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Gn)),ko=or(),Jo=or(!1,!0),Vo=or(!0),Ir=Xo();function Xo(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=B(this);for(let o=0,i=this.length;o{e[t]=function(...n){it();const r=B(this)[t].apply(this,n);return lt(),r}}),e}function Yo(e){const t=B(this);return se(t,"has",e),t.hasOwnProperty(e)}function or(e=!1,t=!1){return function(r,s,o){if(s==="__v_isReactive")return!e;if(s==="__v_isReadonly")return e;if(s==="__v_isShallow")return t;if(s==="__v_raw"&&o===(e?t?di:Fs:t?Ps:Cs).get(r))return r;const i=N(r);if(!e){if(i&&L(Ir,s))return Reflect.get(Ir,s,o);if(s==="hasOwnProperty")return Yo}const l=Reflect.get(r,s,o);return(Gn(s)?As.has(s):Wo(s))||(e||se(r,"get",s),t)?l:ee(l)?i&&er(s)?l:l.value:W(l)?e?Ns(l):cr(l):l}}const Qo=Rs(),Zo=Rs(!0);function Rs(e=!1){return function(n,r,s,o){let i=n[r];if(tt(i)&&ee(i)&&!ee(s))return!1;if(!e&&(!Vt(s)&&!tt(s)&&(i=B(i),s=B(s)),!N(n)&&ee(i)&&!ee(s)))return i.value=s,!0;const l=N(n)&&er(r)?Number(r)e,nn=e=>Reflect.getPrototypeOf(e);function vt(e,t,n=!1,r=!1){e=e.__v_raw;const s=B(e),o=B(t);n||(t!==o&&se(s,"get",t),se(s,"get",o));const{has:i}=nn(s),l=r?ir:n?ur:yt;if(i.call(s,t))return l(e.get(t));if(i.call(s,o))return l(e.get(o));e!==s&&e.get(t)}function Mt(e,t=!1){const n=this.__v_raw,r=B(n),s=B(e);return t||(e!==s&&se(r,"has",e),se(r,"has",s)),e===s?n.has(e):n.has(e)||n.has(s)}function Lt(e,t=!1){return e=e.__v_raw,!t&&se(B(e),"iterate",qe),Reflect.get(e,"size",e)}function vr(e){e=B(e);const t=B(this);return nn(t).has.call(t,e)||(t.add(e),Ae(t,"add",e,e)),this}function Mr(e,t){t=B(t);const n=B(this),{has:r,get:s}=nn(n);let o=r.call(n,e);o||(e=B(e),o=r.call(n,e));const i=s.call(n,e);return n.set(e,t),o?_t(t,i)&&Ae(n,"set",e,t):Ae(n,"add",e,t),this}function Lr(e){const t=B(this),{has:n,get:r}=nn(t);let s=n.call(t,e);s||(e=B(e),s=n.call(t,e)),r&&r.call(t,e);const o=t.delete(e);return s&&Ae(t,"delete",e,void 0),o}function Ur(){const e=B(this),t=e.size!==0,n=e.clear();return t&&Ae(e,"clear",void 0,void 0),n}function Ut(e,t){return function(r,s){const o=this,i=o.__v_raw,l=B(i),f=t?ir:e?ur:yt;return!e&&se(l,"iterate",qe),i.forEach((u,d)=>r.call(s,f(u),f(d),o))}}function Bt(e,t,n){return function(...r){const s=this.__v_raw,o=B(s),i=Qe(o),l=e==="entries"||e===Symbol.iterator&&i,f=e==="keys"&&i,u=s[e](...r),d=n?ir:t?ur:yt;return!t&&se(o,"iterate",f?Bn:qe),{next(){const{value:m,done:x}=u.next();return x?{value:m,done:x}:{value:l?[d(m[0]),d(m[1])]:d(m),done:x}},[Symbol.iterator](){return this}}}}function Ce(e){return function(...t){return e==="delete"?!1:this}}function si(){const e={get(o){return vt(this,o)},get size(){return Lt(this)},has:Mt,add:vr,set:Mr,delete:Lr,clear:Ur,forEach:Ut(!1,!1)},t={get(o){return vt(this,o,!1,!0)},get size(){return Lt(this)},has:Mt,add:vr,set:Mr,delete:Lr,clear:Ur,forEach:Ut(!1,!0)},n={get(o){return vt(this,o,!0)},get size(){return Lt(this,!0)},has(o){return Mt.call(this,o,!0)},add:Ce("add"),set:Ce("set"),delete:Ce("delete"),clear:Ce("clear"),forEach:Ut(!0,!1)},r={get(o){return vt(this,o,!0,!0)},get size(){return Lt(this,!0)},has(o){return Mt.call(this,o,!0)},add:Ce("add"),set:Ce("set"),delete:Ce("delete"),clear:Ce("clear"),forEach:Ut(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(o=>{e[o]=Bt(o,!1,!1),n[o]=Bt(o,!0,!1),t[o]=Bt(o,!1,!0),r[o]=Bt(o,!0,!0)}),[e,n,t,r]}const[oi,ii,li,ci]=si();function lr(e,t){const n=t?e?ci:li:e?ii:oi;return(r,s,o)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(L(n,s)&&s in r?n:r,s,o)}const fi={get:lr(!1,!1)},ui={get:lr(!1,!0)},ai={get:lr(!0,!1)},Cs=new WeakMap,Ps=new WeakMap,Fs=new WeakMap,di=new WeakMap;function hi(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function pi(e){return e.__v_skip||!Object.isExtensible(e)?0:hi(Po(e))}function cr(e){return tt(e)?e:fr(e,!1,Ss,fi,Cs)}function mi(e){return fr(e,!1,ri,ui,Ps)}function Ns(e){return fr(e,!0,ni,ai,Fs)}function fr(e,t,n,r,s){if(!W(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=s.get(e);if(o)return o;const i=pi(e);if(i===0)return e;const l=new Proxy(e,i===2?r:n);return s.set(e,l),l}function Ze(e){return tt(e)?Ze(e.__v_raw):!!(e&&e.__v_isReactive)}function tt(e){return!!(e&&e.__v_isReadonly)}function Vt(e){return!!(e&&e.__v_isShallow)}function Is(e){return Ze(e)||tt(e)}function B(e){const t=e&&e.__v_raw;return t?B(t):e}function vs(e){return Jt(e,"__v_skip",!0),e}const yt=e=>W(e)?cr(e):e,ur=e=>W(e)?Ns(e):e;function Ms(e){Ne&&ue&&(e=B(e),Ts(e.dep||(e.dep=rr())))}function Ls(e,t){e=B(e);const n=e.dep;n&&Dn(n)}function ee(e){return!!(e&&e.__v_isRef===!0)}function gi(e){return bi(e,!1)}function bi(e,t){return ee(e)?e:new _i(e,t)}class _i{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:B(t),this._value=n?t:yt(t)}get value(){return Ms(this),this._value}set value(t){const n=this.__v_isShallow||Vt(t)||tt(t);t=n?t:B(t),_t(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:yt(t),Ls(this))}}function yi(e){return ee(e)?e.value:e}const Ei={get:(e,t,n)=>yi(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return ee(s)&&!ee(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function Us(e){return Ze(e)?e:new Proxy(e,Ei)}class wi{constructor(t,n,r,s){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new sr(t,()=>{this._dirty||(this._dirty=!0,Ls(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!s,this.__v_isReadonly=r}get value(){const t=B(this);return Ms(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function xi(e,t,n=!1){let r,s;const o=v(e);return o?(r=e,s=de):(r=e.get,s=e.set),new wi(r,s,o||!s,n)}function Ie(e,t,n,r){let s;try{s=r?e(...r):e()}catch(o){rn(o,t,n)}return s}function he(e,t,n,r){if(v(e)){const o=Ie(e,t,n,r);return o&&ms(o)&&o.catch(i=>{rn(i,t,n)}),o}const s=[];for(let o=0;o>>1;wt(Z[r])_e&&Z.splice(t,1)}function Si(e){N(e)?Ge.push(...e):(!Oe||!Oe.includes(e,e.allowRecurse?He+1:He))&&Ge.push(e),Ds()}function Br(e,t=Et?_e+1:0){for(;twt(n)-wt(r)),He=0;Hee.id==null?1/0:e.id,Ci=(e,t)=>{const n=wt(e)-wt(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Hs(e){jn=!1,Et=!0,Z.sort(Ci);const t=de;try{for(_e=0;_eX(R)?R.trim():R)),m&&(s=n.map(Io))}let l,f=r[l=En(t)]||r[l=En(et(t))];!f&&o&&(f=r[l=En(ot(t))]),f&&he(f,e,6,s);const u=r[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,he(u,e,6,s)}}function $s(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(s!==void 0)return s;const o=e.emits;let i={},l=!1;if(!v(e)){const f=u=>{const d=$s(u,t,!0);d&&(l=!0,Q(i,d))};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}return!o&&!l?(W(e)&&r.set(e,null),null):(N(o)?o.forEach(f=>i[f]=null):Q(i,o),W(e)&&r.set(e,i),i)}function sn(e,t){return!e||!Gt(t)?!1:(t=t.slice(2).replace(/Once$/,""),L(e,t[0].toLowerCase()+t.slice(1))||L(e,ot(t))||L(e,t))}let ye=null,on=null;function Xt(e){const t=ye;return ye=e,on=e&&e.type.__scopeId||null,t}function Fi(e){on=e}function Ni(){on=null}function Ii(e,t=ye,n){if(!t||e._n)return e;const r=(...s)=>{r._d&&Jr(-1);const o=Xt(t);let i;try{i=e(...s)}finally{Xt(o),r._d&&Jr(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function xn(e){const{type:t,vnode:n,proxy:r,withProxy:s,props:o,propsOptions:[i],slots:l,attrs:f,emit:u,render:d,renderCache:m,data:x,setupState:R,ctx:O,inheritAttrs:A}=e;let D,j;const z=Xt(e);try{if(n.shapeFlag&4){const I=s||r;D=be(d.call(I,I,m,o,R,x,O)),j=f}else{const I=t;D=be(I.length>1?I(o,{attrs:f,slots:l,emit:u}):I(o,null)),j=t.props?f:vi(f)}}catch(I){bt.length=0,rn(I,e,1),D=ze(xt)}let J=D;if(j&&A!==!1){const I=Object.keys(j),{shapeFlag:Se}=J;I.length&&Se&7&&(i&&I.some(Qn)&&(j=Mi(j,i)),J=nt(J,j))}return n.dirs&&(J=nt(J),J.dirs=J.dirs?J.dirs.concat(n.dirs):n.dirs),n.transition&&(J.transition=n.transition),D=J,Xt(z),D}const vi=e=>{let t;for(const n in e)(n==="class"||n==="style"||Gt(n))&&((t||(t={}))[n]=e[n]);return t},Mi=(e,t)=>{const n={};for(const r in e)(!Qn(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Li(e,t,n){const{props:r,children:s,component:o}=e,{props:i,children:l,patchFlag:f}=t,u=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&f>=0){if(f&1024)return!0;if(f&16)return r?Dr(r,i,u):!!i;if(f&8){const d=t.dynamicProps;for(let m=0;me.__isSuspense;function Di(e,t){t&&t.pendingBranch?N(e)?t.effects.push(...e):t.effects.push(e):Si(e)}const Dt={};function On(e,t,n){return Ks(e,t,n)}function Ks(e,t,{immediate:n,deep:r,flush:s,onTrack:o,onTrigger:i}=q){var l;const f=Ko()===((l=G)==null?void 0:l.scope)?G:null;let u,d=!1,m=!1;if(ee(e)?(u=()=>e.value,d=Vt(e)):Ze(e)?(u=()=>e,r=!0):N(e)?(m=!0,d=e.some(I=>Ze(I)||Vt(I)),u=()=>e.map(I=>{if(ee(I))return I.value;if(Ze(I))return Xe(I);if(v(I))return Ie(I,f,2)})):v(e)?t?u=()=>Ie(e,f,2):u=()=>{if(!(f&&f.isUnmounted))return x&&x(),he(e,f,3,[R])}:u=de,t&&r){const I=u;u=()=>Xe(I())}let x,R=I=>{x=z.onStop=()=>{Ie(I,f,4)}},O;if(Tt)if(R=de,t?n&&he(t,f,3,[u(),m?[]:void 0,R]):u(),s==="sync"){const I=Ll();O=I.__watcherHandles||(I.__watcherHandles=[])}else return de;let A=m?new Array(e.length).fill(Dt):Dt;const D=()=>{if(z.active)if(t){const I=z.run();(r||d||(m?I.some((Se,ft)=>_t(Se,A[ft])):_t(I,A)))&&(x&&x(),he(t,f,3,[I,A===Dt?void 0:m&&A[0]===Dt?[]:A,R]),A=I)}else z.run()};D.allowRecurse=!!t;let j;s==="sync"?j=D:s==="post"?j=()=>re(D,f&&f.suspense):(D.pre=!0,f&&(D.id=f.uid),j=()=>dr(D));const z=new sr(u,j);t?n?D():A=z.run():s==="post"?re(z.run.bind(z),f&&f.suspense):z.run();const J=()=>{z.stop(),f&&f.scope&&Zn(f.scope.effects,z)};return O&&O.push(J),J}function ji(e,t,n){const r=this.proxy,s=X(e)?e.includes(".")?qs(r,e):()=>r[e]:e.bind(r,r);let o;v(t)?o=t:(o=t.handler,n=t);const i=G;rt(this);const l=Ks(s,o.bind(r),n);return i?rt(i):We(),l}function qs(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;s{Xe(n,t)});else if(bs(e))for(const n in e)Xe(e[n],t);return e}function De(e,t,n,r){const s=e.dirs,o=t&&t.dirs;for(let i=0;i!!e.type.__asyncLoader,zs=e=>e.type.__isKeepAlive;function Hi(e,t){Ws(e,"a",t)}function $i(e,t){Ws(e,"da",t)}function Ws(e,t,n=G){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(ln(t,r,n),n){let s=n.parent;for(;s&&s.parent;)zs(s.parent.vnode)&&Ki(r,t,n,s),s=s.parent}}function Ki(e,t,n,r){const s=ln(t,e,r,!0);ks(()=>{Zn(r[t],s)},n)}function ln(e,t,n=G,r=!1){if(n){const s=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;it(),rt(n);const l=he(t,n,e,i);return We(),lt(),l});return r?s.unshift(o):s.push(o),o}}const Re=e=>(t,n=G)=>(!Tt||e==="sp")&&ln(e,(...r)=>t(...r),n),qi=Re("bm"),zi=Re("m"),Wi=Re("bu"),ki=Re("u"),Ji=Re("bum"),ks=Re("um"),Vi=Re("sp"),Xi=Re("rtg"),Yi=Re("rtc");function Qi(e,t=G){ln("ec",e,t)}const Zi=Symbol.for("v-ndc");function Gi(e,t,n,r){let s;const o=n&&n[r];if(N(e)||X(e)){s=new Array(e.length);for(let i=0,l=e.length;it(i,l,void 0,o&&o[l]));else{const i=Object.keys(e);s=new Array(i.length);for(let l=0,f=i.length;le?no(e)?br(e)||e.proxy:Hn(e.parent):null,gt=Q(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Hn(e.parent),$root:e=>Hn(e.root),$emit:e=>e.emit,$options:e=>hr(e),$forceUpdate:e=>e.f||(e.f=()=>dr(e.update)),$nextTick:e=>e.n||(e.n=Ti.bind(e.proxy)),$watch:e=>ji.bind(e)}),Tn=(e,t)=>e!==q&&!e.__isScriptSetup&&L(e,t),el={get({_:e},t){const{ctx:n,setupState:r,data:s,props:o,accessCache:i,type:l,appContext:f}=e;let u;if(t[0]!=="$"){const R=i[t];if(R!==void 0)switch(R){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return o[t]}else{if(Tn(r,t))return i[t]=1,r[t];if(s!==q&&L(s,t))return i[t]=2,s[t];if((u=e.propsOptions[0])&&L(u,t))return i[t]=3,o[t];if(n!==q&&L(n,t))return i[t]=4,n[t];$n&&(i[t]=0)}}const d=gt[t];let m,x;if(d)return t==="$attrs"&&se(e,"get",t),d(e);if((m=l.__cssModules)&&(m=m[t]))return m;if(n!==q&&L(n,t))return i[t]=4,n[t];if(x=f.config.globalProperties,L(x,t))return x[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:o}=e;return Tn(s,t)?(s[t]=n,!0):r!==q&&L(r,t)?(r[t]=n,!0):L(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:o}},i){let l;return!!n[i]||e!==q&&L(e,i)||Tn(t,i)||(l=o[0])&&L(l,i)||L(r,i)||L(gt,i)||L(s.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:L(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function jr(e){return N(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let $n=!0;function tl(e){const t=hr(e),n=e.proxy,r=e.ctx;$n=!1,t.beforeCreate&&Hr(t.beforeCreate,e,"bc");const{data:s,computed:o,methods:i,watch:l,provide:f,inject:u,created:d,beforeMount:m,mounted:x,beforeUpdate:R,updated:O,activated:A,deactivated:D,beforeDestroy:j,beforeUnmount:z,destroyed:J,unmounted:I,render:Se,renderTracked:ft,renderTriggered:Ct,errorCaptured:Me,serverPrefetch:gn,expose:Le,inheritAttrs:ut,components:Pt,directives:Ft,filters:bn}=t;if(u&&nl(u,r,null),i)for(const k in i){const $=i[k];v($)&&(r[k]=$.bind(n))}if(s){const k=s.call(n,n);W(k)&&(e.data=cr(k))}if($n=!0,o)for(const k in o){const $=o[k],Ue=v($)?$.bind(n,n):v($.get)?$.get.bind(n,n):de,Nt=!v($)&&v($.set)?$.set.bind(n):de,Be=vl({get:Ue,set:Nt});Object.defineProperty(r,k,{enumerable:!0,configurable:!0,get:()=>Be.value,set:pe=>Be.value=pe})}if(l)for(const k in l)Js(l[k],r,n,k);if(f){const k=v(f)?f.call(n):f;Reflect.ownKeys(k).forEach($=>{cl($,k[$])})}d&&Hr(d,e,"c");function te(k,$){N($)?$.forEach(Ue=>k(Ue.bind(n))):$&&k($.bind(n))}if(te(qi,m),te(zi,x),te(Wi,R),te(ki,O),te(Hi,A),te($i,D),te(Qi,Me),te(Yi,ft),te(Xi,Ct),te(Ji,z),te(ks,I),te(Vi,gn),N(Le))if(Le.length){const k=e.exposed||(e.exposed={});Le.forEach($=>{Object.defineProperty(k,$,{get:()=>n[$],set:Ue=>n[$]=Ue})})}else e.exposed||(e.exposed={});Se&&e.render===de&&(e.render=Se),ut!=null&&(e.inheritAttrs=ut),Pt&&(e.components=Pt),Ft&&(e.directives=Ft)}function nl(e,t,n=de){N(e)&&(e=Kn(e));for(const r in e){const s=e[r];let o;W(s)?"default"in s?o=$t(s.from||r,s.default,!0):o=$t(s.from||r):o=$t(s),ee(o)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>o.value,set:i=>o.value=i}):t[r]=o}}function Hr(e,t,n){he(N(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function Js(e,t,n,r){const s=r.includes(".")?qs(n,r):()=>n[r];if(X(e)){const o=t[e];v(o)&&On(s,o)}else if(v(e))On(s,e.bind(n));else if(W(e))if(N(e))e.forEach(o=>Js(o,t,n,r));else{const o=v(e.handler)?e.handler.bind(n):t[e.handler];v(o)&&On(s,o,e)}}function hr(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,l=o.get(t);let f;return l?f=l:!s.length&&!n&&!r?f=t:(f={},s.length&&s.forEach(u=>Yt(f,u,i,!0)),Yt(f,t,i)),W(t)&&o.set(t,f),f}function Yt(e,t,n,r=!1){const{mixins:s,extends:o}=t;o&&Yt(e,o,n,!0),s&&s.forEach(i=>Yt(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const l=rl[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const rl={data:$r,props:Kr,emits:Kr,methods:mt,computed:mt,beforeCreate:ne,created:ne,beforeMount:ne,mounted:ne,beforeUpdate:ne,updated:ne,beforeDestroy:ne,beforeUnmount:ne,destroyed:ne,unmounted:ne,activated:ne,deactivated:ne,errorCaptured:ne,serverPrefetch:ne,components:mt,directives:mt,watch:ol,provide:$r,inject:sl};function $r(e,t){return t?e?function(){return Q(v(e)?e.call(this,this):e,v(t)?t.call(this,this):t)}:t:e}function sl(e,t){return mt(Kn(e),Kn(t))}function Kn(e){if(N(e)){const t={};for(let n=0;n1)return n&&v(t)?t.call(r&&r.proxy):t}}function fl(e,t,n,r=!1){const s={},o={};Jt(o,fn,1),e.propsDefaults=Object.create(null),Xs(e,t,s,o);for(const i in e.propsOptions[0])i in s||(s[i]=void 0);n?e.props=r?s:mi(s):e.type.props?e.props=s:e.props=o,e.attrs=o}function ul(e,t,n,r){const{props:s,attrs:o,vnode:{patchFlag:i}}=e,l=B(s),[f]=e.propsOptions;let u=!1;if((r||i>0)&&!(i&16)){if(i&8){const d=e.vnode.dynamicProps;for(let m=0;m{f=!0;const[x,R]=Ys(m,t,!0);Q(i,x),R&&l.push(...R)};!n&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!o&&!f)return W(e)&&r.set(e,Ye),Ye;if(N(o))for(let d=0;d-1,R[1]=A<0||O-1||L(R,"default"))&&l.push(m)}}}const u=[i,l];return W(e)&&r.set(e,u),u}function qr(e){return e[0]!=="$"}function zr(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function Wr(e,t){return zr(e)===zr(t)}function kr(e,t){return N(t)?t.findIndex(n=>Wr(n,e)):v(t)&&Wr(t,e)?0:-1}const Qs=e=>e[0]==="_"||e==="$stable",pr=e=>N(e)?e.map(be):[be(e)],al=(e,t,n)=>{if(t._n)return t;const r=Ii((...s)=>pr(t(...s)),n);return r._c=!1,r},Zs=(e,t,n)=>{const r=e._ctx;for(const s in e){if(Qs(s))continue;const o=e[s];if(v(o))t[s]=al(s,o,r);else if(o!=null){const i=pr(o);t[s]=()=>i}}},Gs=(e,t)=>{const n=pr(t);e.slots.default=()=>n},dl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=B(t),Jt(t,"_",n)):Zs(t,e.slots={})}else e.slots={},t&&Gs(e,t);Jt(e.slots,fn,1)},hl=(e,t,n)=>{const{vnode:r,slots:s}=e;let o=!0,i=q;if(r.shapeFlag&32){const l=t._;l?n&&l===1?o=!1:(Q(s,t),!n&&l===1&&delete s._):(o=!t.$stable,Zs(t,s)),i=t}else t&&(Gs(e,t),i={default:1});if(o)for(const l in s)!Qs(l)&&!(l in i)&&delete s[l]};function zn(e,t,n,r,s=!1){if(N(e)){e.forEach((x,R)=>zn(x,t&&(N(t)?t[R]:t),n,r,s));return}if(Ht(r)&&!s)return;const o=r.shapeFlag&4?br(r.component)||r.component.proxy:r.el,i=s?null:o,{i:l,r:f}=e,u=t&&t.r,d=l.refs===q?l.refs={}:l.refs,m=l.setupState;if(u!=null&&u!==f&&(X(u)?(d[u]=null,L(m,u)&&(m[u]=null)):ee(u)&&(u.value=null)),v(f))Ie(f,l,12,[i,d]);else{const x=X(f),R=ee(f);if(x||R){const O=()=>{if(e.f){const A=x?L(m,f)?m[f]:d[f]:f.value;s?N(A)&&Zn(A,o):N(A)?A.includes(o)||A.push(o):x?(d[f]=[o],L(m,f)&&(m[f]=d[f])):(f.value=[o],e.k&&(d[e.k]=f.value))}else x?(d[f]=i,L(m,f)&&(m[f]=i)):R&&(f.value=i,e.k&&(d[e.k]=i))};i?(O.id=-1,re(O,n)):O()}}}const re=Di;function pl(e){return ml(e)}function ml(e,t){const n=Mn();n.__VUE__=!0;const{insert:r,remove:s,patchProp:o,createElement:i,createText:l,createComment:f,setText:u,setElementText:d,parentNode:m,nextSibling:x,setScopeId:R=de,insertStaticContent:O}=e,A=(c,a,h,b=null,g=null,E=null,T=!1,y=null,w=!!a.dynamicChildren)=>{if(c===a)return;c&&!dt(c,a)&&(b=It(c),pe(c,g,E,!0),c=null),a.patchFlag===-2&&(w=!1,a.dynamicChildren=null);const{type:_,ref:C,shapeFlag:S}=a;switch(_){case cn:D(c,a,h,b);break;case xt:j(c,a,h,b);break;case An:c==null&&z(a,h,b,T);break;case fe:Pt(c,a,h,b,g,E,T,y,w);break;default:S&1?Se(c,a,h,b,g,E,T,y,w):S&6?Ft(c,a,h,b,g,E,T,y,w):(S&64||S&128)&&_.process(c,a,h,b,g,E,T,y,w,ke)}C!=null&&g&&zn(C,c&&c.ref,E,a||c,!a)},D=(c,a,h,b)=>{if(c==null)r(a.el=l(a.children),h,b);else{const g=a.el=c.el;a.children!==c.children&&u(g,a.children)}},j=(c,a,h,b)=>{c==null?r(a.el=f(a.children||""),h,b):a.el=c.el},z=(c,a,h,b)=>{[c.el,c.anchor]=O(c.children,a,h,b,c.el,c.anchor)},J=({el:c,anchor:a},h,b)=>{let g;for(;c&&c!==a;)g=x(c),r(c,h,b),c=g;r(a,h,b)},I=({el:c,anchor:a})=>{let h;for(;c&&c!==a;)h=x(c),s(c),c=h;s(a)},Se=(c,a,h,b,g,E,T,y,w)=>{T=T||a.type==="svg",c==null?ft(a,h,b,g,E,T,y,w):gn(c,a,g,E,T,y,w)},ft=(c,a,h,b,g,E,T,y)=>{let w,_;const{type:C,props:S,shapeFlag:P,transition:F,dirs:M}=c;if(w=c.el=i(c.type,E,S&&S.is,S),P&8?d(w,c.children):P&16&&Me(c.children,w,null,b,g,E&&C!=="foreignObject",T,y),M&&De(c,null,b,"created"),Ct(w,c,c.scopeId,T,b),S){for(const H in S)H!=="value"&&!jt(H)&&o(w,H,null,S[H],E,c.children,b,g,xe);"value"in S&&o(w,"value",null,S.value),(_=S.onVnodeBeforeMount)&&ge(_,b,c)}M&&De(c,null,b,"beforeMount");const K=(!g||g&&!g.pendingBranch)&&F&&!F.persisted;K&&F.beforeEnter(w),r(w,a,h),((_=S&&S.onVnodeMounted)||K||M)&&re(()=>{_&&ge(_,b,c),K&&F.enter(w),M&&De(c,null,b,"mounted")},g)},Ct=(c,a,h,b,g)=>{if(h&&R(c,h),b)for(let E=0;E{for(let _=w;_{const y=a.el=c.el;let{patchFlag:w,dynamicChildren:_,dirs:C}=a;w|=c.patchFlag&16;const S=c.props||q,P=a.props||q;let F;h&&je(h,!1),(F=P.onVnodeBeforeUpdate)&&ge(F,h,a,c),C&&De(a,c,h,"beforeUpdate"),h&&je(h,!0);const M=g&&a.type!=="foreignObject";if(_?Le(c.dynamicChildren,_,y,h,b,M,E):T||$(c,a,y,null,h,b,M,E,!1),w>0){if(w&16)ut(y,a,S,P,h,b,g);else if(w&2&&S.class!==P.class&&o(y,"class",null,P.class,g),w&4&&o(y,"style",S.style,P.style,g),w&8){const K=a.dynamicProps;for(let H=0;H{F&&ge(F,h,a,c),C&&De(a,c,h,"updated")},b)},Le=(c,a,h,b,g,E,T)=>{for(let y=0;y{if(h!==b){if(h!==q)for(const y in h)!jt(y)&&!(y in b)&&o(c,y,h[y],null,T,a.children,g,E,xe);for(const y in b){if(jt(y))continue;const w=b[y],_=h[y];w!==_&&y!=="value"&&o(c,y,_,w,T,a.children,g,E,xe)}"value"in b&&o(c,"value",h.value,b.value)}},Pt=(c,a,h,b,g,E,T,y,w)=>{const _=a.el=c?c.el:l(""),C=a.anchor=c?c.anchor:l("");let{patchFlag:S,dynamicChildren:P,slotScopeIds:F}=a;F&&(y=y?y.concat(F):F),c==null?(r(_,h,b),r(C,h,b),Me(a.children,h,C,g,E,T,y,w)):S>0&&S&64&&P&&c.dynamicChildren?(Le(c.dynamicChildren,P,h,g,E,T,y),(a.key!=null||g&&a===g.subTree)&&eo(c,a,!0)):$(c,a,h,C,g,E,T,y,w)},Ft=(c,a,h,b,g,E,T,y,w)=>{a.slotScopeIds=y,c==null?a.shapeFlag&512?g.ctx.activate(a,h,b,T,w):bn(a,h,b,g,E,T,w):Or(c,a,w)},bn=(c,a,h,b,g,E,T)=>{const y=c.component=Sl(c,b,g);if(zs(c)&&(y.ctx.renderer=ke),Cl(y),y.asyncDep){if(g&&g.registerDep(y,te),!c.el){const w=y.subTree=ze(xt);j(null,w,a,h)}return}te(y,c,a,h,g,E,T)},Or=(c,a,h)=>{const b=a.component=c.component;if(Li(c,a,h))if(b.asyncDep&&!b.asyncResolved){k(b,a,h);return}else b.next=a,Ri(b.update),b.update();else a.el=c.el,b.vnode=a},te=(c,a,h,b,g,E,T)=>{const y=()=>{if(c.isMounted){let{next:C,bu:S,u:P,parent:F,vnode:M}=c,K=C,H;je(c,!1),C?(C.el=M.el,k(c,C,T)):C=M,S&&wn(S),(H=C.props&&C.props.onVnodeBeforeUpdate)&&ge(H,F,C,M),je(c,!0);const V=xn(c),le=c.subTree;c.subTree=V,A(le,V,m(le.el),It(le),c,g,E),C.el=V.el,K===null&&Ui(c,V.el),P&&re(P,g),(H=C.props&&C.props.onVnodeUpdated)&&re(()=>ge(H,F,C,M),g)}else{let C;const{el:S,props:P}=a,{bm:F,m:M,parent:K}=c,H=Ht(a);if(je(c,!1),F&&wn(F),!H&&(C=P&&P.onVnodeBeforeMount)&&ge(C,K,a),je(c,!0),S&&yn){const V=()=>{c.subTree=xn(c),yn(S,c.subTree,c,g,null)};H?a.type.__asyncLoader().then(()=>!c.isUnmounted&&V()):V()}else{const V=c.subTree=xn(c);A(null,V,h,b,c,g,E),a.el=V.el}if(M&&re(M,g),!H&&(C=P&&P.onVnodeMounted)){const V=a;re(()=>ge(C,K,V),g)}(a.shapeFlag&256||K&&Ht(K.vnode)&&K.vnode.shapeFlag&256)&&c.a&&re(c.a,g),c.isMounted=!0,a=h=b=null}},w=c.effect=new sr(y,()=>dr(_),c.scope),_=c.update=()=>w.run();_.id=c.uid,je(c,!0),_()},k=(c,a,h)=>{a.component=c;const b=c.vnode.props;c.vnode=a,c.next=null,ul(c,a.props,b,h),hl(c,a.children,h),it(),Br(),lt()},$=(c,a,h,b,g,E,T,y,w=!1)=>{const _=c&&c.children,C=c?c.shapeFlag:0,S=a.children,{patchFlag:P,shapeFlag:F}=a;if(P>0){if(P&128){Nt(_,S,h,b,g,E,T,y,w);return}else if(P&256){Ue(_,S,h,b,g,E,T,y,w);return}}F&8?(C&16&&xe(_,g,E),S!==_&&d(h,S)):C&16?F&16?Nt(_,S,h,b,g,E,T,y,w):xe(_,g,E,!0):(C&8&&d(h,""),F&16&&Me(S,h,b,g,E,T,y,w))},Ue=(c,a,h,b,g,E,T,y,w)=>{c=c||Ye,a=a||Ye;const _=c.length,C=a.length,S=Math.min(_,C);let P;for(P=0;PC?xe(c,g,E,!0,!1,S):Me(a,h,b,g,E,T,y,w,S)},Nt=(c,a,h,b,g,E,T,y,w)=>{let _=0;const C=a.length;let S=c.length-1,P=C-1;for(;_<=S&&_<=P;){const F=c[_],M=a[_]=w?Fe(a[_]):be(a[_]);if(dt(F,M))A(F,M,h,null,g,E,T,y,w);else break;_++}for(;_<=S&&_<=P;){const F=c[S],M=a[P]=w?Fe(a[P]):be(a[P]);if(dt(F,M))A(F,M,h,null,g,E,T,y,w);else break;S--,P--}if(_>S){if(_<=P){const F=P+1,M=FP)for(;_<=S;)pe(c[_],g,E,!0),_++;else{const F=_,M=_,K=new Map;for(_=M;_<=P;_++){const oe=a[_]=w?Fe(a[_]):be(a[_]);oe.key!=null&&K.set(oe.key,_)}let H,V=0;const le=P-M+1;let Je=!1,Rr=0;const at=new Array(le);for(_=0;_=le){pe(oe,g,E,!0);continue}let me;if(oe.key!=null)me=K.get(oe.key);else for(H=M;H<=P;H++)if(at[H-M]===0&&dt(oe,a[H])){me=H;break}me===void 0?pe(oe,g,E,!0):(at[me-M]=_+1,me>=Rr?Rr=me:Je=!0,A(oe,a[me],h,null,g,E,T,y,w),V++)}const Sr=Je?gl(at):Ye;for(H=Sr.length-1,_=le-1;_>=0;_--){const oe=M+_,me=a[oe],Cr=oe+1{const{el:E,type:T,transition:y,children:w,shapeFlag:_}=c;if(_&6){Be(c.component.subTree,a,h,b);return}if(_&128){c.suspense.move(a,h,b);return}if(_&64){T.move(c,a,h,ke);return}if(T===fe){r(E,a,h);for(let S=0;Sy.enter(E),g);else{const{leave:S,delayLeave:P,afterLeave:F}=y,M=()=>r(E,a,h),K=()=>{S(E,()=>{M(),F&&F()})};P?P(E,M,K):K()}else r(E,a,h)},pe=(c,a,h,b=!1,g=!1)=>{const{type:E,props:T,ref:y,children:w,dynamicChildren:_,shapeFlag:C,patchFlag:S,dirs:P}=c;if(y!=null&&zn(y,null,h,c,!0),C&256){a.ctx.deactivate(c);return}const F=C&1&&P,M=!Ht(c);let K;if(M&&(K=T&&T.onVnodeBeforeUnmount)&&ge(K,a,c),C&6)Ao(c.component,h,b);else{if(C&128){c.suspense.unmount(h,b);return}F&&De(c,null,a,"beforeUnmount"),C&64?c.type.remove(c,a,h,g,ke,b):_&&(E!==fe||S>0&&S&64)?xe(_,a,h,!1,!0):(E===fe&&S&384||!g&&C&16)&&xe(w,a,h),b&&Tr(c)}(M&&(K=T&&T.onVnodeUnmounted)||F)&&re(()=>{K&&ge(K,a,c),F&&De(c,null,a,"unmounted")},h)},Tr=c=>{const{type:a,el:h,anchor:b,transition:g}=c;if(a===fe){To(h,b);return}if(a===An){I(c);return}const E=()=>{s(h),g&&!g.persisted&&g.afterLeave&&g.afterLeave()};if(c.shapeFlag&1&&g&&!g.persisted){const{leave:T,delayLeave:y}=g,w=()=>T(h,E);y?y(c.el,E,w):w()}else E()},To=(c,a)=>{let h;for(;c!==a;)h=x(c),s(c),c=h;s(a)},Ao=(c,a,h)=>{const{bum:b,scope:g,update:E,subTree:T,um:y}=c;b&&wn(b),g.stop(),E&&(E.active=!1,pe(T,c,a,h)),y&&re(y,a),re(()=>{c.isUnmounted=!0},a),a&&a.pendingBranch&&!a.isUnmounted&&c.asyncDep&&!c.asyncResolved&&c.suspenseId===a.pendingId&&(a.deps--,a.deps===0&&a.resolve())},xe=(c,a,h,b=!1,g=!1,E=0)=>{for(let T=E;Tc.shapeFlag&6?It(c.component.subTree):c.shapeFlag&128?c.suspense.next():x(c.anchor||c.el),Ar=(c,a,h)=>{c==null?a._vnode&&pe(a._vnode,null,null,!0):A(a._vnode||null,c,a,null,null,null,h),Br(),js(),a._vnode=c},ke={p:A,um:pe,m:Be,r:Tr,mt:bn,mc:Me,pc:$,pbc:Le,n:It,o:e};let _n,yn;return t&&([_n,yn]=t(ke)),{render:Ar,hydrate:_n,createApp:ll(Ar,_n)}}function je({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function eo(e,t,n=!1){const r=e.children,s=t.children;if(N(r)&&N(s))for(let o=0;o>1,e[n[l]]0&&(t[r]=n[o-1]),n[o]=r)}}for(o=n.length,i=n[o-1];o-- >0;)n[o]=i,i=t[i];return n}const bl=e=>e.__isTeleport,fe=Symbol.for("v-fgt"),cn=Symbol.for("v-txt"),xt=Symbol.for("v-cmt"),An=Symbol.for("v-stc"),bt=[];let ae=null;function Rn(e=!1){bt.push(ae=e?null:[])}function _l(){bt.pop(),ae=bt[bt.length-1]||null}let Ot=1;function Jr(e){Ot+=e}function yl(e){return e.dynamicChildren=Ot>0?ae||Ye:null,_l(),Ot>0&&ae&&ae.push(e),e}function Sn(e,t,n,r,s,o){return yl($e(e,t,n,r,s,o,!0))}function El(e){return e?e.__v_isVNode===!0:!1}function dt(e,t){return e.type===t.type&&e.key===t.key}const fn="__vInternal",to=({key:e})=>e??null,Kt=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?X(e)||ee(e)||v(e)?{i:ye,r:e,k:t,f:!!n}:e:null);function $e(e,t=null,n=null,r=0,s=null,o=e===fe?0:1,i=!1,l=!1){const f={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&to(t),ref:t&&Kt(t),scopeId:on,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:ye};return l?(mr(f,n),o&128&&e.normalize(f)):n&&(f.shapeFlag|=X(n)?8:16),Ot>0&&!i&&ae&&(f.patchFlag>0||o&6)&&f.patchFlag!==32&&ae.push(f),f}const ze=wl;function wl(e,t=null,n=null,r=0,s=null,o=!1){if((!e||e===Zi)&&(e=xt),El(e)){const l=nt(e,t,!0);return n&&mr(l,n),Ot>0&&!o&&ae&&(l.shapeFlag&6?ae[ae.indexOf(e)]=l:ae.push(l)),l.patchFlag|=-2,l}if(Il(e)&&(e=e.__vccOpts),t){t=xl(t);let{class:l,style:f}=t;l&&!X(l)&&(t.class=nr(l)),W(f)&&(Is(f)&&!N(f)&&(f=Q({},f)),t.style=tr(f))}const i=X(e)?1:Bi(e)?128:bl(e)?64:W(e)?4:v(e)?2:0;return $e(e,t,n,r,s,i,o,!0)}function xl(e){return e?Is(e)||fn in e?Q({},e):e:null}function nt(e,t,n=!1){const{props:r,ref:s,patchFlag:o,children:i}=e,l=t?Tl(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&to(l),ref:t&&t.ref?n&&s?N(s)?s.concat(Kt(t)):[s,Kt(t)]:Kt(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==fe?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&nt(e.ssContent),ssFallback:e.ssFallback&&nt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Ol(e=" ",t=0){return ze(cn,null,e,t)}function be(e){return e==null||typeof e=="boolean"?ze(xt):N(e)?ze(fe,null,e.slice()):typeof e=="object"?Fe(e):ze(cn,null,String(e))}function Fe(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:nt(e)}function mr(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(N(t))n=16;else if(typeof t=="object")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),mr(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!(fn in t)?t._ctx=ye:s===3&&ye&&(ye.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else v(t)?(t={default:t,_ctx:ye},n=32):(t=String(t),r&64?(n=16,t=[Ol(t)]):n=8);e.children=t,e.shapeFlag|=n}function Tl(...e){const t={};for(let n=0;nG=e),gr=e=>{Ve.length>1?Ve.forEach(t=>t(e)):Ve[0](e)};const rt=e=>{gr(e),e.scope.on()},We=()=>{G&&G.scope.off(),gr(null)};function no(e){return e.vnode.shapeFlag&4}let Tt=!1;function Cl(e,t=!1){Tt=t;const{props:n,children:r}=e.vnode,s=no(e);fl(e,n,s,t),dl(e,r);const o=s?Pl(e,t):void 0;return Tt=!1,o}function Pl(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=vs(new Proxy(e.ctx,el));const{setup:r}=n;if(r){const s=e.setupContext=r.length>1?Nl(e):null;rt(e),it();const o=Ie(r,e,0,[e.props,s]);if(lt(),We(),ms(o)){if(o.then(We,We),t)return o.then(i=>{Xr(e,i,t)}).catch(i=>{rn(i,e,0)});e.asyncDep=o}else Xr(e,o,t)}else ro(e,t)}function Xr(e,t,n){v(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:W(t)&&(e.setupState=Us(t)),ro(e,n)}let Yr;function ro(e,t,n){const r=e.type;if(!e.render){if(!t&&Yr&&!r.render){const s=r.template||hr(e).template;if(s){const{isCustomElement:o,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:f}=r,u=Q(Q({isCustomElement:o,delimiters:l},i),f);r.render=Yr(s,u)}}e.render=r.render||de}rt(e),it(),tl(e),lt(),We()}function Fl(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return se(e,"get","$attrs"),t[n]}}))}function Nl(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return Fl(e)},slots:e.slots,emit:e.emit,expose:t}}function br(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Us(vs(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in gt)return gt[n](e)},has(t,n){return n in t||n in gt}}))}function Il(e){return v(e)&&"__vccOpts"in e}const vl=(e,t)=>xi(e,t,Tt),Ml=Symbol.for("v-scx"),Ll=()=>$t(Ml),Ul="3.3.4",Bl="http://www.w3.org/2000/svg",Ke=typeof document<"u"?document:null,Qr=Ke&&Ke.createElement("template"),Dl={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t?Ke.createElementNS(Bl,e):Ke.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>Ke.createTextNode(e),createComment:e=>Ke.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ke.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,o){const i=n?n.previousSibling:t.lastChild;if(s&&(s===o||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===o||!(s=s.nextSibling)););else{Qr.innerHTML=r?`${e}`:e;const l=Qr.content;if(r){const f=l.firstChild;for(;f.firstChild;)l.appendChild(f.firstChild);l.removeChild(f)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function jl(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function Hl(e,t,n){const r=e.style,s=X(n);if(n&&!s){if(t&&!X(t))for(const o in t)n[o]==null&&Wn(r,o,"");for(const o in n)Wn(r,o,n[o])}else{const o=r.display;s?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=o)}}const Zr=/\s*!important$/;function Wn(e,t,n){if(N(n))n.forEach(r=>Wn(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=$l(e,t);Zr.test(n)?e.setProperty(ot(r),n.replace(Zr,""),"important"):e[r]=n}}const Gr=["Webkit","Moz","ms"],Cn={};function $l(e,t){const n=Cn[t];if(n)return n;let r=et(t);if(r!=="filter"&&r in e)return Cn[t]=r;r=_s(r);for(let s=0;sPn||(Vl.then(()=>Pn=0),Pn=Date.now());function Yl(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;he(Ql(r,n.value),t,5,[r])};return n.value=e,n.attached=Xl(),n}function Ql(e,t){if(N(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const ns=/^on[a-z]/,Zl=(e,t,n,r,s=!1,o,i,l,f)=>{t==="class"?jl(e,r,s):t==="style"?Hl(e,n,r):Gt(t)?Qn(t)||kl(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Gl(e,t,r,s))?ql(e,t,r,o,i,l,f):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Kl(e,t,r,s))};function Gl(e,t,n,r){return r?!!(t==="innerHTML"||t==="textContent"||t in e&&ns.test(t)&&v(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||ns.test(t)&&X(n)?!1:t in e}const ec=Q({patchProp:Zl},Dl);let rs;function tc(){return rs||(rs=pl(ec))}const nc=(...e)=>{const t=tc().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=rc(r);if(!s)return;const o=t._component;!v(o)&&!o.render&&!o.template&&(o.template=s.innerHTML),s.innerHTML="";const i=n(s,!1,s instanceof SVGElement);return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),i},t};function rc(e){return X(e)?document.querySelector(e):e}const sc="/vite.svg",oc="/assets/vue-5532db34.svg";function so(e,t){return function(){return e.apply(t,arguments)}}const{toString:ic}=Object.prototype,{getPrototypeOf:_r}=Object,un=(e=>t=>{const n=ic.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),we=e=>(e=e.toLowerCase(),t=>un(t)===e),an=e=>t=>typeof t===e,{isArray:ct}=Array,At=an("undefined");function lc(e){return e!==null&&!At(e)&&e.constructor!==null&&!At(e.constructor)&&ie(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const oo=we("ArrayBuffer");function cc(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&oo(e.buffer),t}const fc=an("string"),ie=an("function"),io=an("number"),dn=e=>e!==null&&typeof e=="object",uc=e=>e===!0||e===!1,qt=e=>{if(un(e)!=="object")return!1;const t=_r(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},ac=we("Date"),dc=we("File"),hc=we("Blob"),pc=we("FileList"),mc=e=>dn(e)&&ie(e.pipe),gc=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||ie(e.append)&&((t=un(e))==="formdata"||t==="object"&&ie(e.toString)&&e.toString()==="[object FormData]"))},bc=we("URLSearchParams"),_c=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Rt(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,s;if(typeof e!="object"&&(e=[e]),ct(e))for(r=0,s=e.length;r0;)if(s=n[r],t===s.toLowerCase())return s;return null}const co=(()=>typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global)(),fo=e=>!At(e)&&e!==co;function kn(){const{caseless:e}=fo(this)&&this||{},t={},n=(r,s)=>{const o=e&&lo(t,s)||s;qt(t[o])&&qt(r)?t[o]=kn(t[o],r):qt(r)?t[o]=kn({},r):ct(r)?t[o]=r.slice():t[o]=r};for(let r=0,s=arguments.length;r(Rt(t,(s,o)=>{n&&ie(s)?e[o]=so(s,n):e[o]=s},{allOwnKeys:r}),e),Ec=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),wc=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},xc=(e,t,n,r)=>{let s,o,i;const l={};if(t=t||{},e==null)return t;do{for(s=Object.getOwnPropertyNames(e),o=s.length;o-- >0;)i=s[o],(!r||r(i,e,t))&&!l[i]&&(t[i]=e[i],l[i]=!0);e=n!==!1&&_r(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},Oc=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return r!==-1&&r===n},Tc=e=>{if(!e)return null;if(ct(e))return e;let t=e.length;if(!io(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},Ac=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&_r(Uint8Array)),Rc=(e,t)=>{const r=(e&&e[Symbol.iterator]).call(e);let s;for(;(s=r.next())&&!s.done;){const o=s.value;t.call(e,o[0],o[1])}},Sc=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},Cc=we("HTMLFormElement"),Pc=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,s){return r.toUpperCase()+s}),ss=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),Fc=we("RegExp"),uo=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};Rt(n,(s,o)=>{t(s,o,e)!==!1&&(r[o]=s)}),Object.defineProperties(e,r)},Nc=e=>{uo(e,(t,n)=>{if(ie(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if(ie(r)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},Ic=(e,t)=>{const n={},r=s=>{s.forEach(o=>{n[o]=!0})};return ct(e)?r(e):r(String(e).split(t)),n},vc=()=>{},Mc=(e,t)=>(e=+e,Number.isFinite(e)?e:t),Fn="abcdefghijklmnopqrstuvwxyz",os="0123456789",ao={DIGIT:os,ALPHA:Fn,ALPHA_DIGIT:Fn+Fn.toUpperCase()+os},Lc=(e=16,t=ao.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n};function Uc(e){return!!(e&&ie(e.append)&&e[Symbol.toStringTag]==="FormData"&&e[Symbol.iterator])}const Bc=e=>{const t=new Array(10),n=(r,s)=>{if(dn(r)){if(t.indexOf(r)>=0)return;if(!("toJSON"in r)){t[s]=r;const o=ct(r)?[]:{};return Rt(r,(i,l)=>{const f=n(i,s+1);!At(f)&&(o[l]=f)}),t[s]=void 0,o}}return r};return n(e,0)},Dc=we("AsyncFunction"),jc=e=>e&&(dn(e)||ie(e))&&ie(e.then)&&ie(e.catch),p={isArray:ct,isArrayBuffer:oo,isBuffer:lc,isFormData:gc,isArrayBufferView:cc,isString:fc,isNumber:io,isBoolean:uc,isObject:dn,isPlainObject:qt,isUndefined:At,isDate:ac,isFile:dc,isBlob:hc,isRegExp:Fc,isFunction:ie,isStream:mc,isURLSearchParams:bc,isTypedArray:Ac,isFileList:pc,forEach:Rt,merge:kn,extend:yc,trim:_c,stripBOM:Ec,inherits:wc,toFlatObject:xc,kindOf:un,kindOfTest:we,endsWith:Oc,toArray:Tc,forEachEntry:Rc,matchAll:Sc,isHTMLForm:Cc,hasOwnProperty:ss,hasOwnProp:ss,reduceDescriptors:uo,freezeMethods:Nc,toObjectSet:Ic,toCamelCase:Pc,noop:vc,toFiniteNumber:Mc,findKey:lo,global:co,isContextDefined:fo,ALPHABET:ao,generateString:Lc,isSpecCompliantForm:Uc,toJSONObject:Bc,isAsyncFn:Dc,isThenable:jc};function U(e,t,n,r,s){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),s&&(this.response=s)}p.inherits(U,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:p.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const ho=U.prototype,po={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{po[e]={value:e}});Object.defineProperties(U,po);Object.defineProperty(ho,"isAxiosError",{value:!0});U.from=(e,t,n,r,s,o)=>{const i=Object.create(ho);return p.toFlatObject(e,i,function(f){return f!==Error.prototype},l=>l!=="isAxiosError"),U.call(i,e.message,t,n,r,s),i.cause=e,i.name=e.name,o&&Object.assign(i,o),i};const Hc=null;function Jn(e){return p.isPlainObject(e)||p.isArray(e)}function mo(e){return p.endsWith(e,"[]")?e.slice(0,-2):e}function is(e,t,n){return e?e.concat(t).map(function(s,o){return s=mo(s),!n&&o?"["+s+"]":s}).join(n?".":""):t}function $c(e){return p.isArray(e)&&!e.some(Jn)}const Kc=p.toFlatObject(p,{},null,function(t){return/^is[A-Z]/.test(t)});function hn(e,t,n){if(!p.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=p.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(A,D){return!p.isUndefined(D[A])});const r=n.metaTokens,s=n.visitor||d,o=n.dots,i=n.indexes,f=(n.Blob||typeof Blob<"u"&&Blob)&&p.isSpecCompliantForm(t);if(!p.isFunction(s))throw new TypeError("visitor must be a function");function u(O){if(O===null)return"";if(p.isDate(O))return O.toISOString();if(!f&&p.isBlob(O))throw new U("Blob is not supported. Use a Buffer instead.");return p.isArrayBuffer(O)||p.isTypedArray(O)?f&&typeof Blob=="function"?new Blob([O]):Buffer.from(O):O}function d(O,A,D){let j=O;if(O&&!D&&typeof O=="object"){if(p.endsWith(A,"{}"))A=r?A:A.slice(0,-2),O=JSON.stringify(O);else if(p.isArray(O)&&$c(O)||(p.isFileList(O)||p.endsWith(A,"[]"))&&(j=p.toArray(O)))return A=mo(A),j.forEach(function(J,I){!(p.isUndefined(J)||J===null)&&t.append(i===!0?is([A],I,o):i===null?A:A+"[]",u(J))}),!1}return Jn(O)?!0:(t.append(is(D,A,o),u(O)),!1)}const m=[],x=Object.assign(Kc,{defaultVisitor:d,convertValue:u,isVisitable:Jn});function R(O,A){if(!p.isUndefined(O)){if(m.indexOf(O)!==-1)throw Error("Circular reference detected in "+A.join("."));m.push(O),p.forEach(O,function(j,z){(!(p.isUndefined(j)||j===null)&&s.call(t,j,p.isString(z)?z.trim():z,A,x))===!0&&R(j,A?A.concat(z):[z])}),m.pop()}}if(!p.isObject(e))throw new TypeError("data must be an object");return R(e),t}function ls(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function yr(e,t){this._pairs=[],e&&hn(e,this,t)}const go=yr.prototype;go.append=function(t,n){this._pairs.push([t,n])};go.toString=function(t){const n=t?function(r){return t.call(this,r,ls)}:ls;return this._pairs.map(function(s){return n(s[0])+"="+n(s[1])},"").join("&")};function qc(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function bo(e,t,n){if(!t)return e;const r=n&&n.encode||qc,s=n&&n.serialize;let o;if(s?o=s(t,n):o=p.isURLSearchParams(t)?t.toString():new yr(t,n).toString(r),o){const i=e.indexOf("#");i!==-1&&(e=e.slice(0,i)),e+=(e.indexOf("?")===-1?"?":"&")+o}return e}class zc{constructor(){this.handlers=[]}use(t,n,r){return this.handlers.push({fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){p.forEach(this.handlers,function(r){r!==null&&t(r)})}}const cs=zc,_o={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},Wc=typeof URLSearchParams<"u"?URLSearchParams:yr,kc=typeof FormData<"u"?FormData:null,Jc=typeof Blob<"u"?Blob:null,Vc=(()=>{let e;return typeof navigator<"u"&&((e=navigator.product)==="ReactNative"||e==="NativeScript"||e==="NS")?!1:typeof window<"u"&&typeof document<"u"})(),Xc=(()=>typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function")(),Ee={isBrowser:!0,classes:{URLSearchParams:Wc,FormData:kc,Blob:Jc},isStandardBrowserEnv:Vc,isStandardBrowserWebWorkerEnv:Xc,protocols:["http","https","file","blob","url","data"]};function Yc(e,t){return hn(e,new Ee.classes.URLSearchParams,Object.assign({visitor:function(n,r,s,o){return Ee.isNode&&p.isBuffer(n)?(this.append(r,n.toString("base64")),!1):o.defaultVisitor.apply(this,arguments)}},t))}function Qc(e){return p.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function Zc(e){const t={},n=Object.keys(e);let r;const s=n.length;let o;for(r=0;r=n.length;return i=!i&&p.isArray(s)?s.length:i,f?(p.hasOwnProp(s,i)?s[i]=[s[i],r]:s[i]=r,!l):((!s[i]||!p.isObject(s[i]))&&(s[i]=[]),t(n,r,s[i],o)&&p.isArray(s[i])&&(s[i]=Zc(s[i])),!l)}if(p.isFormData(e)&&p.isFunction(e.entries)){const n={};return p.forEachEntry(e,(r,s)=>{t(Qc(r),s,n,0)}),n}return null}const Gc={"Content-Type":void 0};function ef(e,t,n){if(p.isString(e))try{return(t||JSON.parse)(e),p.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(n||JSON.stringify)(e)}const pn={transitional:_o,adapter:["xhr","http"],transformRequest:[function(t,n){const r=n.getContentType()||"",s=r.indexOf("application/json")>-1,o=p.isObject(t);if(o&&p.isHTMLForm(t)&&(t=new FormData(t)),p.isFormData(t))return s&&s?JSON.stringify(yo(t)):t;if(p.isArrayBuffer(t)||p.isBuffer(t)||p.isStream(t)||p.isFile(t)||p.isBlob(t))return t;if(p.isArrayBufferView(t))return t.buffer;if(p.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let l;if(o){if(r.indexOf("application/x-www-form-urlencoded")>-1)return Yc(t,this.formSerializer).toString();if((l=p.isFileList(t))||r.indexOf("multipart/form-data")>-1){const f=this.env&&this.env.FormData;return hn(l?{"files[]":t}:t,f&&new f,this.formSerializer)}}return o||s?(n.setContentType("application/json",!1),ef(t)):t}],transformResponse:[function(t){const n=this.transitional||pn.transitional,r=n&&n.forcedJSONParsing,s=this.responseType==="json";if(t&&p.isString(t)&&(r&&!this.responseType||s)){const i=!(n&&n.silentJSONParsing)&&s;try{return JSON.parse(t)}catch(l){if(i)throw l.name==="SyntaxError"?U.from(l,U.ERR_BAD_RESPONSE,this,null,this.response):l}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Ee.classes.FormData,Blob:Ee.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};p.forEach(["delete","get","head"],function(t){pn.headers[t]={}});p.forEach(["post","put","patch"],function(t){pn.headers[t]=p.merge(Gc)});const Er=pn,tf=p.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),nf=e=>{const t={};let n,r,s;return e&&e.split(` +`).forEach(function(i){s=i.indexOf(":"),n=i.substring(0,s).trim().toLowerCase(),r=i.substring(s+1).trim(),!(!n||t[n]&&tf[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},fs=Symbol("internals");function ht(e){return e&&String(e).trim().toLowerCase()}function zt(e){return e===!1||e==null?e:p.isArray(e)?e.map(zt):String(e)}function rf(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}const sf=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function Nn(e,t,n,r,s){if(p.isFunction(r))return r.call(this,t,n);if(s&&(t=n),!!p.isString(t)){if(p.isString(r))return t.indexOf(r)!==-1;if(p.isRegExp(r))return r.test(t)}}function of(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function lf(e,t){const n=p.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+n,{value:function(s,o,i){return this[r].call(this,t,s,o,i)},configurable:!0})})}class mn{constructor(t){t&&this.set(t)}set(t,n,r){const s=this;function o(l,f,u){const d=ht(f);if(!d)throw new Error("header name must be a non-empty string");const m=p.findKey(s,d);(!m||s[m]===void 0||u===!0||u===void 0&&s[m]!==!1)&&(s[m||f]=zt(l))}const i=(l,f)=>p.forEach(l,(u,d)=>o(u,d,f));return p.isPlainObject(t)||t instanceof this.constructor?i(t,n):p.isString(t)&&(t=t.trim())&&!sf(t)?i(nf(t),n):t!=null&&o(n,t,r),this}get(t,n){if(t=ht(t),t){const r=p.findKey(this,t);if(r){const s=this[r];if(!n)return s;if(n===!0)return rf(s);if(p.isFunction(n))return n.call(this,s,r);if(p.isRegExp(n))return n.exec(s);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=ht(t),t){const r=p.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||Nn(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let s=!1;function o(i){if(i=ht(i),i){const l=p.findKey(r,i);l&&(!n||Nn(r,r[l],l,n))&&(delete r[l],s=!0)}}return p.isArray(t)?t.forEach(o):o(t),s}clear(t){const n=Object.keys(this);let r=n.length,s=!1;for(;r--;){const o=n[r];(!t||Nn(this,this[o],o,t,!0))&&(delete this[o],s=!0)}return s}normalize(t){const n=this,r={};return p.forEach(this,(s,o)=>{const i=p.findKey(r,o);if(i){n[i]=zt(s),delete n[o];return}const l=t?of(o):String(o).trim();l!==o&&delete n[o],n[l]=zt(s),r[l]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return p.forEach(this,(r,s)=>{r!=null&&r!==!1&&(n[s]=t&&p.isArray(r)?r.join(", "):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` +`)}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const r=new this(t);return n.forEach(s=>r.set(s)),r}static accessor(t){const r=(this[fs]=this[fs]={accessors:{}}).accessors,s=this.prototype;function o(i){const l=ht(i);r[l]||(lf(s,i),r[l]=!0)}return p.isArray(t)?t.forEach(o):o(t),this}}mn.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);p.freezeMethods(mn.prototype);p.freezeMethods(mn);const Te=mn;function In(e,t){const n=this||Er,r=t||n,s=Te.from(r.headers);let o=r.data;return p.forEach(e,function(l){o=l.call(n,o,s.normalize(),t?t.status:void 0)}),s.normalize(),o}function Eo(e){return!!(e&&e.__CANCEL__)}function St(e,t,n){U.call(this,e??"canceled",U.ERR_CANCELED,t,n),this.name="CanceledError"}p.inherits(St,U,{__CANCEL__:!0});function cf(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new U("Request failed with status code "+n.status,[U.ERR_BAD_REQUEST,U.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}const ff=Ee.isStandardBrowserEnv?function(){return{write:function(n,r,s,o,i,l){const f=[];f.push(n+"="+encodeURIComponent(r)),p.isNumber(s)&&f.push("expires="+new Date(s).toGMTString()),p.isString(o)&&f.push("path="+o),p.isString(i)&&f.push("domain="+i),l===!0&&f.push("secure"),document.cookie=f.join("; ")},read:function(n){const r=document.cookie.match(new RegExp("(^|;\\s*)("+n+")=([^;]*)"));return r?decodeURIComponent(r[3]):null},remove:function(n){this.write(n,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}();function uf(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function af(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}function wo(e,t){return e&&!uf(t)?af(e,t):t}const df=Ee.isStandardBrowserEnv?function(){const t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");let r;function s(o){let i=o;return t&&(n.setAttribute("href",i),i=n.href),n.setAttribute("href",i),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:n.pathname.charAt(0)==="/"?n.pathname:"/"+n.pathname}}return r=s(window.location.href),function(i){const l=p.isString(i)?s(i):i;return l.protocol===r.protocol&&l.host===r.host}}():function(){return function(){return!0}}();function hf(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function pf(e,t){e=e||10;const n=new Array(e),r=new Array(e);let s=0,o=0,i;return t=t!==void 0?t:1e3,function(f){const u=Date.now(),d=r[o];i||(i=u),n[s]=f,r[s]=u;let m=o,x=0;for(;m!==s;)x+=n[m++],m=m%e;if(s=(s+1)%e,s===o&&(o=(o+1)%e),u-i{const o=s.loaded,i=s.lengthComputable?s.total:void 0,l=o-n,f=r(l),u=o<=i;n=o;const d={loaded:o,total:i,progress:i?o/i:void 0,bytes:l,rate:f||void 0,estimated:f&&i&&u?(i-o)/f:void 0,event:s};d[t?"download":"upload"]=!0,e(d)}}const mf=typeof XMLHttpRequest<"u",gf=mf&&function(e){return new Promise(function(n,r){let s=e.data;const o=Te.from(e.headers).normalize(),i=e.responseType;let l;function f(){e.cancelToken&&e.cancelToken.unsubscribe(l),e.signal&&e.signal.removeEventListener("abort",l)}p.isFormData(s)&&(Ee.isStandardBrowserEnv||Ee.isStandardBrowserWebWorkerEnv?o.setContentType(!1):o.setContentType("multipart/form-data;",!1));let u=new XMLHttpRequest;if(e.auth){const R=e.auth.username||"",O=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";o.set("Authorization","Basic "+btoa(R+":"+O))}const d=wo(e.baseURL,e.url);u.open(e.method.toUpperCase(),bo(d,e.params,e.paramsSerializer),!0),u.timeout=e.timeout;function m(){if(!u)return;const R=Te.from("getAllResponseHeaders"in u&&u.getAllResponseHeaders()),A={data:!i||i==="text"||i==="json"?u.responseText:u.response,status:u.status,statusText:u.statusText,headers:R,config:e,request:u};cf(function(j){n(j),f()},function(j){r(j),f()},A),u=null}if("onloadend"in u?u.onloadend=m:u.onreadystatechange=function(){!u||u.readyState!==4||u.status===0&&!(u.responseURL&&u.responseURL.indexOf("file:")===0)||setTimeout(m)},u.onabort=function(){u&&(r(new U("Request aborted",U.ECONNABORTED,e,u)),u=null)},u.onerror=function(){r(new U("Network Error",U.ERR_NETWORK,e,u)),u=null},u.ontimeout=function(){let O=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded";const A=e.transitional||_o;e.timeoutErrorMessage&&(O=e.timeoutErrorMessage),r(new U(O,A.clarifyTimeoutError?U.ETIMEDOUT:U.ECONNABORTED,e,u)),u=null},Ee.isStandardBrowserEnv){const R=(e.withCredentials||df(d))&&e.xsrfCookieName&&ff.read(e.xsrfCookieName);R&&o.set(e.xsrfHeaderName,R)}s===void 0&&o.setContentType(null),"setRequestHeader"in u&&p.forEach(o.toJSON(),function(O,A){u.setRequestHeader(A,O)}),p.isUndefined(e.withCredentials)||(u.withCredentials=!!e.withCredentials),i&&i!=="json"&&(u.responseType=e.responseType),typeof e.onDownloadProgress=="function"&&u.addEventListener("progress",us(e.onDownloadProgress,!0)),typeof e.onUploadProgress=="function"&&u.upload&&u.upload.addEventListener("progress",us(e.onUploadProgress)),(e.cancelToken||e.signal)&&(l=R=>{u&&(r(!R||R.type?new St(null,e,u):R),u.abort(),u=null)},e.cancelToken&&e.cancelToken.subscribe(l),e.signal&&(e.signal.aborted?l():e.signal.addEventListener("abort",l)));const x=hf(d);if(x&&Ee.protocols.indexOf(x)===-1){r(new U("Unsupported protocol "+x+":",U.ERR_BAD_REQUEST,e));return}u.send(s||null)})},Wt={http:Hc,xhr:gf};p.forEach(Wt,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const bf={getAdapter:e=>{e=p.isArray(e)?e:[e];const{length:t}=e;let n,r;for(let s=0;se instanceof Te?e.toJSON():e;function st(e,t){t=t||{};const n={};function r(u,d,m){return p.isPlainObject(u)&&p.isPlainObject(d)?p.merge.call({caseless:m},u,d):p.isPlainObject(d)?p.merge({},d):p.isArray(d)?d.slice():d}function s(u,d,m){if(p.isUndefined(d)){if(!p.isUndefined(u))return r(void 0,u,m)}else return r(u,d,m)}function o(u,d){if(!p.isUndefined(d))return r(void 0,d)}function i(u,d){if(p.isUndefined(d)){if(!p.isUndefined(u))return r(void 0,u)}else return r(void 0,d)}function l(u,d,m){if(m in t)return r(u,d);if(m in e)return r(void 0,u)}const f={url:o,method:o,data:o,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:l,headers:(u,d)=>s(ds(u),ds(d),!0)};return p.forEach(Object.keys(Object.assign({},e,t)),function(d){const m=f[d]||s,x=m(e[d],t[d],d);p.isUndefined(x)&&m!==l||(n[d]=x)}),n}const xo="1.4.0",wr={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{wr[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const hs={};wr.transitional=function(t,n,r){function s(o,i){return"[Axios v"+xo+"] Transitional option '"+o+"'"+i+(r?". "+r:"")}return(o,i,l)=>{if(t===!1)throw new U(s(i," has been removed"+(n?" in "+n:"")),U.ERR_DEPRECATED);return n&&!hs[i]&&(hs[i]=!0,console.warn(s(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(o,i,l):!0}};function _f(e,t,n){if(typeof e!="object")throw new U("options must be an object",U.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let s=r.length;for(;s-- >0;){const o=r[s],i=t[o];if(i){const l=e[o],f=l===void 0||i(l,o,e);if(f!==!0)throw new U("option "+o+" must be "+f,U.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new U("Unknown option "+o,U.ERR_BAD_OPTION)}}const Vn={assertOptions:_f,validators:wr},Pe=Vn.validators;class Zt{constructor(t){this.defaults=t,this.interceptors={request:new cs,response:new cs}}request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=st(this.defaults,n);const{transitional:r,paramsSerializer:s,headers:o}=n;r!==void 0&&Vn.assertOptions(r,{silentJSONParsing:Pe.transitional(Pe.boolean),forcedJSONParsing:Pe.transitional(Pe.boolean),clarifyTimeoutError:Pe.transitional(Pe.boolean)},!1),s!=null&&(p.isFunction(s)?n.paramsSerializer={serialize:s}:Vn.assertOptions(s,{encode:Pe.function,serialize:Pe.function},!0)),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i;i=o&&p.merge(o.common,o[n.method]),i&&p.forEach(["delete","get","head","post","put","patch","common"],O=>{delete o[O]}),n.headers=Te.concat(i,o);const l=[];let f=!0;this.interceptors.request.forEach(function(A){typeof A.runWhen=="function"&&A.runWhen(n)===!1||(f=f&&A.synchronous,l.unshift(A.fulfilled,A.rejected))});const u=[];this.interceptors.response.forEach(function(A){u.push(A.fulfilled,A.rejected)});let d,m=0,x;if(!f){const O=[as.bind(this),void 0];for(O.unshift.apply(O,l),O.push.apply(O,u),x=O.length,d=Promise.resolve(n);m{if(!r._listeners)return;let o=r._listeners.length;for(;o-- >0;)r._listeners[o](s);r._listeners=null}),this.promise.then=s=>{let o;const i=new Promise(l=>{r.subscribe(l),o=l}).then(s);return i.cancel=function(){r.unsubscribe(o)},i},t(function(o,i,l){r.reason||(r.reason=new St(o,i,l),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}static source(){let t;return{token:new xr(function(s){t=s}),cancel:t}}}const yf=xr;function Ef(e){return function(n){return e.apply(null,n)}}function wf(e){return p.isObject(e)&&e.isAxiosError===!0}const Xn={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Xn).forEach(([e,t])=>{Xn[t]=e});const xf=Xn;function Oo(e){const t=new kt(e),n=so(kt.prototype.request,t);return p.extend(n,kt.prototype,t,{allOwnKeys:!0}),p.extend(n,t,null,{allOwnKeys:!0}),n.create=function(s){return Oo(st(e,s))},n}const Y=Oo(Er);Y.Axios=kt;Y.CanceledError=St;Y.CancelToken=yf;Y.isCancel=Eo;Y.VERSION=xo;Y.toFormData=hn;Y.AxiosError=U;Y.Cancel=Y.CanceledError;Y.all=function(t){return Promise.all(t)};Y.spread=Ef;Y.isAxiosError=wf;Y.mergeConfig=st;Y.AxiosHeaders=Te;Y.formToJSON=e=>yo(p.isHTMLForm(e)?new FormData(e):e);Y.HttpStatusCode=xf;Y.default=Y;const Of=Y,Tf=Of.create({baseURL:"/api",timeout:15e3,headers:{"Content-Type":"application/json"}});class Af{getRecords(){return Tf.get("/test/index").then()}}const Rf=new Af;const Sf=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n},Cf=e=>(Fi("data-v-46b2d863"),e=e(),Ni(),e),Pf=Cf(()=>$e("div",null,[$e("a",{href:"https://vitejs.dev",target:"_blank"},[$e("img",{src:sc,class:"logo",alt:"Vite logo"})]),$e("a",{href:"https://vuejs.org/",target:"_blank"},[$e("img",{src:oc,class:"logo vue",alt:"Vue logo"})])],-1)),Ff={__name:"App",setup(e){const t=gi([]);return Rf.getRecords().then(n=>{t.value=n.data}),(n,r)=>(Rn(),Sn(fe,null,[Pf,(Rn(!0),Sn(fe,null,Gi(t.value,s=>(Rn(),Sn("div",null,jo(s),1))),256))],64))}},Nf=Sf(Ff,[["__scopeId","data-v-46b2d863"]]),If=nc(Nf);If.mount("#app"); diff --git a/web/assets/index-e54ab67f.js b/web/assets/index-e54ab67f.js new file mode 100644 index 0000000..1252e34 --- /dev/null +++ b/web/assets/index-e54ab67f.js @@ -0,0 +1,3 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const o of s)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(s){const o={};return s.integrity&&(o.integrity=s.integrity),s.referrerPolicy&&(o.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?o.credentials="include":s.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(s){if(s.ep)return;s.ep=!0;const o=n(s);fetch(s.href,o)}})();function Yn(e,t){const n=Object.create(null),r=e.split(",");for(let s=0;s!!n[s.toLowerCase()]:s=>!!n[s]}const q={},Ye=[],de=()=>{},So=()=>!1,Co=/^on[^a-z]/,Gt=e=>Co.test(e),Qn=e=>e.startsWith("onUpdate:"),Q=Object.assign,Zn=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Po=Object.prototype.hasOwnProperty,L=(e,t)=>Po.call(e,t),N=Array.isArray,Qe=e=>en(e)==="[object Map]",ms=e=>en(e)==="[object Set]",v=e=>typeof e=="function",X=e=>typeof e=="string",Gn=e=>typeof e=="symbol",W=e=>e!==null&&typeof e=="object",gs=e=>W(e)&&v(e.then)&&v(e.catch),bs=Object.prototype.toString,en=e=>bs.call(e),Fo=e=>en(e).slice(8,-1),_s=e=>en(e)==="[object Object]",er=e=>X(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,jt=Yn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),tn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},No=/-(\w)/g,et=tn(e=>e.replace(No,(t,n)=>n?n.toUpperCase():"")),Io=/\B([A-Z])/g,ot=tn(e=>e.replace(Io,"-$1").toLowerCase()),ys=tn(e=>e.charAt(0).toUpperCase()+e.slice(1)),En=tn(e=>e?`on${ys(e)}`:""),_t=(e,t)=>!Object.is(e,t),wn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},vo=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Fr;const Mn=()=>Fr||(Fr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function tr(e){if(N(e)){const t={};for(let n=0;n{if(n){const r=n.split(Lo);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function nr(e){let t="";if(X(e))t=e;else if(N(e))for(let n=0;nX(e)?e:e==null?"":N(e)||W(e)&&(e.toString===bs||!v(e.toString))?JSON.stringify(e,ws,2):String(e),ws=(e,t)=>t&&t.__v_isRef?ws(e,t.value):Qe(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s])=>(n[`${r} =>`]=s,n),{})}:ms(t)?{[`Set(${t.size})`]:[...t.values()]}:W(t)&&!N(t)&&!_s(t)?String(t):t;let ce;class $o{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=ce,!t&&ce&&(this.index=(ce.scopes||(ce.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=ce;try{return ce=this,t()}finally{ce=n}}}on(){ce=this}off(){ce=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},xs=e=>(e.w&Me)>0,Os=e=>(e.n&Me)>0,zo=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r{(d==="length"||d>=u)&&l.push(f)})}else switch(n!==void 0&&l.push(i.get(n)),t){case"add":N(e)?er(n)&&l.push(i.get("length")):(l.push(i.get(qe)),Qe(e)&&l.push(i.get(Bn)));break;case"delete":N(e)||(l.push(i.get(qe)),Qe(e)&&l.push(i.get(Bn)));break;case"set":Qe(e)&&l.push(i.get(qe));break}if(l.length===1)l[0]&&Dn(l[0]);else{const u=[];for(const f of l)f&&u.push(...f);Dn(rr(u))}}function Dn(e,t){const n=N(e)?e:[...e];for(const r of n)r.computed&&Ir(r);for(const r of n)r.computed||Ir(r)}function Ir(e,t){(e!==fe||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const ko=Yn("__proto__,__v_isRef,__isVue"),Rs=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Gn)),Jo=or(),Vo=or(!1,!0),Xo=or(!0),vr=Yo();function Yo(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=B(this);for(let o=0,i=this.length;o{e[t]=function(...n){it();const r=B(this)[t].apply(this,n);return lt(),r}}),e}function Qo(e){const t=B(this);return se(t,"has",e),t.hasOwnProperty(e)}function or(e=!1,t=!1){return function(r,s,o){if(s==="__v_isReactive")return!e;if(s==="__v_isReadonly")return e;if(s==="__v_isShallow")return t;if(s==="__v_raw"&&o===(e?t?hi:Ns:t?Fs:Ps).get(r))return r;const i=N(r);if(!e){if(i&&L(vr,s))return Reflect.get(vr,s,o);if(s==="hasOwnProperty")return Qo}const l=Reflect.get(r,s,o);return(Gn(s)?Rs.has(s):ko(s))||(e||se(r,"get",s),t)?l:ee(l)?i&&er(s)?l:l.value:W(l)?e?Is(l):cr(l):l}}const Zo=Ss(),Go=Ss(!0);function Ss(e=!1){return function(n,r,s,o){let i=n[r];if(tt(i)&&ee(i)&&!ee(s))return!1;if(!e&&(!Vt(s)&&!tt(s)&&(i=B(i),s=B(s)),!N(n)&&ee(i)&&!ee(s)))return i.value=s,!0;const l=N(n)&&er(r)?Number(r)e,nn=e=>Reflect.getPrototypeOf(e);function vt(e,t,n=!1,r=!1){e=e.__v_raw;const s=B(e),o=B(t);n||(t!==o&&se(s,"get",t),se(s,"get",o));const{has:i}=nn(s),l=r?ir:n?fr:yt;if(i.call(s,t))return l(e.get(t));if(i.call(s,o))return l(e.get(o));e!==s&&e.get(t)}function Mt(e,t=!1){const n=this.__v_raw,r=B(n),s=B(e);return t||(e!==s&&se(r,"has",e),se(r,"has",s)),e===s?n.has(e):n.has(e)||n.has(s)}function Lt(e,t=!1){return e=e.__v_raw,!t&&se(B(e),"iterate",qe),Reflect.get(e,"size",e)}function Mr(e){e=B(e);const t=B(this);return nn(t).has.call(t,e)||(t.add(e),Re(t,"add",e,e)),this}function Lr(e,t){t=B(t);const n=B(this),{has:r,get:s}=nn(n);let o=r.call(n,e);o||(e=B(e),o=r.call(n,e));const i=s.call(n,e);return n.set(e,t),o?_t(t,i)&&Re(n,"set",e,t):Re(n,"add",e,t),this}function Ur(e){const t=B(this),{has:n,get:r}=nn(t);let s=n.call(t,e);s||(e=B(e),s=n.call(t,e)),r&&r.call(t,e);const o=t.delete(e);return s&&Re(t,"delete",e,void 0),o}function Br(){const e=B(this),t=e.size!==0,n=e.clear();return t&&Re(e,"clear",void 0,void 0),n}function Ut(e,t){return function(r,s){const o=this,i=o.__v_raw,l=B(i),u=t?ir:e?fr:yt;return!e&&se(l,"iterate",qe),i.forEach((f,d)=>r.call(s,u(f),u(d),o))}}function Bt(e,t,n){return function(...r){const s=this.__v_raw,o=B(s),i=Qe(o),l=e==="entries"||e===Symbol.iterator&&i,u=e==="keys"&&i,f=s[e](...r),d=n?ir:t?fr:yt;return!t&&se(o,"iterate",u?Bn:qe),{next(){const{value:m,done:x}=f.next();return x?{value:m,done:x}:{value:l?[d(m[0]),d(m[1])]:d(m),done:x}},[Symbol.iterator](){return this}}}}function Pe(e){return function(...t){return e==="delete"?!1:this}}function oi(){const e={get(o){return vt(this,o)},get size(){return Lt(this)},has:Mt,add:Mr,set:Lr,delete:Ur,clear:Br,forEach:Ut(!1,!1)},t={get(o){return vt(this,o,!1,!0)},get size(){return Lt(this)},has:Mt,add:Mr,set:Lr,delete:Ur,clear:Br,forEach:Ut(!1,!0)},n={get(o){return vt(this,o,!0)},get size(){return Lt(this,!0)},has(o){return Mt.call(this,o,!0)},add:Pe("add"),set:Pe("set"),delete:Pe("delete"),clear:Pe("clear"),forEach:Ut(!0,!1)},r={get(o){return vt(this,o,!0,!0)},get size(){return Lt(this,!0)},has(o){return Mt.call(this,o,!0)},add:Pe("add"),set:Pe("set"),delete:Pe("delete"),clear:Pe("clear"),forEach:Ut(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(o=>{e[o]=Bt(o,!1,!1),n[o]=Bt(o,!0,!1),t[o]=Bt(o,!1,!0),r[o]=Bt(o,!0,!0)}),[e,n,t,r]}const[ii,li,ci,ui]=oi();function lr(e,t){const n=t?e?ui:ci:e?li:ii;return(r,s,o)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(L(n,s)&&s in r?n:r,s,o)}const fi={get:lr(!1,!1)},ai={get:lr(!1,!0)},di={get:lr(!0,!1)},Ps=new WeakMap,Fs=new WeakMap,Ns=new WeakMap,hi=new WeakMap;function pi(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function mi(e){return e.__v_skip||!Object.isExtensible(e)?0:pi(Fo(e))}function cr(e){return tt(e)?e:ur(e,!1,Cs,fi,Ps)}function gi(e){return ur(e,!1,si,ai,Fs)}function Is(e){return ur(e,!0,ri,di,Ns)}function ur(e,t,n,r,s){if(!W(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=s.get(e);if(o)return o;const i=mi(e);if(i===0)return e;const l=new Proxy(e,i===2?r:n);return s.set(e,l),l}function Ze(e){return tt(e)?Ze(e.__v_raw):!!(e&&e.__v_isReactive)}function tt(e){return!!(e&&e.__v_isReadonly)}function Vt(e){return!!(e&&e.__v_isShallow)}function vs(e){return Ze(e)||tt(e)}function B(e){const t=e&&e.__v_raw;return t?B(t):e}function Ms(e){return Jt(e,"__v_skip",!0),e}const yt=e=>W(e)?cr(e):e,fr=e=>W(e)?Is(e):e;function Ls(e){Ie&&fe&&(e=B(e),As(e.dep||(e.dep=rr())))}function Us(e,t){e=B(e);const n=e.dep;n&&Dn(n)}function ee(e){return!!(e&&e.__v_isRef===!0)}function bi(e){return _i(e,!1)}function _i(e,t){return ee(e)?e:new yi(e,t)}class yi{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:B(t),this._value=n?t:yt(t)}get value(){return Ls(this),this._value}set value(t){const n=this.__v_isShallow||Vt(t)||tt(t);t=n?t:B(t),_t(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:yt(t),Us(this))}}function Ei(e){return ee(e)?e.value:e}const wi={get:(e,t,n)=>Ei(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return ee(s)&&!ee(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function Bs(e){return Ze(e)?e:new Proxy(e,wi)}class xi{constructor(t,n,r,s){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new sr(t,()=>{this._dirty||(this._dirty=!0,Us(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!s,this.__v_isReadonly=r}get value(){const t=B(this);return Ls(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function Oi(e,t,n=!1){let r,s;const o=v(e);return o?(r=e,s=de):(r=e.get,s=e.set),new xi(r,s,o||!s,n)}function ve(e,t,n,r){let s;try{s=r?e(...r):e()}catch(o){rn(o,t,n)}return s}function he(e,t,n,r){if(v(e)){const o=ve(e,t,n,r);return o&&gs(o)&&o.catch(i=>{rn(i,t,n)}),o}const s=[];for(let o=0;o>>1;wt(Z[r])_e&&Z.splice(t,1)}function Ci(e){N(e)?Ge.push(...e):(!Oe||!Oe.includes(e,e.allowRecurse?$e+1:$e))&&Ge.push(e),js()}function Dr(e,t=Et?_e+1:0){for(;twt(n)-wt(r)),$e=0;$ee.id==null?1/0:e.id,Pi=(e,t)=>{const n=wt(e)-wt(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function $s(e){jn=!1,Et=!0,Z.sort(Pi);const t=de;try{for(_e=0;_eX(R)?R.trim():R)),m&&(s=n.map(vo))}let l,u=r[l=En(t)]||r[l=En(et(t))];!u&&o&&(u=r[l=En(ot(t))]),u&&he(u,e,6,s);const f=r[l+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,he(f,e,6,s)}}function Ks(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(s!==void 0)return s;const o=e.emits;let i={},l=!1;if(!v(e)){const u=f=>{const d=Ks(f,t,!0);d&&(l=!0,Q(i,d))};!n&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}return!o&&!l?(W(e)&&r.set(e,null),null):(N(o)?o.forEach(u=>i[u]=null):Q(i,o),W(e)&&r.set(e,i),i)}function sn(e,t){return!e||!Gt(t)?!1:(t=t.slice(2).replace(/Once$/,""),L(e,t[0].toLowerCase()+t.slice(1))||L(e,ot(t))||L(e,t))}let ye=null,on=null;function Xt(e){const t=ye;return ye=e,on=e&&e.type.__scopeId||null,t}function Ni(e){on=e}function Ii(){on=null}function vi(e,t=ye,n){if(!t||e._n)return e;const r=(...s)=>{r._d&&Vr(-1);const o=Xt(t);let i;try{i=e(...s)}finally{Xt(o),r._d&&Vr(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function xn(e){const{type:t,vnode:n,proxy:r,withProxy:s,props:o,propsOptions:[i],slots:l,attrs:u,emit:f,render:d,renderCache:m,data:x,setupState:R,ctx:O,inheritAttrs:A}=e;let D,j;const z=Xt(e);try{if(n.shapeFlag&4){const I=s||r;D=be(d.call(I,I,m,o,R,x,O)),j=u}else{const I=t;D=be(I.length>1?I(o,{attrs:u,slots:l,emit:f}):I(o,null)),j=t.props?u:Mi(u)}}catch(I){bt.length=0,rn(I,e,1),D=ze(xt)}let J=D;if(j&&A!==!1){const I=Object.keys(j),{shapeFlag:Ce}=J;I.length&&Ce&7&&(i&&I.some(Qn)&&(j=Li(j,i)),J=nt(J,j))}return n.dirs&&(J=nt(J),J.dirs=J.dirs?J.dirs.concat(n.dirs):n.dirs),n.transition&&(J.transition=n.transition),D=J,Xt(z),D}const Mi=e=>{let t;for(const n in e)(n==="class"||n==="style"||Gt(n))&&((t||(t={}))[n]=e[n]);return t},Li=(e,t)=>{const n={};for(const r in e)(!Qn(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Ui(e,t,n){const{props:r,children:s,component:o}=e,{props:i,children:l,patchFlag:u}=t,f=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&u>=0){if(u&1024)return!0;if(u&16)return r?jr(r,i,f):!!i;if(u&8){const d=t.dynamicProps;for(let m=0;me.__isSuspense;function ji(e,t){t&&t.pendingBranch?N(e)?t.effects.push(...e):t.effects.push(e):Ci(e)}const Dt={};function On(e,t,n){return qs(e,t,n)}function qs(e,t,{immediate:n,deep:r,flush:s,onTrack:o,onTrigger:i}=q){var l;const u=qo()===((l=G)==null?void 0:l.scope)?G:null;let f,d=!1,m=!1;if(ee(e)?(f=()=>e.value,d=Vt(e)):Ze(e)?(f=()=>e,r=!0):N(e)?(m=!0,d=e.some(I=>Ze(I)||Vt(I)),f=()=>e.map(I=>{if(ee(I))return I.value;if(Ze(I))return Xe(I);if(v(I))return ve(I,u,2)})):v(e)?t?f=()=>ve(e,u,2):f=()=>{if(!(u&&u.isUnmounted))return x&&x(),he(e,u,3,[R])}:f=de,t&&r){const I=f;f=()=>Xe(I())}let x,R=I=>{x=z.onStop=()=>{ve(I,u,4)}},O;if(Tt)if(R=de,t?n&&he(t,u,3,[f(),m?[]:void 0,R]):f(),s==="sync"){const I=Ul();O=I.__watcherHandles||(I.__watcherHandles=[])}else return de;let A=m?new Array(e.length).fill(Dt):Dt;const D=()=>{if(z.active)if(t){const I=z.run();(r||d||(m?I.some((Ce,ut)=>_t(Ce,A[ut])):_t(I,A)))&&(x&&x(),he(t,u,3,[I,A===Dt?void 0:m&&A[0]===Dt?[]:A,R]),A=I)}else z.run()};D.allowRecurse=!!t;let j;s==="sync"?j=D:s==="post"?j=()=>re(D,u&&u.suspense):(D.pre=!0,u&&(D.id=u.uid),j=()=>dr(D));const z=new sr(f,j);t?n?D():A=z.run():s==="post"?re(z.run.bind(z),u&&u.suspense):z.run();const J=()=>{z.stop(),u&&u.scope&&Zn(u.scope.effects,z)};return O&&O.push(J),J}function Hi(e,t,n){const r=this.proxy,s=X(e)?e.includes(".")?zs(r,e):()=>r[e]:e.bind(r,r);let o;v(t)?o=t:(o=t.handler,n=t);const i=G;rt(this);const l=qs(s,o.bind(r),n);return i?rt(i):We(),l}function zs(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;s{Xe(n,t)});else if(_s(e))for(const n in e)Xe(e[n],t);return e}function je(e,t,n,r){const s=e.dirs,o=t&&t.dirs;for(let i=0;i!!e.type.__asyncLoader,Ws=e=>e.type.__isKeepAlive;function $i(e,t){ks(e,"a",t)}function Ki(e,t){ks(e,"da",t)}function ks(e,t,n=G){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(ln(t,r,n),n){let s=n.parent;for(;s&&s.parent;)Ws(s.parent.vnode)&&qi(r,t,n,s),s=s.parent}}function qi(e,t,n,r){const s=ln(t,e,r,!0);Js(()=>{Zn(r[t],s)},n)}function ln(e,t,n=G,r=!1){if(n){const s=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;it(),rt(n);const l=he(t,n,e,i);return We(),lt(),l});return r?s.unshift(o):s.push(o),o}}const Se=e=>(t,n=G)=>(!Tt||e==="sp")&&ln(e,(...r)=>t(...r),n),zi=Se("bm"),Wi=Se("m"),ki=Se("bu"),Ji=Se("u"),Vi=Se("bum"),Js=Se("um"),Xi=Se("sp"),Yi=Se("rtg"),Qi=Se("rtc");function Zi(e,t=G){ln("ec",e,t)}const Gi=Symbol.for("v-ndc");function el(e,t,n,r){let s;const o=n&&n[r];if(N(e)||X(e)){s=new Array(e.length);for(let i=0,l=e.length;it(i,l,void 0,o&&o[l]));else{const i=Object.keys(e);s=new Array(i.length);for(let l=0,u=i.length;le?ro(e)?br(e)||e.proxy:Hn(e.parent):null,gt=Q(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Hn(e.parent),$root:e=>Hn(e.root),$emit:e=>e.emit,$options:e=>hr(e),$forceUpdate:e=>e.f||(e.f=()=>dr(e.update)),$nextTick:e=>e.n||(e.n=Ai.bind(e.proxy)),$watch:e=>Hi.bind(e)}),Tn=(e,t)=>e!==q&&!e.__isScriptSetup&&L(e,t),tl={get({_:e},t){const{ctx:n,setupState:r,data:s,props:o,accessCache:i,type:l,appContext:u}=e;let f;if(t[0]!=="$"){const R=i[t];if(R!==void 0)switch(R){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return o[t]}else{if(Tn(r,t))return i[t]=1,r[t];if(s!==q&&L(s,t))return i[t]=2,s[t];if((f=e.propsOptions[0])&&L(f,t))return i[t]=3,o[t];if(n!==q&&L(n,t))return i[t]=4,n[t];$n&&(i[t]=0)}}const d=gt[t];let m,x;if(d)return t==="$attrs"&&se(e,"get",t),d(e);if((m=l.__cssModules)&&(m=m[t]))return m;if(n!==q&&L(n,t))return i[t]=4,n[t];if(x=u.config.globalProperties,L(x,t))return x[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:o}=e;return Tn(s,t)?(s[t]=n,!0):r!==q&&L(r,t)?(r[t]=n,!0):L(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:o}},i){let l;return!!n[i]||e!==q&&L(e,i)||Tn(t,i)||(l=o[0])&&L(l,i)||L(r,i)||L(gt,i)||L(s.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:L(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Hr(e){return N(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let $n=!0;function nl(e){const t=hr(e),n=e.proxy,r=e.ctx;$n=!1,t.beforeCreate&&$r(t.beforeCreate,e,"bc");const{data:s,computed:o,methods:i,watch:l,provide:u,inject:f,created:d,beforeMount:m,mounted:x,beforeUpdate:R,updated:O,activated:A,deactivated:D,beforeDestroy:j,beforeUnmount:z,destroyed:J,unmounted:I,render:Ce,renderTracked:ut,renderTriggered:Ct,errorCaptured:Le,serverPrefetch:gn,expose:Ue,inheritAttrs:ft,components:Pt,directives:Ft,filters:bn}=t;if(f&&rl(f,r,null),i)for(const k in i){const $=i[k];v($)&&(r[k]=$.bind(n))}if(s){const k=s.call(n,n);W(k)&&(e.data=cr(k))}if($n=!0,o)for(const k in o){const $=o[k],Be=v($)?$.bind(n,n):v($.get)?$.get.bind(n,n):de,Nt=!v($)&&v($.set)?$.set.bind(n):de,De=Ml({get:Be,set:Nt});Object.defineProperty(r,k,{enumerable:!0,configurable:!0,get:()=>De.value,set:pe=>De.value=pe})}if(l)for(const k in l)Vs(l[k],r,n,k);if(u){const k=v(u)?u.call(n):u;Reflect.ownKeys(k).forEach($=>{ul($,k[$])})}d&&$r(d,e,"c");function te(k,$){N($)?$.forEach(Be=>k(Be.bind(n))):$&&k($.bind(n))}if(te(zi,m),te(Wi,x),te(ki,R),te(Ji,O),te($i,A),te(Ki,D),te(Zi,Le),te(Qi,ut),te(Yi,Ct),te(Vi,z),te(Js,I),te(Xi,gn),N(Ue))if(Ue.length){const k=e.exposed||(e.exposed={});Ue.forEach($=>{Object.defineProperty(k,$,{get:()=>n[$],set:Be=>n[$]=Be})})}else e.exposed||(e.exposed={});Ce&&e.render===de&&(e.render=Ce),ft!=null&&(e.inheritAttrs=ft),Pt&&(e.components=Pt),Ft&&(e.directives=Ft)}function rl(e,t,n=de){N(e)&&(e=Kn(e));for(const r in e){const s=e[r];let o;W(s)?"default"in s?o=$t(s.from||r,s.default,!0):o=$t(s.from||r):o=$t(s),ee(o)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>o.value,set:i=>o.value=i}):t[r]=o}}function $r(e,t,n){he(N(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function Vs(e,t,n,r){const s=r.includes(".")?zs(n,r):()=>n[r];if(X(e)){const o=t[e];v(o)&&On(s,o)}else if(v(e))On(s,e.bind(n));else if(W(e))if(N(e))e.forEach(o=>Vs(o,t,n,r));else{const o=v(e.handler)?e.handler.bind(n):t[e.handler];v(o)&&On(s,o,e)}}function hr(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,l=o.get(t);let u;return l?u=l:!s.length&&!n&&!r?u=t:(u={},s.length&&s.forEach(f=>Yt(u,f,i,!0)),Yt(u,t,i)),W(t)&&o.set(t,u),u}function Yt(e,t,n,r=!1){const{mixins:s,extends:o}=t;o&&Yt(e,o,n,!0),s&&s.forEach(i=>Yt(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const l=sl[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const sl={data:Kr,props:qr,emits:qr,methods:mt,computed:mt,beforeCreate:ne,created:ne,beforeMount:ne,mounted:ne,beforeUpdate:ne,updated:ne,beforeDestroy:ne,beforeUnmount:ne,destroyed:ne,unmounted:ne,activated:ne,deactivated:ne,errorCaptured:ne,serverPrefetch:ne,components:mt,directives:mt,watch:il,provide:Kr,inject:ol};function Kr(e,t){return t?e?function(){return Q(v(e)?e.call(this,this):e,v(t)?t.call(this,this):t)}:t:e}function ol(e,t){return mt(Kn(e),Kn(t))}function Kn(e){if(N(e)){const t={};for(let n=0;n1)return n&&v(t)?t.call(r&&r.proxy):t}}function fl(e,t,n,r=!1){const s={},o={};Jt(o,un,1),e.propsDefaults=Object.create(null),Ys(e,t,s,o);for(const i in e.propsOptions[0])i in s||(s[i]=void 0);n?e.props=r?s:gi(s):e.type.props?e.props=s:e.props=o,e.attrs=o}function al(e,t,n,r){const{props:s,attrs:o,vnode:{patchFlag:i}}=e,l=B(s),[u]=e.propsOptions;let f=!1;if((r||i>0)&&!(i&16)){if(i&8){const d=e.vnode.dynamicProps;for(let m=0;m{u=!0;const[x,R]=Qs(m,t,!0);Q(i,x),R&&l.push(...R)};!n&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!o&&!u)return W(e)&&r.set(e,Ye),Ye;if(N(o))for(let d=0;d-1,R[1]=A<0||O-1||L(R,"default"))&&l.push(m)}}}const f=[i,l];return W(e)&&r.set(e,f),f}function zr(e){return e[0]!=="$"}function Wr(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function kr(e,t){return Wr(e)===Wr(t)}function Jr(e,t){return N(t)?t.findIndex(n=>kr(n,e)):v(t)&&kr(t,e)?0:-1}const Zs=e=>e[0]==="_"||e==="$stable",pr=e=>N(e)?e.map(be):[be(e)],dl=(e,t,n)=>{if(t._n)return t;const r=vi((...s)=>pr(t(...s)),n);return r._c=!1,r},Gs=(e,t,n)=>{const r=e._ctx;for(const s in e){if(Zs(s))continue;const o=e[s];if(v(o))t[s]=dl(s,o,r);else if(o!=null){const i=pr(o);t[s]=()=>i}}},eo=(e,t)=>{const n=pr(t);e.slots.default=()=>n},hl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=B(t),Jt(t,"_",n)):Gs(t,e.slots={})}else e.slots={},t&&eo(e,t);Jt(e.slots,un,1)},pl=(e,t,n)=>{const{vnode:r,slots:s}=e;let o=!0,i=q;if(r.shapeFlag&32){const l=t._;l?n&&l===1?o=!1:(Q(s,t),!n&&l===1&&delete s._):(o=!t.$stable,Gs(t,s)),i=t}else t&&(eo(e,t),i={default:1});if(o)for(const l in s)!Zs(l)&&!(l in i)&&delete s[l]};function zn(e,t,n,r,s=!1){if(N(e)){e.forEach((x,R)=>zn(x,t&&(N(t)?t[R]:t),n,r,s));return}if(Ht(r)&&!s)return;const o=r.shapeFlag&4?br(r.component)||r.component.proxy:r.el,i=s?null:o,{i:l,r:u}=e,f=t&&t.r,d=l.refs===q?l.refs={}:l.refs,m=l.setupState;if(f!=null&&f!==u&&(X(f)?(d[f]=null,L(m,f)&&(m[f]=null)):ee(f)&&(f.value=null)),v(u))ve(u,l,12,[i,d]);else{const x=X(u),R=ee(u);if(x||R){const O=()=>{if(e.f){const A=x?L(m,u)?m[u]:d[u]:u.value;s?N(A)&&Zn(A,o):N(A)?A.includes(o)||A.push(o):x?(d[u]=[o],L(m,u)&&(m[u]=d[u])):(u.value=[o],e.k&&(d[e.k]=u.value))}else x?(d[u]=i,L(m,u)&&(m[u]=i)):R&&(u.value=i,e.k&&(d[e.k]=i))};i?(O.id=-1,re(O,n)):O()}}}const re=ji;function ml(e){return gl(e)}function gl(e,t){const n=Mn();n.__VUE__=!0;const{insert:r,remove:s,patchProp:o,createElement:i,createText:l,createComment:u,setText:f,setElementText:d,parentNode:m,nextSibling:x,setScopeId:R=de,insertStaticContent:O}=e,A=(c,a,h,b=null,g=null,E=null,T=!1,y=null,w=!!a.dynamicChildren)=>{if(c===a)return;c&&!dt(c,a)&&(b=It(c),pe(c,g,E,!0),c=null),a.patchFlag===-2&&(w=!1,a.dynamicChildren=null);const{type:_,ref:C,shapeFlag:S}=a;switch(_){case cn:D(c,a,h,b);break;case xt:j(c,a,h,b);break;case An:c==null&&z(a,h,b,T);break;case ue:Pt(c,a,h,b,g,E,T,y,w);break;default:S&1?Ce(c,a,h,b,g,E,T,y,w):S&6?Ft(c,a,h,b,g,E,T,y,w):(S&64||S&128)&&_.process(c,a,h,b,g,E,T,y,w,ke)}C!=null&&g&&zn(C,c&&c.ref,E,a||c,!a)},D=(c,a,h,b)=>{if(c==null)r(a.el=l(a.children),h,b);else{const g=a.el=c.el;a.children!==c.children&&f(g,a.children)}},j=(c,a,h,b)=>{c==null?r(a.el=u(a.children||""),h,b):a.el=c.el},z=(c,a,h,b)=>{[c.el,c.anchor]=O(c.children,a,h,b,c.el,c.anchor)},J=({el:c,anchor:a},h,b)=>{let g;for(;c&&c!==a;)g=x(c),r(c,h,b),c=g;r(a,h,b)},I=({el:c,anchor:a})=>{let h;for(;c&&c!==a;)h=x(c),s(c),c=h;s(a)},Ce=(c,a,h,b,g,E,T,y,w)=>{T=T||a.type==="svg",c==null?ut(a,h,b,g,E,T,y,w):gn(c,a,g,E,T,y,w)},ut=(c,a,h,b,g,E,T,y)=>{let w,_;const{type:C,props:S,shapeFlag:P,transition:F,dirs:M}=c;if(w=c.el=i(c.type,E,S&&S.is,S),P&8?d(w,c.children):P&16&&Le(c.children,w,null,b,g,E&&C!=="foreignObject",T,y),M&&je(c,null,b,"created"),Ct(w,c,c.scopeId,T,b),S){for(const H in S)H!=="value"&&!jt(H)&&o(w,H,null,S[H],E,c.children,b,g,xe);"value"in S&&o(w,"value",null,S.value),(_=S.onVnodeBeforeMount)&&ge(_,b,c)}M&&je(c,null,b,"beforeMount");const K=(!g||g&&!g.pendingBranch)&&F&&!F.persisted;K&&F.beforeEnter(w),r(w,a,h),((_=S&&S.onVnodeMounted)||K||M)&&re(()=>{_&&ge(_,b,c),K&&F.enter(w),M&&je(c,null,b,"mounted")},g)},Ct=(c,a,h,b,g)=>{if(h&&R(c,h),b)for(let E=0;E{for(let _=w;_{const y=a.el=c.el;let{patchFlag:w,dynamicChildren:_,dirs:C}=a;w|=c.patchFlag&16;const S=c.props||q,P=a.props||q;let F;h&&He(h,!1),(F=P.onVnodeBeforeUpdate)&&ge(F,h,a,c),C&&je(a,c,h,"beforeUpdate"),h&&He(h,!0);const M=g&&a.type!=="foreignObject";if(_?Ue(c.dynamicChildren,_,y,h,b,M,E):T||$(c,a,y,null,h,b,M,E,!1),w>0){if(w&16)ft(y,a,S,P,h,b,g);else if(w&2&&S.class!==P.class&&o(y,"class",null,P.class,g),w&4&&o(y,"style",S.style,P.style,g),w&8){const K=a.dynamicProps;for(let H=0;H{F&&ge(F,h,a,c),C&&je(a,c,h,"updated")},b)},Ue=(c,a,h,b,g,E,T)=>{for(let y=0;y{if(h!==b){if(h!==q)for(const y in h)!jt(y)&&!(y in b)&&o(c,y,h[y],null,T,a.children,g,E,xe);for(const y in b){if(jt(y))continue;const w=b[y],_=h[y];w!==_&&y!=="value"&&o(c,y,_,w,T,a.children,g,E,xe)}"value"in b&&o(c,"value",h.value,b.value)}},Pt=(c,a,h,b,g,E,T,y,w)=>{const _=a.el=c?c.el:l(""),C=a.anchor=c?c.anchor:l("");let{patchFlag:S,dynamicChildren:P,slotScopeIds:F}=a;F&&(y=y?y.concat(F):F),c==null?(r(_,h,b),r(C,h,b),Le(a.children,h,C,g,E,T,y,w)):S>0&&S&64&&P&&c.dynamicChildren?(Ue(c.dynamicChildren,P,h,g,E,T,y),(a.key!=null||g&&a===g.subTree)&&to(c,a,!0)):$(c,a,h,C,g,E,T,y,w)},Ft=(c,a,h,b,g,E,T,y,w)=>{a.slotScopeIds=y,c==null?a.shapeFlag&512?g.ctx.activate(a,h,b,T,w):bn(a,h,b,g,E,T,w):Tr(c,a,w)},bn=(c,a,h,b,g,E,T)=>{const y=c.component=Cl(c,b,g);if(Ws(c)&&(y.ctx.renderer=ke),Pl(y),y.asyncDep){if(g&&g.registerDep(y,te),!c.el){const w=y.subTree=ze(xt);j(null,w,a,h)}return}te(y,c,a,h,g,E,T)},Tr=(c,a,h)=>{const b=a.component=c.component;if(Ui(c,a,h))if(b.asyncDep&&!b.asyncResolved){k(b,a,h);return}else b.next=a,Si(b.update),b.update();else a.el=c.el,b.vnode=a},te=(c,a,h,b,g,E,T)=>{const y=()=>{if(c.isMounted){let{next:C,bu:S,u:P,parent:F,vnode:M}=c,K=C,H;He(c,!1),C?(C.el=M.el,k(c,C,T)):C=M,S&&wn(S),(H=C.props&&C.props.onVnodeBeforeUpdate)&&ge(H,F,C,M),He(c,!0);const V=xn(c),le=c.subTree;c.subTree=V,A(le,V,m(le.el),It(le),c,g,E),C.el=V.el,K===null&&Bi(c,V.el),P&&re(P,g),(H=C.props&&C.props.onVnodeUpdated)&&re(()=>ge(H,F,C,M),g)}else{let C;const{el:S,props:P}=a,{bm:F,m:M,parent:K}=c,H=Ht(a);if(He(c,!1),F&&wn(F),!H&&(C=P&&P.onVnodeBeforeMount)&&ge(C,K,a),He(c,!0),S&&yn){const V=()=>{c.subTree=xn(c),yn(S,c.subTree,c,g,null)};H?a.type.__asyncLoader().then(()=>!c.isUnmounted&&V()):V()}else{const V=c.subTree=xn(c);A(null,V,h,b,c,g,E),a.el=V.el}if(M&&re(M,g),!H&&(C=P&&P.onVnodeMounted)){const V=a;re(()=>ge(C,K,V),g)}(a.shapeFlag&256||K&&Ht(K.vnode)&&K.vnode.shapeFlag&256)&&c.a&&re(c.a,g),c.isMounted=!0,a=h=b=null}},w=c.effect=new sr(y,()=>dr(_),c.scope),_=c.update=()=>w.run();_.id=c.uid,He(c,!0),_()},k=(c,a,h)=>{a.component=c;const b=c.vnode.props;c.vnode=a,c.next=null,al(c,a.props,b,h),pl(c,a.children,h),it(),Dr(),lt()},$=(c,a,h,b,g,E,T,y,w=!1)=>{const _=c&&c.children,C=c?c.shapeFlag:0,S=a.children,{patchFlag:P,shapeFlag:F}=a;if(P>0){if(P&128){Nt(_,S,h,b,g,E,T,y,w);return}else if(P&256){Be(_,S,h,b,g,E,T,y,w);return}}F&8?(C&16&&xe(_,g,E),S!==_&&d(h,S)):C&16?F&16?Nt(_,S,h,b,g,E,T,y,w):xe(_,g,E,!0):(C&8&&d(h,""),F&16&&Le(S,h,b,g,E,T,y,w))},Be=(c,a,h,b,g,E,T,y,w)=>{c=c||Ye,a=a||Ye;const _=c.length,C=a.length,S=Math.min(_,C);let P;for(P=0;PC?xe(c,g,E,!0,!1,S):Le(a,h,b,g,E,T,y,w,S)},Nt=(c,a,h,b,g,E,T,y,w)=>{let _=0;const C=a.length;let S=c.length-1,P=C-1;for(;_<=S&&_<=P;){const F=c[_],M=a[_]=w?Ne(a[_]):be(a[_]);if(dt(F,M))A(F,M,h,null,g,E,T,y,w);else break;_++}for(;_<=S&&_<=P;){const F=c[S],M=a[P]=w?Ne(a[P]):be(a[P]);if(dt(F,M))A(F,M,h,null,g,E,T,y,w);else break;S--,P--}if(_>S){if(_<=P){const F=P+1,M=FP)for(;_<=S;)pe(c[_],g,E,!0),_++;else{const F=_,M=_,K=new Map;for(_=M;_<=P;_++){const oe=a[_]=w?Ne(a[_]):be(a[_]);oe.key!=null&&K.set(oe.key,_)}let H,V=0;const le=P-M+1;let Je=!1,Sr=0;const at=new Array(le);for(_=0;_=le){pe(oe,g,E,!0);continue}let me;if(oe.key!=null)me=K.get(oe.key);else for(H=M;H<=P;H++)if(at[H-M]===0&&dt(oe,a[H])){me=H;break}me===void 0?pe(oe,g,E,!0):(at[me-M]=_+1,me>=Sr?Sr=me:Je=!0,A(oe,a[me],h,null,g,E,T,y,w),V++)}const Cr=Je?bl(at):Ye;for(H=Cr.length-1,_=le-1;_>=0;_--){const oe=M+_,me=a[oe],Pr=oe+1{const{el:E,type:T,transition:y,children:w,shapeFlag:_}=c;if(_&6){De(c.component.subTree,a,h,b);return}if(_&128){c.suspense.move(a,h,b);return}if(_&64){T.move(c,a,h,ke);return}if(T===ue){r(E,a,h);for(let S=0;Sy.enter(E),g);else{const{leave:S,delayLeave:P,afterLeave:F}=y,M=()=>r(E,a,h),K=()=>{S(E,()=>{M(),F&&F()})};P?P(E,M,K):K()}else r(E,a,h)},pe=(c,a,h,b=!1,g=!1)=>{const{type:E,props:T,ref:y,children:w,dynamicChildren:_,shapeFlag:C,patchFlag:S,dirs:P}=c;if(y!=null&&zn(y,null,h,c,!0),C&256){a.ctx.deactivate(c);return}const F=C&1&&P,M=!Ht(c);let K;if(M&&(K=T&&T.onVnodeBeforeUnmount)&&ge(K,a,c),C&6)Ro(c.component,h,b);else{if(C&128){c.suspense.unmount(h,b);return}F&&je(c,null,a,"beforeUnmount"),C&64?c.type.remove(c,a,h,g,ke,b):_&&(E!==ue||S>0&&S&64)?xe(_,a,h,!1,!0):(E===ue&&S&384||!g&&C&16)&&xe(w,a,h),b&&Ar(c)}(M&&(K=T&&T.onVnodeUnmounted)||F)&&re(()=>{K&&ge(K,a,c),F&&je(c,null,a,"unmounted")},h)},Ar=c=>{const{type:a,el:h,anchor:b,transition:g}=c;if(a===ue){Ao(h,b);return}if(a===An){I(c);return}const E=()=>{s(h),g&&!g.persisted&&g.afterLeave&&g.afterLeave()};if(c.shapeFlag&1&&g&&!g.persisted){const{leave:T,delayLeave:y}=g,w=()=>T(h,E);y?y(c.el,E,w):w()}else E()},Ao=(c,a)=>{let h;for(;c!==a;)h=x(c),s(c),c=h;s(a)},Ro=(c,a,h)=>{const{bum:b,scope:g,update:E,subTree:T,um:y}=c;b&&wn(b),g.stop(),E&&(E.active=!1,pe(T,c,a,h)),y&&re(y,a),re(()=>{c.isUnmounted=!0},a),a&&a.pendingBranch&&!a.isUnmounted&&c.asyncDep&&!c.asyncResolved&&c.suspenseId===a.pendingId&&(a.deps--,a.deps===0&&a.resolve())},xe=(c,a,h,b=!1,g=!1,E=0)=>{for(let T=E;Tc.shapeFlag&6?It(c.component.subTree):c.shapeFlag&128?c.suspense.next():x(c.anchor||c.el),Rr=(c,a,h)=>{c==null?a._vnode&&pe(a._vnode,null,null,!0):A(a._vnode||null,c,a,null,null,null,h),Dr(),Hs(),a._vnode=c},ke={p:A,um:pe,m:De,r:Ar,mt:bn,mc:Le,pc:$,pbc:Ue,n:It,o:e};let _n,yn;return t&&([_n,yn]=t(ke)),{render:Rr,hydrate:_n,createApp:cl(Rr,_n)}}function He({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function to(e,t,n=!1){const r=e.children,s=t.children;if(N(r)&&N(s))for(let o=0;o>1,e[n[l]]0&&(t[r]=n[o-1]),n[o]=r)}}for(o=n.length,i=n[o-1];o-- >0;)n[o]=i,i=t[i];return n}const _l=e=>e.__isTeleport,ue=Symbol.for("v-fgt"),cn=Symbol.for("v-txt"),xt=Symbol.for("v-cmt"),An=Symbol.for("v-stc"),bt=[];let ae=null;function Rn(e=!1){bt.push(ae=e?null:[])}function yl(){bt.pop(),ae=bt[bt.length-1]||null}let Ot=1;function Vr(e){Ot+=e}function El(e){return e.dynamicChildren=Ot>0?ae||Ye:null,yl(),Ot>0&&ae&&ae.push(e),e}function Sn(e,t,n,r,s,o){return El(Te(e,t,n,r,s,o,!0))}function wl(e){return e?e.__v_isVNode===!0:!1}function dt(e,t){return e.type===t.type&&e.key===t.key}const un="__vInternal",no=({key:e})=>e??null,Kt=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?X(e)||ee(e)||v(e)?{i:ye,r:e,k:t,f:!!n}:e:null);function Te(e,t=null,n=null,r=0,s=null,o=e===ue?0:1,i=!1,l=!1){const u={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&no(t),ref:t&&Kt(t),scopeId:on,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:ye};return l?(mr(u,n),o&128&&e.normalize(u)):n&&(u.shapeFlag|=X(n)?8:16),Ot>0&&!i&&ae&&(u.patchFlag>0||o&6)&&u.patchFlag!==32&&ae.push(u),u}const ze=xl;function xl(e,t=null,n=null,r=0,s=null,o=!1){if((!e||e===Gi)&&(e=xt),wl(e)){const l=nt(e,t,!0);return n&&mr(l,n),Ot>0&&!o&&ae&&(l.shapeFlag&6?ae[ae.indexOf(e)]=l:ae.push(l)),l.patchFlag|=-2,l}if(vl(e)&&(e=e.__vccOpts),t){t=Ol(t);let{class:l,style:u}=t;l&&!X(l)&&(t.class=nr(l)),W(u)&&(vs(u)&&!N(u)&&(u=Q({},u)),t.style=tr(u))}const i=X(e)?1:Di(e)?128:_l(e)?64:W(e)?4:v(e)?2:0;return Te(e,t,n,r,s,i,o,!0)}function Ol(e){return e?vs(e)||un in e?Q({},e):e:null}function nt(e,t,n=!1){const{props:r,ref:s,patchFlag:o,children:i}=e,l=t?Al(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&no(l),ref:t&&t.ref?n&&s?N(s)?s.concat(Kt(t)):[s,Kt(t)]:Kt(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ue?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&nt(e.ssContent),ssFallback:e.ssFallback&&nt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Tl(e=" ",t=0){return ze(cn,null,e,t)}function be(e){return e==null||typeof e=="boolean"?ze(xt):N(e)?ze(ue,null,e.slice()):typeof e=="object"?Ne(e):ze(cn,null,String(e))}function Ne(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:nt(e)}function mr(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(N(t))n=16;else if(typeof t=="object")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),mr(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!(un in t)?t._ctx=ye:s===3&&ye&&(ye.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else v(t)?(t={default:t,_ctx:ye},n=32):(t=String(t),r&64?(n=16,t=[Tl(t)]):n=8);e.children=t,e.shapeFlag|=n}function Al(...e){const t={};for(let n=0;nG=e),gr=e=>{Ve.length>1?Ve.forEach(t=>t(e)):Ve[0](e)};const rt=e=>{gr(e),e.scope.on()},We=()=>{G&&G.scope.off(),gr(null)};function ro(e){return e.vnode.shapeFlag&4}let Tt=!1;function Pl(e,t=!1){Tt=t;const{props:n,children:r}=e.vnode,s=ro(e);fl(e,n,s,t),hl(e,r);const o=s?Fl(e,t):void 0;return Tt=!1,o}function Fl(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Ms(new Proxy(e.ctx,tl));const{setup:r}=n;if(r){const s=e.setupContext=r.length>1?Il(e):null;rt(e),it();const o=ve(r,e,0,[e.props,s]);if(lt(),We(),gs(o)){if(o.then(We,We),t)return o.then(i=>{Yr(e,i,t)}).catch(i=>{rn(i,e,0)});e.asyncDep=o}else Yr(e,o,t)}else so(e,t)}function Yr(e,t,n){v(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:W(t)&&(e.setupState=Bs(t)),so(e,n)}let Qr;function so(e,t,n){const r=e.type;if(!e.render){if(!t&&Qr&&!r.render){const s=r.template||hr(e).template;if(s){const{isCustomElement:o,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:u}=r,f=Q(Q({isCustomElement:o,delimiters:l},i),u);r.render=Qr(s,f)}}e.render=r.render||de}rt(e),it(),nl(e),lt(),We()}function Nl(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return se(e,"get","$attrs"),t[n]}}))}function Il(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return Nl(e)},slots:e.slots,emit:e.emit,expose:t}}function br(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Bs(Ms(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in gt)return gt[n](e)},has(t,n){return n in t||n in gt}}))}function vl(e){return v(e)&&"__vccOpts"in e}const Ml=(e,t)=>Oi(e,t,Tt),Ll=Symbol.for("v-scx"),Ul=()=>$t(Ll),Bl="3.3.4",Dl="http://www.w3.org/2000/svg",Ke=typeof document<"u"?document:null,Zr=Ke&&Ke.createElement("template"),jl={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t?Ke.createElementNS(Dl,e):Ke.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>Ke.createTextNode(e),createComment:e=>Ke.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ke.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,o){const i=n?n.previousSibling:t.lastChild;if(s&&(s===o||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===o||!(s=s.nextSibling)););else{Zr.innerHTML=r?`${e}`:e;const l=Zr.content;if(r){const u=l.firstChild;for(;u.firstChild;)l.appendChild(u.firstChild);l.removeChild(u)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function Hl(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function $l(e,t,n){const r=e.style,s=X(n);if(n&&!s){if(t&&!X(t))for(const o in t)n[o]==null&&Wn(r,o,"");for(const o in n)Wn(r,o,n[o])}else{const o=r.display;s?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=o)}}const Gr=/\s*!important$/;function Wn(e,t,n){if(N(n))n.forEach(r=>Wn(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Kl(e,t);Gr.test(n)?e.setProperty(ot(r),n.replace(Gr,""),"important"):e[r]=n}}const es=["Webkit","Moz","ms"],Cn={};function Kl(e,t){const n=Cn[t];if(n)return n;let r=et(t);if(r!=="filter"&&r in e)return Cn[t]=r;r=ys(r);for(let s=0;sPn||(Xl.then(()=>Pn=0),Pn=Date.now());function Ql(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;he(Zl(r,n.value),t,5,[r])};return n.value=e,n.attached=Yl(),n}function Zl(e,t){if(N(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const rs=/^on[a-z]/,Gl=(e,t,n,r,s=!1,o,i,l,u)=>{t==="class"?Hl(e,r,s):t==="style"?$l(e,n,r):Gt(t)?Qn(t)||Jl(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):ec(e,t,r,s))?zl(e,t,r,o,i,l,u):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),ql(e,t,r,s))};function ec(e,t,n,r){return r?!!(t==="innerHTML"||t==="textContent"||t in e&&rs.test(t)&&v(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||rs.test(t)&&X(n)?!1:t in e}const tc=Q({patchProp:Gl},jl);let ss;function nc(){return ss||(ss=ml(tc))}const rc=(...e)=>{const t=nc().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=sc(r);if(!s)return;const o=t._component;!v(o)&&!o.render&&!o.template&&(o.template=s.innerHTML),s.innerHTML="";const i=n(s,!1,s instanceof SVGElement);return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),i},t};function sc(e){return X(e)?document.querySelector(e):e}const oc="/vite.svg",ic="/assets/vue-5532db34.svg";function oo(e,t){return function(){return e.apply(t,arguments)}}const{toString:lc}=Object.prototype,{getPrototypeOf:_r}=Object,fn=(e=>t=>{const n=lc.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),we=e=>(e=e.toLowerCase(),t=>fn(t)===e),an=e=>t=>typeof t===e,{isArray:ct}=Array,At=an("undefined");function cc(e){return e!==null&&!At(e)&&e.constructor!==null&&!At(e.constructor)&&ie(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const io=we("ArrayBuffer");function uc(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&io(e.buffer),t}const fc=an("string"),ie=an("function"),lo=an("number"),dn=e=>e!==null&&typeof e=="object",ac=e=>e===!0||e===!1,qt=e=>{if(fn(e)!=="object")return!1;const t=_r(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},dc=we("Date"),hc=we("File"),pc=we("Blob"),mc=we("FileList"),gc=e=>dn(e)&&ie(e.pipe),bc=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||ie(e.append)&&((t=fn(e))==="formdata"||t==="object"&&ie(e.toString)&&e.toString()==="[object FormData]"))},_c=we("URLSearchParams"),yc=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Rt(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,s;if(typeof e!="object"&&(e=[e]),ct(e))for(r=0,s=e.length;r0;)if(s=n[r],t===s.toLowerCase())return s;return null}const uo=(()=>typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global)(),fo=e=>!At(e)&&e!==uo;function kn(){const{caseless:e}=fo(this)&&this||{},t={},n=(r,s)=>{const o=e&&co(t,s)||s;qt(t[o])&&qt(r)?t[o]=kn(t[o],r):qt(r)?t[o]=kn({},r):ct(r)?t[o]=r.slice():t[o]=r};for(let r=0,s=arguments.length;r(Rt(t,(s,o)=>{n&&ie(s)?e[o]=oo(s,n):e[o]=s},{allOwnKeys:r}),e),wc=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),xc=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},Oc=(e,t,n,r)=>{let s,o,i;const l={};if(t=t||{},e==null)return t;do{for(s=Object.getOwnPropertyNames(e),o=s.length;o-- >0;)i=s[o],(!r||r(i,e,t))&&!l[i]&&(t[i]=e[i],l[i]=!0);e=n!==!1&&_r(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},Tc=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return r!==-1&&r===n},Ac=e=>{if(!e)return null;if(ct(e))return e;let t=e.length;if(!lo(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},Rc=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&_r(Uint8Array)),Sc=(e,t)=>{const r=(e&&e[Symbol.iterator]).call(e);let s;for(;(s=r.next())&&!s.done;){const o=s.value;t.call(e,o[0],o[1])}},Cc=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},Pc=we("HTMLFormElement"),Fc=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,s){return r.toUpperCase()+s}),os=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),Nc=we("RegExp"),ao=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};Rt(n,(s,o)=>{t(s,o,e)!==!1&&(r[o]=s)}),Object.defineProperties(e,r)},Ic=e=>{ao(e,(t,n)=>{if(ie(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if(ie(r)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},vc=(e,t)=>{const n={},r=s=>{s.forEach(o=>{n[o]=!0})};return ct(e)?r(e):r(String(e).split(t)),n},Mc=()=>{},Lc=(e,t)=>(e=+e,Number.isFinite(e)?e:t),Fn="abcdefghijklmnopqrstuvwxyz",is="0123456789",ho={DIGIT:is,ALPHA:Fn,ALPHA_DIGIT:Fn+Fn.toUpperCase()+is},Uc=(e=16,t=ho.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n};function Bc(e){return!!(e&&ie(e.append)&&e[Symbol.toStringTag]==="FormData"&&e[Symbol.iterator])}const Dc=e=>{const t=new Array(10),n=(r,s)=>{if(dn(r)){if(t.indexOf(r)>=0)return;if(!("toJSON"in r)){t[s]=r;const o=ct(r)?[]:{};return Rt(r,(i,l)=>{const u=n(i,s+1);!At(u)&&(o[l]=u)}),t[s]=void 0,o}}return r};return n(e,0)},jc=we("AsyncFunction"),Hc=e=>e&&(dn(e)||ie(e))&&ie(e.then)&&ie(e.catch),p={isArray:ct,isArrayBuffer:io,isBuffer:cc,isFormData:bc,isArrayBufferView:uc,isString:fc,isNumber:lo,isBoolean:ac,isObject:dn,isPlainObject:qt,isUndefined:At,isDate:dc,isFile:hc,isBlob:pc,isRegExp:Nc,isFunction:ie,isStream:gc,isURLSearchParams:_c,isTypedArray:Rc,isFileList:mc,forEach:Rt,merge:kn,extend:Ec,trim:yc,stripBOM:wc,inherits:xc,toFlatObject:Oc,kindOf:fn,kindOfTest:we,endsWith:Tc,toArray:Ac,forEachEntry:Sc,matchAll:Cc,isHTMLForm:Pc,hasOwnProperty:os,hasOwnProp:os,reduceDescriptors:ao,freezeMethods:Ic,toObjectSet:vc,toCamelCase:Fc,noop:Mc,toFiniteNumber:Lc,findKey:co,global:uo,isContextDefined:fo,ALPHABET:ho,generateString:Uc,isSpecCompliantForm:Bc,toJSONObject:Dc,isAsyncFn:jc,isThenable:Hc};function U(e,t,n,r,s){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),s&&(this.response=s)}p.inherits(U,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:p.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const po=U.prototype,mo={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{mo[e]={value:e}});Object.defineProperties(U,mo);Object.defineProperty(po,"isAxiosError",{value:!0});U.from=(e,t,n,r,s,o)=>{const i=Object.create(po);return p.toFlatObject(e,i,function(u){return u!==Error.prototype},l=>l!=="isAxiosError"),U.call(i,e.message,t,n,r,s),i.cause=e,i.name=e.name,o&&Object.assign(i,o),i};const $c=null;function Jn(e){return p.isPlainObject(e)||p.isArray(e)}function go(e){return p.endsWith(e,"[]")?e.slice(0,-2):e}function ls(e,t,n){return e?e.concat(t).map(function(s,o){return s=go(s),!n&&o?"["+s+"]":s}).join(n?".":""):t}function Kc(e){return p.isArray(e)&&!e.some(Jn)}const qc=p.toFlatObject(p,{},null,function(t){return/^is[A-Z]/.test(t)});function hn(e,t,n){if(!p.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=p.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(A,D){return!p.isUndefined(D[A])});const r=n.metaTokens,s=n.visitor||d,o=n.dots,i=n.indexes,u=(n.Blob||typeof Blob<"u"&&Blob)&&p.isSpecCompliantForm(t);if(!p.isFunction(s))throw new TypeError("visitor must be a function");function f(O){if(O===null)return"";if(p.isDate(O))return O.toISOString();if(!u&&p.isBlob(O))throw new U("Blob is not supported. Use a Buffer instead.");return p.isArrayBuffer(O)||p.isTypedArray(O)?u&&typeof Blob=="function"?new Blob([O]):Buffer.from(O):O}function d(O,A,D){let j=O;if(O&&!D&&typeof O=="object"){if(p.endsWith(A,"{}"))A=r?A:A.slice(0,-2),O=JSON.stringify(O);else if(p.isArray(O)&&Kc(O)||(p.isFileList(O)||p.endsWith(A,"[]"))&&(j=p.toArray(O)))return A=go(A),j.forEach(function(J,I){!(p.isUndefined(J)||J===null)&&t.append(i===!0?ls([A],I,o):i===null?A:A+"[]",f(J))}),!1}return Jn(O)?!0:(t.append(ls(D,A,o),f(O)),!1)}const m=[],x=Object.assign(qc,{defaultVisitor:d,convertValue:f,isVisitable:Jn});function R(O,A){if(!p.isUndefined(O)){if(m.indexOf(O)!==-1)throw Error("Circular reference detected in "+A.join("."));m.push(O),p.forEach(O,function(j,z){(!(p.isUndefined(j)||j===null)&&s.call(t,j,p.isString(z)?z.trim():z,A,x))===!0&&R(j,A?A.concat(z):[z])}),m.pop()}}if(!p.isObject(e))throw new TypeError("data must be an object");return R(e),t}function cs(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function yr(e,t){this._pairs=[],e&&hn(e,this,t)}const bo=yr.prototype;bo.append=function(t,n){this._pairs.push([t,n])};bo.toString=function(t){const n=t?function(r){return t.call(this,r,cs)}:cs;return this._pairs.map(function(s){return n(s[0])+"="+n(s[1])},"").join("&")};function zc(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function _o(e,t,n){if(!t)return e;const r=n&&n.encode||zc,s=n&&n.serialize;let o;if(s?o=s(t,n):o=p.isURLSearchParams(t)?t.toString():new yr(t,n).toString(r),o){const i=e.indexOf("#");i!==-1&&(e=e.slice(0,i)),e+=(e.indexOf("?")===-1?"?":"&")+o}return e}class Wc{constructor(){this.handlers=[]}use(t,n,r){return this.handlers.push({fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){p.forEach(this.handlers,function(r){r!==null&&t(r)})}}const us=Wc,yo={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},kc=typeof URLSearchParams<"u"?URLSearchParams:yr,Jc=typeof FormData<"u"?FormData:null,Vc=typeof Blob<"u"?Blob:null,Xc=(()=>{let e;return typeof navigator<"u"&&((e=navigator.product)==="ReactNative"||e==="NativeScript"||e==="NS")?!1:typeof window<"u"&&typeof document<"u"})(),Yc=(()=>typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function")(),Ee={isBrowser:!0,classes:{URLSearchParams:kc,FormData:Jc,Blob:Vc},isStandardBrowserEnv:Xc,isStandardBrowserWebWorkerEnv:Yc,protocols:["http","https","file","blob","url","data"]};function Qc(e,t){return hn(e,new Ee.classes.URLSearchParams,Object.assign({visitor:function(n,r,s,o){return Ee.isNode&&p.isBuffer(n)?(this.append(r,n.toString("base64")),!1):o.defaultVisitor.apply(this,arguments)}},t))}function Zc(e){return p.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function Gc(e){const t={},n=Object.keys(e);let r;const s=n.length;let o;for(r=0;r=n.length;return i=!i&&p.isArray(s)?s.length:i,u?(p.hasOwnProp(s,i)?s[i]=[s[i],r]:s[i]=r,!l):((!s[i]||!p.isObject(s[i]))&&(s[i]=[]),t(n,r,s[i],o)&&p.isArray(s[i])&&(s[i]=Gc(s[i])),!l)}if(p.isFormData(e)&&p.isFunction(e.entries)){const n={};return p.forEachEntry(e,(r,s)=>{t(Zc(r),s,n,0)}),n}return null}const eu={"Content-Type":void 0};function tu(e,t,n){if(p.isString(e))try{return(t||JSON.parse)(e),p.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(n||JSON.stringify)(e)}const pn={transitional:yo,adapter:["xhr","http"],transformRequest:[function(t,n){const r=n.getContentType()||"",s=r.indexOf("application/json")>-1,o=p.isObject(t);if(o&&p.isHTMLForm(t)&&(t=new FormData(t)),p.isFormData(t))return s&&s?JSON.stringify(Eo(t)):t;if(p.isArrayBuffer(t)||p.isBuffer(t)||p.isStream(t)||p.isFile(t)||p.isBlob(t))return t;if(p.isArrayBufferView(t))return t.buffer;if(p.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let l;if(o){if(r.indexOf("application/x-www-form-urlencoded")>-1)return Qc(t,this.formSerializer).toString();if((l=p.isFileList(t))||r.indexOf("multipart/form-data")>-1){const u=this.env&&this.env.FormData;return hn(l?{"files[]":t}:t,u&&new u,this.formSerializer)}}return o||s?(n.setContentType("application/json",!1),tu(t)):t}],transformResponse:[function(t){const n=this.transitional||pn.transitional,r=n&&n.forcedJSONParsing,s=this.responseType==="json";if(t&&p.isString(t)&&(r&&!this.responseType||s)){const i=!(n&&n.silentJSONParsing)&&s;try{return JSON.parse(t)}catch(l){if(i)throw l.name==="SyntaxError"?U.from(l,U.ERR_BAD_RESPONSE,this,null,this.response):l}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Ee.classes.FormData,Blob:Ee.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};p.forEach(["delete","get","head"],function(t){pn.headers[t]={}});p.forEach(["post","put","patch"],function(t){pn.headers[t]=p.merge(eu)});const Er=pn,nu=p.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),ru=e=>{const t={};let n,r,s;return e&&e.split(` +`).forEach(function(i){s=i.indexOf(":"),n=i.substring(0,s).trim().toLowerCase(),r=i.substring(s+1).trim(),!(!n||t[n]&&nu[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},fs=Symbol("internals");function ht(e){return e&&String(e).trim().toLowerCase()}function zt(e){return e===!1||e==null?e:p.isArray(e)?e.map(zt):String(e)}function su(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}const ou=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function Nn(e,t,n,r,s){if(p.isFunction(r))return r.call(this,t,n);if(s&&(t=n),!!p.isString(t)){if(p.isString(r))return t.indexOf(r)!==-1;if(p.isRegExp(r))return r.test(t)}}function iu(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function lu(e,t){const n=p.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+n,{value:function(s,o,i){return this[r].call(this,t,s,o,i)},configurable:!0})})}class mn{constructor(t){t&&this.set(t)}set(t,n,r){const s=this;function o(l,u,f){const d=ht(u);if(!d)throw new Error("header name must be a non-empty string");const m=p.findKey(s,d);(!m||s[m]===void 0||f===!0||f===void 0&&s[m]!==!1)&&(s[m||u]=zt(l))}const i=(l,u)=>p.forEach(l,(f,d)=>o(f,d,u));return p.isPlainObject(t)||t instanceof this.constructor?i(t,n):p.isString(t)&&(t=t.trim())&&!ou(t)?i(ru(t),n):t!=null&&o(n,t,r),this}get(t,n){if(t=ht(t),t){const r=p.findKey(this,t);if(r){const s=this[r];if(!n)return s;if(n===!0)return su(s);if(p.isFunction(n))return n.call(this,s,r);if(p.isRegExp(n))return n.exec(s);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=ht(t),t){const r=p.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||Nn(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let s=!1;function o(i){if(i=ht(i),i){const l=p.findKey(r,i);l&&(!n||Nn(r,r[l],l,n))&&(delete r[l],s=!0)}}return p.isArray(t)?t.forEach(o):o(t),s}clear(t){const n=Object.keys(this);let r=n.length,s=!1;for(;r--;){const o=n[r];(!t||Nn(this,this[o],o,t,!0))&&(delete this[o],s=!0)}return s}normalize(t){const n=this,r={};return p.forEach(this,(s,o)=>{const i=p.findKey(r,o);if(i){n[i]=zt(s),delete n[o];return}const l=t?iu(o):String(o).trim();l!==o&&delete n[o],n[l]=zt(s),r[l]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return p.forEach(this,(r,s)=>{r!=null&&r!==!1&&(n[s]=t&&p.isArray(r)?r.join(", "):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` +`)}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const r=new this(t);return n.forEach(s=>r.set(s)),r}static accessor(t){const r=(this[fs]=this[fs]={accessors:{}}).accessors,s=this.prototype;function o(i){const l=ht(i);r[l]||(lu(s,i),r[l]=!0)}return p.isArray(t)?t.forEach(o):o(t),this}}mn.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);p.freezeMethods(mn.prototype);p.freezeMethods(mn);const Ae=mn;function In(e,t){const n=this||Er,r=t||n,s=Ae.from(r.headers);let o=r.data;return p.forEach(e,function(l){o=l.call(n,o,s.normalize(),t?t.status:void 0)}),s.normalize(),o}function wo(e){return!!(e&&e.__CANCEL__)}function St(e,t,n){U.call(this,e??"canceled",U.ERR_CANCELED,t,n),this.name="CanceledError"}p.inherits(St,U,{__CANCEL__:!0});function cu(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new U("Request failed with status code "+n.status,[U.ERR_BAD_REQUEST,U.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}const uu=Ee.isStandardBrowserEnv?function(){return{write:function(n,r,s,o,i,l){const u=[];u.push(n+"="+encodeURIComponent(r)),p.isNumber(s)&&u.push("expires="+new Date(s).toGMTString()),p.isString(o)&&u.push("path="+o),p.isString(i)&&u.push("domain="+i),l===!0&&u.push("secure"),document.cookie=u.join("; ")},read:function(n){const r=document.cookie.match(new RegExp("(^|;\\s*)("+n+")=([^;]*)"));return r?decodeURIComponent(r[3]):null},remove:function(n){this.write(n,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}();function fu(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function au(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}function xo(e,t){return e&&!fu(t)?au(e,t):t}const du=Ee.isStandardBrowserEnv?function(){const t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");let r;function s(o){let i=o;return t&&(n.setAttribute("href",i),i=n.href),n.setAttribute("href",i),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:n.pathname.charAt(0)==="/"?n.pathname:"/"+n.pathname}}return r=s(window.location.href),function(i){const l=p.isString(i)?s(i):i;return l.protocol===r.protocol&&l.host===r.host}}():function(){return function(){return!0}}();function hu(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function pu(e,t){e=e||10;const n=new Array(e),r=new Array(e);let s=0,o=0,i;return t=t!==void 0?t:1e3,function(u){const f=Date.now(),d=r[o];i||(i=f),n[s]=u,r[s]=f;let m=o,x=0;for(;m!==s;)x+=n[m++],m=m%e;if(s=(s+1)%e,s===o&&(o=(o+1)%e),f-i{const o=s.loaded,i=s.lengthComputable?s.total:void 0,l=o-n,u=r(l),f=o<=i;n=o;const d={loaded:o,total:i,progress:i?o/i:void 0,bytes:l,rate:u||void 0,estimated:u&&i&&f?(i-o)/u:void 0,event:s};d[t?"download":"upload"]=!0,e(d)}}const mu=typeof XMLHttpRequest<"u",gu=mu&&function(e){return new Promise(function(n,r){let s=e.data;const o=Ae.from(e.headers).normalize(),i=e.responseType;let l;function u(){e.cancelToken&&e.cancelToken.unsubscribe(l),e.signal&&e.signal.removeEventListener("abort",l)}p.isFormData(s)&&(Ee.isStandardBrowserEnv||Ee.isStandardBrowserWebWorkerEnv?o.setContentType(!1):o.setContentType("multipart/form-data;",!1));let f=new XMLHttpRequest;if(e.auth){const R=e.auth.username||"",O=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";o.set("Authorization","Basic "+btoa(R+":"+O))}const d=xo(e.baseURL,e.url);f.open(e.method.toUpperCase(),_o(d,e.params,e.paramsSerializer),!0),f.timeout=e.timeout;function m(){if(!f)return;const R=Ae.from("getAllResponseHeaders"in f&&f.getAllResponseHeaders()),A={data:!i||i==="text"||i==="json"?f.responseText:f.response,status:f.status,statusText:f.statusText,headers:R,config:e,request:f};cu(function(j){n(j),u()},function(j){r(j),u()},A),f=null}if("onloadend"in f?f.onloadend=m:f.onreadystatechange=function(){!f||f.readyState!==4||f.status===0&&!(f.responseURL&&f.responseURL.indexOf("file:")===0)||setTimeout(m)},f.onabort=function(){f&&(r(new U("Request aborted",U.ECONNABORTED,e,f)),f=null)},f.onerror=function(){r(new U("Network Error",U.ERR_NETWORK,e,f)),f=null},f.ontimeout=function(){let O=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded";const A=e.transitional||yo;e.timeoutErrorMessage&&(O=e.timeoutErrorMessage),r(new U(O,A.clarifyTimeoutError?U.ETIMEDOUT:U.ECONNABORTED,e,f)),f=null},Ee.isStandardBrowserEnv){const R=(e.withCredentials||du(d))&&e.xsrfCookieName&&uu.read(e.xsrfCookieName);R&&o.set(e.xsrfHeaderName,R)}s===void 0&&o.setContentType(null),"setRequestHeader"in f&&p.forEach(o.toJSON(),function(O,A){f.setRequestHeader(A,O)}),p.isUndefined(e.withCredentials)||(f.withCredentials=!!e.withCredentials),i&&i!=="json"&&(f.responseType=e.responseType),typeof e.onDownloadProgress=="function"&&f.addEventListener("progress",as(e.onDownloadProgress,!0)),typeof e.onUploadProgress=="function"&&f.upload&&f.upload.addEventListener("progress",as(e.onUploadProgress)),(e.cancelToken||e.signal)&&(l=R=>{f&&(r(!R||R.type?new St(null,e,f):R),f.abort(),f=null)},e.cancelToken&&e.cancelToken.subscribe(l),e.signal&&(e.signal.aborted?l():e.signal.addEventListener("abort",l)));const x=hu(d);if(x&&Ee.protocols.indexOf(x)===-1){r(new U("Unsupported protocol "+x+":",U.ERR_BAD_REQUEST,e));return}f.send(s||null)})},Wt={http:$c,xhr:gu};p.forEach(Wt,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const bu={getAdapter:e=>{e=p.isArray(e)?e:[e];const{length:t}=e;let n,r;for(let s=0;se instanceof Ae?e.toJSON():e;function st(e,t){t=t||{};const n={};function r(f,d,m){return p.isPlainObject(f)&&p.isPlainObject(d)?p.merge.call({caseless:m},f,d):p.isPlainObject(d)?p.merge({},d):p.isArray(d)?d.slice():d}function s(f,d,m){if(p.isUndefined(d)){if(!p.isUndefined(f))return r(void 0,f,m)}else return r(f,d,m)}function o(f,d){if(!p.isUndefined(d))return r(void 0,d)}function i(f,d){if(p.isUndefined(d)){if(!p.isUndefined(f))return r(void 0,f)}else return r(void 0,d)}function l(f,d,m){if(m in t)return r(f,d);if(m in e)return r(void 0,f)}const u={url:o,method:o,data:o,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:l,headers:(f,d)=>s(hs(f),hs(d),!0)};return p.forEach(Object.keys(Object.assign({},e,t)),function(d){const m=u[d]||s,x=m(e[d],t[d],d);p.isUndefined(x)&&m!==l||(n[d]=x)}),n}const Oo="1.4.0",wr={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{wr[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const ps={};wr.transitional=function(t,n,r){function s(o,i){return"[Axios v"+Oo+"] Transitional option '"+o+"'"+i+(r?". "+r:"")}return(o,i,l)=>{if(t===!1)throw new U(s(i," has been removed"+(n?" in "+n:"")),U.ERR_DEPRECATED);return n&&!ps[i]&&(ps[i]=!0,console.warn(s(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(o,i,l):!0}};function _u(e,t,n){if(typeof e!="object")throw new U("options must be an object",U.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let s=r.length;for(;s-- >0;){const o=r[s],i=t[o];if(i){const l=e[o],u=l===void 0||i(l,o,e);if(u!==!0)throw new U("option "+o+" must be "+u,U.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new U("Unknown option "+o,U.ERR_BAD_OPTION)}}const Vn={assertOptions:_u,validators:wr},Fe=Vn.validators;class Zt{constructor(t){this.defaults=t,this.interceptors={request:new us,response:new us}}request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=st(this.defaults,n);const{transitional:r,paramsSerializer:s,headers:o}=n;r!==void 0&&Vn.assertOptions(r,{silentJSONParsing:Fe.transitional(Fe.boolean),forcedJSONParsing:Fe.transitional(Fe.boolean),clarifyTimeoutError:Fe.transitional(Fe.boolean)},!1),s!=null&&(p.isFunction(s)?n.paramsSerializer={serialize:s}:Vn.assertOptions(s,{encode:Fe.function,serialize:Fe.function},!0)),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i;i=o&&p.merge(o.common,o[n.method]),i&&p.forEach(["delete","get","head","post","put","patch","common"],O=>{delete o[O]}),n.headers=Ae.concat(i,o);const l=[];let u=!0;this.interceptors.request.forEach(function(A){typeof A.runWhen=="function"&&A.runWhen(n)===!1||(u=u&&A.synchronous,l.unshift(A.fulfilled,A.rejected))});const f=[];this.interceptors.response.forEach(function(A){f.push(A.fulfilled,A.rejected)});let d,m=0,x;if(!u){const O=[ds.bind(this),void 0];for(O.unshift.apply(O,l),O.push.apply(O,f),x=O.length,d=Promise.resolve(n);m{if(!r._listeners)return;let o=r._listeners.length;for(;o-- >0;)r._listeners[o](s);r._listeners=null}),this.promise.then=s=>{let o;const i=new Promise(l=>{r.subscribe(l),o=l}).then(s);return i.cancel=function(){r.unsubscribe(o)},i},t(function(o,i,l){r.reason||(r.reason=new St(o,i,l),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}static source(){let t;return{token:new xr(function(s){t=s}),cancel:t}}}const yu=xr;function Eu(e){return function(n){return e.apply(null,n)}}function wu(e){return p.isObject(e)&&e.isAxiosError===!0}const Xn={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Xn).forEach(([e,t])=>{Xn[t]=e});const xu=Xn;function To(e){const t=new kt(e),n=oo(kt.prototype.request,t);return p.extend(n,kt.prototype,t,{allOwnKeys:!0}),p.extend(n,t,null,{allOwnKeys:!0}),n.create=function(s){return To(st(e,s))},n}const Y=To(Er);Y.Axios=kt;Y.CanceledError=St;Y.CancelToken=yu;Y.isCancel=wo;Y.VERSION=Oo;Y.toFormData=hn;Y.AxiosError=U;Y.Cancel=Y.CanceledError;Y.all=function(t){return Promise.all(t)};Y.spread=Eu;Y.isAxiosError=wu;Y.mergeConfig=st;Y.AxiosHeaders=Ae;Y.formToJSON=e=>Eo(p.isHTMLForm(e)?new FormData(e):e);Y.HttpStatusCode=xu;Y.default=Y;const Ou=Y,Tu=Ou.create({baseURL:"/api",timeout:15e3,headers:{"Content-Type":"application/json"}});class Au{getRecords(){return Tu.get("/test/index").then()}}const Ru=new Au;const Su=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n},Or=e=>(Ni("data-v-1d75a1d6"),e=e(),Ii(),e),Cu=Or(()=>Te("div",null,[Te("a",{href:"https://vitejs.dev",target:"_blank"},[Te("img",{src:oc,class:"logo",alt:"Vite logo"})]),Te("a",{href:"https://vuejs.org/",target:"_blank"},[Te("img",{src:ic,class:"logo vue",alt:"Vue logo"})])],-1)),Pu=Or(()=>Te("hr",null,null,-1)),Fu=Or(()=>Te("hr",null,null,-1)),Nu={__name:"App",setup(e){const t=bi([]);return Ru.getRecords().then(n=>{t.value=n.data}),(n,r)=>(Rn(),Sn(ue,null,[Cu,Pu,(Rn(!0),Sn(ue,null,el(t.value,s=>(Rn(),Sn("div",null,Ho(s),1))),256)),Fu],64))}},Iu=Su(Nu,[["__scopeId","data-v-1d75a1d6"]]),vu=rc(Iu);vu.mount("#app"); diff --git a/web/assets/vue-5532db34.svg b/web/assets/vue-5532db34.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/web/assets/vue-5532db34.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/favicon.ico b/web/favicon.ico new file mode 100644 index 0000000..580ed73 Binary files /dev/null and b/web/favicon.ico differ diff --git a/web/index-test.php b/web/index-test.php new file mode 100644 index 0000000..1ec192f --- /dev/null +++ b/web/index-test.php @@ -0,0 +1,16 @@ +run(); diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..39b76c4 --- /dev/null +++ b/web/index.html @@ -0,0 +1,15 @@ + + + + + + + Vite + Vue + + + + +
+ + + diff --git a/web/index.php b/web/index.php new file mode 100644 index 0000000..02d5e1d --- /dev/null +++ b/web/index.php @@ -0,0 +1,12 @@ +run(); diff --git a/web/robots.txt b/web/robots.txt new file mode 100644 index 0000000..6f27bb6 --- /dev/null +++ b/web/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: \ No newline at end of file diff --git a/web/vite.svg b/web/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/web/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/widgets/Alert.php b/widgets/Alert.php new file mode 100644 index 0000000..1302c1f --- /dev/null +++ b/widgets/Alert.php @@ -0,0 +1,73 @@ +session->setFlash('error', 'This is the message'); + * Yii::$app->session->setFlash('success', 'This is the message'); + * Yii::$app->session->setFlash('info', 'This is the message'); + * ``` + * + * Multiple messages could be set as follows: + * + * ```php + * Yii::$app->session->setFlash('error', ['Error 1', 'Error 2']); + * ``` + * + * @author Kartik Visweswaran + * @author Alexander Makarov + */ +class Alert extends \yii\bootstrap5\Widget +{ + /** + * @var array the alert types configuration for the flash messages. + * This array is setup as $key => $value, where: + * - key: the name of the session flash variable + * - value: the bootstrap alert type (i.e. danger, success, info, warning) + */ + public $alertTypes = [ + 'error' => 'alert-danger', + 'danger' => 'alert-danger', + 'success' => 'alert-success', + 'info' => 'alert-info', + 'warning' => 'alert-warning' + ]; + /** + * @var array the options for rendering the close button tag. + * Array will be passed to [[\yii\bootstrap\Alert::closeButton]]. + */ + public $closeButton = []; + + + /** + * {@inheritdoc} + */ + public function run() + { + $session = Yii::$app->session; + $appendClass = isset($this->options['class']) ? ' ' . $this->options['class'] : ''; + + foreach (array_keys($this->alertTypes) as $type) { + $flash = $session->getFlash($type); + + foreach ((array) $flash as $i => $message) { + echo \yii\bootstrap5\Alert::widget([ + 'body' => $message, + 'closeButton' => $this->closeButton, + 'options' => array_merge($this->options, [ + 'id' => $this->getId() . '-' . $type . '-' . $i, + 'class' => $this->alertTypes[$type] . $appendClass, + ]), + ]); + } + + $session->removeFlash($type); + } + } +} diff --git a/yii b/yii new file mode 100644 index 0000000..1d0008f --- /dev/null +++ b/yii @@ -0,0 +1,21 @@ +#!/usr/bin/env php +run(); +exit($exitCode); diff --git a/yii.bat b/yii.bat new file mode 100644 index 0000000..ce14c92 --- /dev/null +++ b/yii.bat @@ -0,0 +1,20 @@ +@echo off + +rem ------------------------------------------------------------- +rem Yii command line bootstrap script for Windows. +rem +rem @author Qiang Xue +rem @link https://www.yiiframework.com/ +rem @copyright Copyright (c) 2008 Yii Software LLC +rem @license https://www.yiiframework.com/license/ +rem ------------------------------------------------------------- + +@setlocal + +set YII_PATH=%~dp0 + +if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe + +"%PHP_COMMAND%" "%YII_PATH%yii" %* + +@endlocal