diff --git a/.gitignore b/.gitignore index 2408920c..e483d9d6 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,3 @@ .idea .vscode -/backend/nbproject/private/ \ No newline at end of file diff --git a/GatewayWorker_linux/Applications/YourApp/Events.php b/GatewayWorker_linux/Applications/YourApp/Events.php deleted file mode 100644 index 24987c9e..00000000 --- a/GatewayWorker_linux/Applications/YourApp/Events.php +++ /dev/null @@ -1,76 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -/** - * 用于检测业务代码死循环或者长时间阻塞等问题 - * 如果发现业务卡死,可以将下面declare打开(去掉//注释),并执行php start.php reload - * 然后观察一段时间workerman.log看是否有process_timeout异常 - */ -//declare(ticks=1); - -use \GatewayWorker\Lib\Gateway; - -/** - * 主逻辑 - * 主要是处理 onConnect onMessage onClose 三个方法 - * onConnect 和 onClose 如果不需要可以不用实现并删除 - */ -class Events -{ - /** - * 当客户端连接时触发 - * 如果业务不需此回调可以删除onConnect - * - * @param int $client_id 连接id - */ - public static function onConnect($client_id) - { - $data = [ - 'type' => 'init', - 'client_id' => $client_id - ]; - - Gateway::sendToClient($client_id,json_encode($data)); - } - - /** - * 当客户端发来消息时触发 - * @param int $client_id 连接id - * @param mixed $message 具体消息 - */ - public static function onMessage($client_id, $message) - { - // 向所有人发送 - - - $res = json_decode($message, true); - if ($res['type'] === 'ping'){ - // 心跳包 前端50秒发送一次 - } - - if ($res["msg"] === "gongzuo") { - Gateway::sendToClient($client_id, "gongzuo"); - } - } - - /** - * 当用户断开连接时触发 - * @param int $client_id 连接id - */ - public static function onClose($client_id) - { - // 向所有人发送 - // GateWay::sendToAll("$client_id logout\r\n"); - } -} diff --git a/GatewayWorker_linux/Applications/YourApp/start_businessworker.php b/GatewayWorker_linux/Applications/YourApp/start_businessworker.php deleted file mode 100644 index c77c49b4..00000000 --- a/GatewayWorker_linux/Applications/YourApp/start_businessworker.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -use \Workerman\Worker; -use \Workerman\WebServer; -use \GatewayWorker\Gateway; -use \GatewayWorker\BusinessWorker; -use \Workerman\Autoloader; - -// 自动加载类 -require_once __DIR__ . '/../../vendor/autoload.php'; - -// bussinessWorker 进程 -$worker = new BusinessWorker(); -// worker名称 -$worker->name = 'YourAppBusinessWorker'; -// bussinessWorker进程数量 -$worker->count = 4; -// 服务注册地址 -$worker->registerAddress = '127.0.0.1:1680'; - -// 如果不是在根目录启动,则运行runAll方法 -if(!defined('GLOBAL_START')) -{ - Worker::runAll(); -} - diff --git a/GatewayWorker_linux/Applications/YourApp/start_gateway.php b/GatewayWorker_linux/Applications/YourApp/start_gateway.php deleted file mode 100644 index b3b9a4de..00000000 --- a/GatewayWorker_linux/Applications/YourApp/start_gateway.php +++ /dev/null @@ -1,65 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -use \Workerman\Worker; -use \Workerman\WebServer; -use \GatewayWorker\Gateway; -use \GatewayWorker\BusinessWorker; -use \Workerman\Autoloader; - -// 自动加载类 -require_once __DIR__ . '/../../vendor/autoload.php'; - -// gateway 进程,这里使用Text协议,可以用telnet测试 -$gateway = new Gateway("websocket://0.0.0.0:1800"); -// gateway名称,status方便查看 -$gateway->name = 'YourAppGateway'; -// gateway进程数 -$gateway->count = 4; -// 本机ip,分布式部署时使用内网ip -$gateway->lanIp = '127.0.0.1'; -// 内部通讯起始端口,假如$gateway->count=4,起始端口为4000 -// 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口 -$gateway->startPort = 2900; -// 服务注册地址 -$gateway->registerAddress = '127.0.0.1:1680'; - -// 心跳间隔 -//$gateway->pingInterval = 10; -// 心跳数据 -//$gateway->pingData = '{"type":"ping"}'; - -/* -// 当客户端连接上来时,设置连接的onWebSocketConnect,即在websocket握手时的回调 -$gateway->onConnect = function($connection) -{ - $connection->onWebSocketConnect = function($connection , $http_header) - { - // 可以在这里判断连接来源是否合法,不合法就关掉连接 - // $_SERVER['HTTP_ORIGIN']标识来自哪个站点的页面发起的websocket链接 - if($_SERVER['HTTP_ORIGIN'] != 'http://kedou.workerman.net') - { - $connection->close(); - } - // onWebSocketConnect 里面$_GET $_SERVER是可用的 - // var_dump($_GET, $_SERVER); - }; -}; -*/ - -// 如果不是在根目录启动,则运行runAll方法 -if(!defined('GLOBAL_START')) -{ - Worker::runAll(); -} - diff --git a/GatewayWorker_linux/Applications/YourApp/start_register.php b/GatewayWorker_linux/Applications/YourApp/start_register.php deleted file mode 100644 index ccc3774f..00000000 --- a/GatewayWorker_linux/Applications/YourApp/start_register.php +++ /dev/null @@ -1,28 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -use \Workerman\Worker; -use \GatewayWorker\Register; - -// 自动加载类 -require_once __DIR__ . '/../../vendor/autoload.php'; - -// register 必须是text协议 -$register = new Register('text://0.0.0.0:1680'); - -// 如果不是在根目录启动,则运行runAll方法 -if(!defined('GLOBAL_START')) -{ - Worker::runAll(); -} - diff --git a/GatewayWorker_linux/MIT-LICENSE.txt b/GatewayWorker_linux/MIT-LICENSE.txt deleted file mode 100644 index fd6b1c83..00000000 --- a/GatewayWorker_linux/MIT-LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License - -Copyright (c) 2009-2015 walkor and contributors (see https://github.com/walkor/workerman/contributors) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/GatewayWorker_linux/README.md b/GatewayWorker_linux/README.md deleted file mode 100644 index 34f44c8c..00000000 --- a/GatewayWorker_linux/README.md +++ /dev/null @@ -1,46 +0,0 @@ -GatewayWorker windows 版本 -================= - -GatewayWorker基于[Workerman](https://github.com/walkor/Workerman)开发的一个项目框架,用于快速开发长连接应用,例如app推送服务端、即时IM服务端、游戏服务端、物联网、智能家居等等。 - -GatewayWorker使用经典的Gateway和Worker进程模型。Gateway进程负责维持客户端连接,并转发客户端的数据给Worker进程处理;Worker进程负责处理实际的业务逻辑,并将结果推送给对应的客户端。Gateway服务和Worker服务可以分开部署在不同的服务器上,实现分布式集群。 - -GatewayWorker提供非常方便的API,可以全局广播数据、可以向某个群体广播数据、也可以向某个特定客户端推送数据。配合Workerman的定时器,也可以定时推送数据。 - -GatewayWorker Linux 版本 -====================== -Linux 版本GatewayWorker 在这里 https://github.com/walkor/GatewayWorker - -启动 -======= -双击start_for_win.bat - -Applications\YourApp测试方法 -====== -使用telnet命令测试(不要使用windows自带的telnet) -```shell - telnet 127.0.0.1 8282 -Trying 127.0.0.1... -Connected to 127.0.0.1. -Escape character is '^]'. -Hello 3 -3 login -haha -3 said haha -``` - -手册 -======= -http://www.workerman.net/gatewaydoc/ - -使用GatewayWorker-for-win开发的项目 -======= -## [tadpole](http://kedou.workerman.net/) -[Live demo](http://kedou.workerman.net/) -[Source code](https://github.com/walkor/workerman) -![workerman-todpole](http://www.workerman.net/img/workerman-todpole.png) - -## [chat room](http://chat.workerman.net/) -[Live demo](http://chat.workerman.net/) -[Source code](https://github.com/walkor/workerman-chat) -![workerman-chat](http://www.workerman.net/img/workerman-chat.png) diff --git a/GatewayWorker_linux/composer.json b/GatewayWorker_linux/composer.json deleted file mode 100644 index 2372adc7..00000000 --- a/GatewayWorker_linux/composer.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name" : "workerman/gateway-worker-demo", - "keywords": ["distributed","communication"], - "homepage": "http://www.workerman.net", - "license" : "MIT", - "require": { - "workerman/gateway-worker" : ">=3.0.0" - }, - "autoload": { - "psr-4": { - "" : "./" - } - } -} diff --git a/GatewayWorker_linux/start.php b/GatewayWorker_linux/start.php deleted file mode 100644 index 410c580c..00000000 --- a/GatewayWorker_linux/start.php +++ /dev/null @@ -1,37 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -/** - * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. - * - * $loader = new \Composer\Autoload\ClassLoader(); - * - * // register classes with namespaces - * $loader->add('Symfony\Component', __DIR__.'/component'); - * $loader->add('Symfony', __DIR__.'/framework'); - * - * // activate the autoloader - * $loader->register(); - * - * // to enable searching the include path (eg. for PEAR packages) - * $loader->setUseIncludePath(true); - * - * In this example, if you try to use a class in the Symfony\Component - * namespace or one of its children (Symfony\Component\Console for instance), - * the autoloader will first look for the class under the component/ - * directory, and it will then fallback to the framework/ directory if not - * found before giving up. - * - * This class is loosely based on the Symfony UniversalClassLoader. - * - * @author Fabien Potencier - * @author Jordi Boggiano - * @see https://www.php-fig.org/psr/psr-0/ - * @see https://www.php-fig.org/psr/psr-4/ - */ -class ClassLoader -{ - /** @var ?string */ - private $vendorDir; - - // PSR-4 - /** - * @var array[] - * @psalm-var array> - */ - private $prefixLengthsPsr4 = array(); - /** - * @var array[] - * @psalm-var array> - */ - private $prefixDirsPsr4 = array(); - /** - * @var array[] - * @psalm-var array - */ - private $fallbackDirsPsr4 = array(); - - // PSR-0 - /** - * @var array[] - * @psalm-var array> - */ - private $prefixesPsr0 = array(); - /** - * @var array[] - * @psalm-var array - */ - private $fallbackDirsPsr0 = array(); - - /** @var bool */ - private $useIncludePath = false; - - /** - * @var string[] - * @psalm-var array - */ - private $classMap = array(); - - /** @var bool */ - private $classMapAuthoritative = false; - - /** - * @var bool[] - * @psalm-var array - */ - private $missingClasses = array(); - - /** @var ?string */ - private $apcuPrefix; - - /** - * @var self[] - */ - private static $registeredLoaders = array(); - - /** - * @param ?string $vendorDir - */ - public function __construct($vendorDir = null) - { - $this->vendorDir = $vendorDir; - } - - /** - * @return string[] - */ - public function getPrefixes() - { - if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); - } - - return array(); - } - - /** - * @return array[] - * @psalm-return array> - */ - public function getPrefixesPsr4() - { - return $this->prefixDirsPsr4; - } - - /** - * @return array[] - * @psalm-return array - */ - public function getFallbackDirs() - { - return $this->fallbackDirsPsr0; - } - - /** - * @return array[] - * @psalm-return array - */ - public function getFallbackDirsPsr4() - { - return $this->fallbackDirsPsr4; - } - - /** - * @return string[] Array of classname => path - * @psalm-var array - */ - public function getClassMap() - { - return $this->classMap; - } - - /** - * @param string[] $classMap Class to filename map - * @psalm-param array $classMap - * - * @return void - */ - public function addClassMap(array $classMap) - { - if ($this->classMap) { - $this->classMap = array_merge($this->classMap, $classMap); - } else { - $this->classMap = $classMap; - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, either - * appending or prepending to the ones previously set for this prefix. - * - * @param string $prefix The prefix - * @param string[]|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - * - * @return void - */ - public function add($prefix, $paths, $prepend = false) - { - if (!$prefix) { - if ($prepend) { - $this->fallbackDirsPsr0 = array_merge( - (array) $paths, - $this->fallbackDirsPsr0 - ); - } else { - $this->fallbackDirsPsr0 = array_merge( - $this->fallbackDirsPsr0, - (array) $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; - - return; - } - if ($prepend) { - $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, - $this->prefixesPsr0[$first][$prefix] - ); - } else { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $this->prefixesPsr0[$first][$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, either - * appending or prepending to the ones previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param string[]|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories - * - * @throws \InvalidArgumentException - * - * @return void - */ - public function addPsr4($prefix, $paths, $prepend = false) - { - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - $this->fallbackDirsPsr4 = array_merge( - (array) $paths, - $this->fallbackDirsPsr4 - ); - } else { - $this->fallbackDirsPsr4 = array_merge( - $this->fallbackDirsPsr4, - (array) $paths - ); - } - } elseif (!isset($this->prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, - $this->prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $this->prefixDirsPsr4[$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, - * replacing any others previously set for this prefix. - * - * @param string $prefix The prefix - * @param string[]|string $paths The PSR-0 base directories - * - * @return void - */ - public function set($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr0 = (array) $paths; - } else { - $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, - * replacing any others previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param string[]|string $paths The PSR-4 base directories - * - * @throws \InvalidArgumentException - * - * @return void - */ - public function setPsr4($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr4 = (array) $paths; - } else { - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } - } - - /** - * Turns on searching the include path for class files. - * - * @param bool $useIncludePath - * - * @return void - */ - public function setUseIncludePath($useIncludePath) - { - $this->useIncludePath = $useIncludePath; - } - - /** - * Can be used to check if the autoloader uses the include path to check - * for classes. - * - * @return bool - */ - public function getUseIncludePath() - { - return $this->useIncludePath; - } - - /** - * Turns off searching the prefix and fallback directories for classes - * that have not been registered with the class map. - * - * @param bool $classMapAuthoritative - * - * @return void - */ - public function setClassMapAuthoritative($classMapAuthoritative) - { - $this->classMapAuthoritative = $classMapAuthoritative; - } - - /** - * Should class lookup fail if not found in the current class map? - * - * @return bool - */ - public function isClassMapAuthoritative() - { - return $this->classMapAuthoritative; - } - - /** - * APCu prefix to use to cache found/not-found classes, if the extension is enabled. - * - * @param string|null $apcuPrefix - * - * @return void - */ - public function setApcuPrefix($apcuPrefix) - { - $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; - } - - /** - * The APCu prefix in use, or null if APCu caching is not enabled. - * - * @return string|null - */ - public function getApcuPrefix() - { - return $this->apcuPrefix; - } - - /** - * Registers this instance as an autoloader. - * - * @param bool $prepend Whether to prepend the autoloader or not - * - * @return void - */ - public function register($prepend = false) - { - spl_autoload_register(array($this, 'loadClass'), true, $prepend); - - if (null === $this->vendorDir) { - return; - } - - if ($prepend) { - self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; - } else { - unset(self::$registeredLoaders[$this->vendorDir]); - self::$registeredLoaders[$this->vendorDir] = $this; - } - } - - /** - * Unregisters this instance as an autoloader. - * - * @return void - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - - if (null !== $this->vendorDir) { - unset(self::$registeredLoaders[$this->vendorDir]); - } - } - - /** - * Loads the given class or interface. - * - * @param string $class The name of the class - * @return true|null True if loaded, null otherwise - */ - public function loadClass($class) - { - if ($file = $this->findFile($class)) { - includeFile($file); - - return true; - } - - return null; - } - - /** - * Finds the path to the file where the class is defined. - * - * @param string $class The name of the class - * - * @return string|false The path if found, false otherwise - */ - public function findFile($class) - { - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { - return false; - } - if (null !== $this->apcuPrefix) { - $file = apcu_fetch($this->apcuPrefix.$class, $hit); - if ($hit) { - return $file; - } - } - - $file = $this->findFileWithExtension($class, '.php'); - - // Search for Hack files if we are running on HHVM - if (false === $file && defined('HHVM_VERSION')) { - $file = $this->findFileWithExtension($class, '.hh'); - } - - if (null !== $this->apcuPrefix) { - apcu_add($this->apcuPrefix.$class, $file); - } - - if (false === $file) { - // Remember that this class does not exist. - $this->missingClasses[$class] = true; - } - - return $file; - } - - /** - * Returns the currently registered loaders indexed by their corresponding vendor directories. - * - * @return self[] - */ - public static function getRegisteredLoaders() - { - return self::$registeredLoaders; - } - - /** - * @param string $class - * @param string $ext - * @return string|false - */ - private function findFileWithExtension($class, $ext) - { - // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; - - $first = $class[0]; - if (isset($this->prefixLengthsPsr4[$first])) { - $subPath = $class; - while (false !== $lastPos = strrpos($subPath, '\\')) { - $subPath = substr($subPath, 0, $lastPos); - $search = $subPath . '\\'; - if (isset($this->prefixDirsPsr4[$search])) { - $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); - foreach ($this->prefixDirsPsr4[$search] as $dir) { - if (file_exists($file = $dir . $pathEnd)) { - return $file; - } - } - } - } - } - - // PSR-4 fallback dirs - foreach ($this->fallbackDirsPsr4 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { - return $file; - } - } - - // PSR-0 lookup - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; - } - - if (isset($this->prefixesPsr0[$first])) { - foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // PSR-0 fallback dirs - foreach ($this->fallbackDirsPsr0 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - - // PSR-0 include paths. - if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { - return $file; - } - - return false; - } -} - -/** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - * - * @param string $file - * @return void - * @private - */ -function includeFile($file) -{ - include $file; -} diff --git a/GatewayWorker_linux/vendor/composer/InstalledVersions.php b/GatewayWorker_linux/vendor/composer/InstalledVersions.php deleted file mode 100644 index d50e0c9f..00000000 --- a/GatewayWorker_linux/vendor/composer/InstalledVersions.php +++ /dev/null @@ -1,350 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer; - -use Composer\Autoload\ClassLoader; -use Composer\Semver\VersionParser; - -/** - * This class is copied in every Composer installed project and available to all - * - * See also https://getcomposer.org/doc/07-runtime.md#installed-versions - * - * To require its presence, you can require `composer-runtime-api ^2.0` - */ -class InstalledVersions -{ - /** - * @var mixed[]|null - * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array}|array{}|null - */ - private static $installed; - - /** - * @var bool|null - */ - private static $canGetVendors; - - /** - * @var array[] - * @psalm-var array}> - */ - private static $installedByVendor = array(); - - /** - * Returns a list of all package names which are present, either by being installed, replaced or provided - * - * @return string[] - * @psalm-return list - */ - public static function getInstalledPackages() - { - $packages = array(); - foreach (self::getInstalled() as $installed) { - $packages[] = array_keys($installed['versions']); - } - - if (1 === \count($packages)) { - return $packages[0]; - } - - return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); - } - - /** - * Returns a list of all package names with a specific type e.g. 'library' - * - * @param string $type - * @return string[] - * @psalm-return list - */ - public static function getInstalledPackagesByType($type) - { - $packagesByType = array(); - - foreach (self::getInstalled() as $installed) { - foreach ($installed['versions'] as $name => $package) { - if (isset($package['type']) && $package['type'] === $type) { - $packagesByType[] = $name; - } - } - } - - return $packagesByType; - } - - /** - * Checks whether the given package is installed - * - * This also returns true if the package name is provided or replaced by another package - * - * @param string $packageName - * @param bool $includeDevRequirements - * @return bool - */ - public static function isInstalled($packageName, $includeDevRequirements = true) - { - foreach (self::getInstalled() as $installed) { - if (isset($installed['versions'][$packageName])) { - return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']); - } - } - - return false; - } - - /** - * Checks whether the given package satisfies a version constraint - * - * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: - * - * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') - * - * @param VersionParser $parser Install composer/semver to have access to this class and functionality - * @param string $packageName - * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package - * @return bool - */ - public static function satisfies(VersionParser $parser, $packageName, $constraint) - { - $constraint = $parser->parseConstraints($constraint); - $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); - - return $provided->matches($constraint); - } - - /** - * Returns a version constraint representing all the range(s) which are installed for a given package - * - * It is easier to use this via isInstalled() with the $constraint argument if you need to check - * whether a given version of a package is installed, and not just whether it exists - * - * @param string $packageName - * @return string Version constraint usable with composer/semver - */ - public static function getVersionRanges($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - $ranges = array(); - if (isset($installed['versions'][$packageName]['pretty_version'])) { - $ranges[] = $installed['versions'][$packageName]['pretty_version']; - } - if (array_key_exists('aliases', $installed['versions'][$packageName])) { - $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); - } - if (array_key_exists('replaced', $installed['versions'][$packageName])) { - $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); - } - if (array_key_exists('provided', $installed['versions'][$packageName])) { - $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); - } - - return implode(' || ', $ranges); - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present - */ - public static function getVersion($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - if (!isset($installed['versions'][$packageName]['version'])) { - return null; - } - - return $installed['versions'][$packageName]['version']; - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present - */ - public static function getPrettyVersion($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - if (!isset($installed['versions'][$packageName]['pretty_version'])) { - return null; - } - - return $installed['versions'][$packageName]['pretty_version']; - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference - */ - public static function getReference($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - if (!isset($installed['versions'][$packageName]['reference'])) { - return null; - } - - return $installed['versions'][$packageName]['reference']; - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. - */ - public static function getInstallPath($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @return array - * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string} - */ - public static function getRootPackage() - { - $installed = self::getInstalled(); - - return $installed[0]['root']; - } - - /** - * Returns the raw installed.php data for custom implementations - * - * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. - * @return array[] - * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array} - */ - public static function getRawData() - { - @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); - - if (null === self::$installed) { - // only require the installed.php file if this file is loaded from its dumped location, - // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 - if (substr(__DIR__, -8, 1) !== 'C') { - self::$installed = include __DIR__ . '/installed.php'; - } else { - self::$installed = array(); - } - } - - return self::$installed; - } - - /** - * Returns the raw data of all installed.php which are currently loaded for custom implementations - * - * @return array[] - * @psalm-return list}> - */ - public static function getAllRawData() - { - return self::getInstalled(); - } - - /** - * Lets you reload the static array from another file - * - * This is only useful for complex integrations in which a project needs to use - * this class but then also needs to execute another project's autoloader in process, - * and wants to ensure both projects have access to their version of installed.php. - * - * A typical case would be PHPUnit, where it would need to make sure it reads all - * the data it needs from this class, then call reload() with - * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure - * the project in which it runs can then also use this class safely, without - * interference between PHPUnit's dependencies and the project's dependencies. - * - * @param array[] $data A vendor/composer/installed.php data set - * @return void - * - * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array} $data - */ - public static function reload($data) - { - self::$installed = $data; - self::$installedByVendor = array(); - } - - /** - * @return array[] - * @psalm-return list}> - */ - private static function getInstalled() - { - if (null === self::$canGetVendors) { - self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); - } - - $installed = array(); - - if (self::$canGetVendors) { - foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { - if (isset(self::$installedByVendor[$vendorDir])) { - $installed[] = self::$installedByVendor[$vendorDir]; - } elseif (is_file($vendorDir.'/composer/installed.php')) { - $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; - if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { - self::$installed = $installed[count($installed) - 1]; - } - } - } - } - - if (null === self::$installed) { - // only require the installed.php file if this file is loaded from its dumped location, - // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 - if (substr(__DIR__, -8, 1) !== 'C') { - self::$installed = require __DIR__ . '/installed.php'; - } else { - self::$installed = array(); - } - } - $installed[] = self::$installed; - - return $installed; - } -} diff --git a/GatewayWorker_linux/vendor/composer/LICENSE b/GatewayWorker_linux/vendor/composer/LICENSE deleted file mode 100644 index f27399a0..00000000 --- a/GatewayWorker_linux/vendor/composer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - -Copyright (c) Nils Adermann, Jordi Boggiano - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - diff --git a/GatewayWorker_linux/vendor/composer/autoload_classmap.php b/GatewayWorker_linux/vendor/composer/autoload_classmap.php deleted file mode 100644 index b26f1b13..00000000 --- a/GatewayWorker_linux/vendor/composer/autoload_classmap.php +++ /dev/null @@ -1,10 +0,0 @@ - $vendorDir . '/composer/InstalledVersions.php', -); diff --git a/GatewayWorker_linux/vendor/composer/autoload_namespaces.php b/GatewayWorker_linux/vendor/composer/autoload_namespaces.php deleted file mode 100644 index b7fc0125..00000000 --- a/GatewayWorker_linux/vendor/composer/autoload_namespaces.php +++ /dev/null @@ -1,9 +0,0 @@ - array($vendorDir . '/workerman/workerman'), - 'GatewayWorker\\' => array($vendorDir . '/workerman/gateway-worker/src'), -); diff --git a/GatewayWorker_linux/vendor/composer/autoload_real.php b/GatewayWorker_linux/vendor/composer/autoload_real.php deleted file mode 100644 index 44b189b2..00000000 --- a/GatewayWorker_linux/vendor/composer/autoload_real.php +++ /dev/null @@ -1,57 +0,0 @@ -= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); - if ($useStaticLoader) { - require __DIR__ . '/autoload_static.php'; - - call_user_func(\Composer\Autoload\ComposerStaticInit8f3411af7a7a58e545cca1dc386d93c8::getInitializer($loader)); - } else { - $map = require __DIR__ . '/autoload_namespaces.php'; - foreach ($map as $namespace => $path) { - $loader->set($namespace, $path); - } - - $map = require __DIR__ . '/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - $loader->setPsr4($namespace, $path); - } - - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); - } - } - - $loader->register(true); - - return $loader; - } -} diff --git a/GatewayWorker_linux/vendor/composer/autoload_static.php b/GatewayWorker_linux/vendor/composer/autoload_static.php deleted file mode 100644 index b24ff15b..00000000 --- a/GatewayWorker_linux/vendor/composer/autoload_static.php +++ /dev/null @@ -1,44 +0,0 @@ - - array ( - 'Workerman\\' => 10, - ), - 'G' => - array ( - 'GatewayWorker\\' => 14, - ), - ); - - public static $prefixDirsPsr4 = array ( - 'Workerman\\' => - array ( - 0 => __DIR__ . '/..' . '/workerman/workerman', - ), - 'GatewayWorker\\' => - array ( - 0 => __DIR__ . '/..' . '/workerman/gateway-worker/src', - ), - ); - - public static $classMap = array ( - 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', - ); - - public static function getInitializer(ClassLoader $loader) - { - return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit8f3411af7a7a58e545cca1dc386d93c8::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit8f3411af7a7a58e545cca1dc386d93c8::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInit8f3411af7a7a58e545cca1dc386d93c8::$classMap; - - }, null, ClassLoader::class); - } -} diff --git a/GatewayWorker_linux/vendor/composer/installed.json b/GatewayWorker_linux/vendor/composer/installed.json deleted file mode 100644 index 03e3b015..00000000 --- a/GatewayWorker_linux/vendor/composer/installed.json +++ /dev/null @@ -1,135 +0,0 @@ -{ - "packages": [ - { - "name": "workerman/gateway-worker", - "version": "v3.0.22", - "version_normalized": "3.0.22.0", - "source": { - "type": "git", - "url": "https://github.com/walkor/GatewayWorker.git", - "reference": "a615036c482d11f68b693998575e804752ef9068" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/walkor/GatewayWorker/zipball/a615036c482d11f68b693998575e804752ef9068", - "reference": "a615036c482d11f68b693998575e804752ef9068", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "workerman/workerman": ">=3.5.0" - }, - "time": "2021-12-23T13:13:09+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "GatewayWorker\\": "./src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "homepage": "http://www.workerman.net", - "keywords": [ - "communication", - "distributed" - ], - "support": { - "issues": "https://github.com/walkor/GatewayWorker/issues", - "source": "https://github.com/walkor/GatewayWorker/tree/v3.0.22" - }, - "funding": [ - { - "url": "https://opencollective.com/walkor", - "type": "open_collective" - }, - { - "url": "https://www.patreon.com/walkor", - "type": "patreon" - } - ], - "install-path": "../workerman/gateway-worker" - }, - { - "name": "workerman/workerman", - "version": "v4.0.27", - "version_normalized": "4.0.27.0", - "source": { - "type": "git", - "url": "https://github.com/walkor/workerman.git", - "reference": "d2787647c2bca724248ae6d1e3bb717c2be69be4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/walkor/workerman/zipball/d2787647c2bca724248ae6d1e3bb717c2be69be4", - "reference": "d2787647c2bca724248ae6d1e3bb717c2be69be4", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.3" - }, - "suggest": { - "ext-event": "For better performance. " - }, - "time": "2022-02-10T14:20:14+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Workerman\\": "./" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "walkor", - "email": "walkor@workerman.net", - "homepage": "http://www.workerman.net", - "role": "Developer" - } - ], - "description": "An asynchronous event driven PHP framework for easily building fast, scalable network applications.", - "homepage": "http://www.workerman.net", - "keywords": [ - "asynchronous", - "event-loop" - ], - "support": { - "email": "walkor@workerman.net", - "forum": "http://wenda.workerman.net/", - "issues": "https://github.com/walkor/workerman/issues", - "source": "https://github.com/walkor/workerman", - "wiki": "http://doc.workerman.net/" - }, - "funding": [ - { - "url": "https://opencollective.com/workerman", - "type": "open_collective" - }, - { - "url": "https://www.patreon.com/walkor", - "type": "patreon" - } - ], - "install-path": "../workerman/workerman" - } - ], - "dev": true, - "dev-package-names": [] -} diff --git a/GatewayWorker_linux/vendor/composer/installed.php b/GatewayWorker_linux/vendor/composer/installed.php deleted file mode 100644 index 9aa8150f..00000000 --- a/GatewayWorker_linux/vendor/composer/installed.php +++ /dev/null @@ -1,41 +0,0 @@ - array( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'type' => 'library', - 'install_path' => __DIR__ . '/../../', - 'aliases' => array(), - 'reference' => 'f25e0211031b035d64f6eed5f4477ac32b430e4b', - 'name' => '__root__', - 'dev' => true, - ), - 'versions' => array( - '__root__' => array( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'type' => 'library', - 'install_path' => __DIR__ . '/../../', - 'aliases' => array(), - 'reference' => 'f25e0211031b035d64f6eed5f4477ac32b430e4b', - 'dev_requirement' => false, - ), - 'workerman/gateway-worker' => array( - 'pretty_version' => 'v3.0.22', - 'version' => '3.0.22.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../workerman/gateway-worker', - 'aliases' => array(), - 'reference' => 'a615036c482d11f68b693998575e804752ef9068', - 'dev_requirement' => false, - ), - 'workerman/workerman' => array( - 'pretty_version' => 'v4.0.27', - 'version' => '4.0.27.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../workerman/workerman', - 'aliases' => array(), - 'reference' => 'd2787647c2bca724248ae6d1e3bb717c2be69be4', - 'dev_requirement' => false, - ), - ), -); diff --git a/GatewayWorker_linux/vendor/composer/platform_check.php b/GatewayWorker_linux/vendor/composer/platform_check.php deleted file mode 100644 index 7621d4ff..00000000 --- a/GatewayWorker_linux/vendor/composer/platform_check.php +++ /dev/null @@ -1,26 +0,0 @@ -= 50300)) { - $issues[] = 'Your Composer dependencies require a PHP version ">= 5.3.0". You are running ' . PHP_VERSION . '.'; -} - -if ($issues) { - if (!headers_sent()) { - header('HTTP/1.1 500 Internal Server Error'); - } - if (!ini_get('display_errors')) { - if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { - fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); - } elseif (!headers_sent()) { - echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; - } - } - trigger_error( - 'Composer detected issues in your platform: ' . implode(' ', $issues), - E_USER_ERROR - ); -} diff --git a/GatewayWorker_linux/vendor/workerman/gateway-worker/.github/FUNDING.yml b/GatewayWorker_linux/vendor/workerman/gateway-worker/.github/FUNDING.yml deleted file mode 100644 index 3d88b8d3..00000000 --- a/GatewayWorker_linux/vendor/workerman/gateway-worker/.github/FUNDING.yml +++ /dev/null @@ -1,4 +0,0 @@ -# These are supported funding model platforms - -open_collective: walkor -patreon: walkor diff --git a/GatewayWorker_linux/vendor/workerman/gateway-worker/.gitignore b/GatewayWorker_linux/vendor/workerman/gateway-worker/.gitignore deleted file mode 100644 index 8cb44419..00000000 --- a/GatewayWorker_linux/vendor/workerman/gateway-worker/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.buildpath -.project -.settings -.idea \ No newline at end of file diff --git a/GatewayWorker_linux/vendor/workerman/gateway-worker/MIT-LICENSE.txt b/GatewayWorker_linux/vendor/workerman/gateway-worker/MIT-LICENSE.txt deleted file mode 100644 index fd6b1c83..00000000 --- a/GatewayWorker_linux/vendor/workerman/gateway-worker/MIT-LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License - -Copyright (c) 2009-2015 walkor and contributors (see https://github.com/walkor/workerman/contributors) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/GatewayWorker_linux/vendor/workerman/gateway-worker/README.md b/GatewayWorker_linux/vendor/workerman/gateway-worker/README.md deleted file mode 100644 index a1365a57..00000000 --- a/GatewayWorker_linux/vendor/workerman/gateway-worker/README.md +++ /dev/null @@ -1,38 +0,0 @@ -GatewayWorker -================= - -GatewayWorker基于[Workerman](https://github.com/walkor/Workerman)开发的一个项目框架,用于快速开发长连接应用,例如app推送服务端、即时IM服务端、游戏服务端、物联网、智能家居等等。 - -GatewayWorker使用经典的Gateway和Worker进程模型。Gateway进程负责维持客户端连接,并转发客户端的数据给Worker进程处理;Worker进程负责处理实际的业务逻辑,并将结果推送给对应的客户端。Gateway服务和Worker服务可以分开部署在不同的服务器上,实现分布式集群。 - -GatewayWorker提供非常方便的API,可以全局广播数据、可以向某个群体广播数据、也可以向某个特定客户端推送数据。配合Workerman的定时器,也可以定时推送数据。 - -快速开始 -====== -开发者可以从一个简单的demo开始(demo中包含了GatewayWorker内核,以及start_gateway.php start_business.php等启动入口文件)
-[点击这里下载demo](http://www.workerman.net/download/GatewayWorker.zip)。
-demo说明见源码readme。 - -手册 -======= -http://www.workerman.net/gatewaydoc/ - -安装内核 -======= - -只安装GatewayWorker内核文件(不包含start_gateway.php start_businessworker.php等启动入口文件) -``` -composer require workerman/gateway-worker -``` - -使用GatewayWorker开发的项目 -======= -## [tadpole](http://kedou.workerman.net/) -[Live demo](http://kedou.workerman.net/) -[Source code](https://github.com/walkor/workerman) -![workerman todpole](http://www.workerman.net/img/workerman-todpole.png) - -## [chat room](http://chat.workerman.net/) -[Live demo](http://chat.workerman.net/) -[Source code](https://github.com/walkor/workerman-chat) -![workerman-chat](http://www.workerman.net/img/workerman-chat.png) diff --git a/GatewayWorker_linux/vendor/workerman/gateway-worker/composer.json b/GatewayWorker_linux/vendor/workerman/gateway-worker/composer.json deleted file mode 100644 index 5438c49b..00000000 --- a/GatewayWorker_linux/vendor/workerman/gateway-worker/composer.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name" : "workerman/gateway-worker", - "keywords": ["distributed","communication"], - "homepage": "http://www.workerman.net", - "license" : "MIT", - "require": { - "workerman/workerman" : ">=3.5.0" - }, - "autoload": { - "psr-4": {"GatewayWorker\\": "./src"} - } -} diff --git a/GatewayWorker_linux/vendor/workerman/gateway-worker/src/BusinessWorker.php b/GatewayWorker_linux/vendor/workerman/gateway-worker/src/BusinessWorker.php deleted file mode 100644 index a7b665ec..00000000 --- a/GatewayWorker_linux/vendor/workerman/gateway-worker/src/BusinessWorker.php +++ /dev/null @@ -1,565 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace GatewayWorker; - -use Workerman\Connection\TcpConnection; - -use Workerman\Worker; -use Workerman\Lib\Timer; -use Workerman\Connection\AsyncTcpConnection; -use GatewayWorker\Protocols\GatewayProtocol; -use GatewayWorker\Lib\Context; - -/** - * - * BusinessWorker 用于处理Gateway转发来的数据 - * - * @author walkor - * - */ -class BusinessWorker extends Worker -{ - /** - * 保存与 gateway 的连接 connection 对象 - * - * @var array - */ - public $gatewayConnections = array(); - - /** - * 注册中心地址 - * - * @var string|array - */ - public $registerAddress = '127.0.0.1:1236'; - - /** - * 事件处理类,默认是 Event 类 - * - * @var string - */ - public $eventHandler = 'Events'; - - /** - * 业务超时时间,可用来定位程序卡在哪里 - * - * @var int - */ - public $processTimeout = 30; - - /** - * 业务超时时间,可用来定位程序卡在哪里 - * - * @var callable - */ - public $processTimeoutHandler = '\\Workerman\\Worker::log'; - - /** - * 秘钥 - * - * @var string - */ - public $secretKey = ''; - - /** - * businessWorker进程将消息转发给gateway进程的发送缓冲区大小 - * - * @var int - */ - public $sendToGatewayBufferSize = 10240000; - - /** - * 保存用户设置的 worker 启动回调 - * - * @var callback - */ - protected $_onWorkerStart = null; - - /** - * 保存用户设置的 workerReload 回调 - * - * @var callback - */ - protected $_onWorkerReload = null; - - /** - * 保存用户设置的 workerStop 回调 - * - * @var callback - */ - protected $_onWorkerStop= null; - - /** - * 到注册中心的连接 - * - * @var AsyncTcpConnection - */ - protected $_registerConnection = null; - - /** - * 处于连接状态的 gateway 通讯地址 - * - * @var array - */ - protected $_connectingGatewayAddresses = array(); - - /** - * 所有 geteway 内部通讯地址 - * - * @var array - */ - protected $_gatewayAddresses = array(); - - /** - * 等待连接个 gateway 地址 - * - * @var array - */ - protected $_waitingConnectGatewayAddresses = array(); - - /** - * Event::onConnect 回调 - * - * @var callback - */ - protected $_eventOnConnect = null; - - /** - * Event::onMessage 回调 - * - * @var callback - */ - protected $_eventOnMessage = null; - - /** - * Event::onClose 回调 - * - * @var callback - */ - protected $_eventOnClose = null; - - /** - * websocket回调 - * - * @var null - */ - protected $_eventOnWebSocketConnect = null; - - /** - * SESSION 版本缓存 - * - * @var array - */ - protected $_sessionVersion = array(); - - /** - * 用于保持长连接的心跳时间间隔 - * - * @var int - */ - const PERSISTENCE_CONNECTION_PING_INTERVAL = 25; - - /** - * 构造函数 - * - * @param string $socket_name - * @param array $context_option - */ - public function __construct($socket_name = '', $context_option = array()) - { - parent::__construct($socket_name, $context_option); - $backrace = debug_backtrace(); - $this->_autoloadRootPath = dirname($backrace[0]['file']); - } - - /** - * {@inheritdoc} - */ - public function run() - { - $this->_onWorkerStart = $this->onWorkerStart; - $this->_onWorkerReload = $this->onWorkerReload; - $this->_onWorkerStop = $this->onWorkerStop; - $this->onWorkerStop = array($this, 'onWorkerStop'); - $this->onWorkerStart = array($this, 'onWorkerStart'); - $this->onWorkerReload = array($this, 'onWorkerReload'); - parent::run(); - } - - /** - * 当进程启动时一些初始化工作 - * - * @return void - */ - protected function onWorkerStart() - { - if (function_exists('opcache_reset')) { - opcache_reset(); - } - - if (!class_exists('\Protocols\GatewayProtocol')) { - class_alias('GatewayWorker\Protocols\GatewayProtocol', 'Protocols\GatewayProtocol'); - } - - if (!is_array($this->registerAddress)) { - $this->registerAddress = array($this->registerAddress); - } - $this->connectToRegister(); - - \GatewayWorker\Lib\Gateway::setBusinessWorker($this); - \GatewayWorker\Lib\Gateway::$secretKey = $this->secretKey; - if ($this->_onWorkerStart) { - call_user_func($this->_onWorkerStart, $this); - } - - if (is_callable($this->eventHandler . '::onWorkerStart')) { - call_user_func($this->eventHandler . '::onWorkerStart', $this); - } - - if (function_exists('pcntl_signal')) { - // 业务超时信号处理 - pcntl_signal(SIGALRM, array($this, 'timeoutHandler'), false); - } else { - $this->processTimeout = 0; - } - - // 设置回调 - if (is_callable($this->eventHandler . '::onConnect')) { - $this->_eventOnConnect = $this->eventHandler . '::onConnect'; - } - - if (is_callable($this->eventHandler . '::onMessage')) { - $this->_eventOnMessage = $this->eventHandler . '::onMessage'; - } else { - echo "Waring: {$this->eventHandler}::onMessage is not callable\n"; - } - - if (is_callable($this->eventHandler . '::onClose')) { - $this->_eventOnClose = $this->eventHandler . '::onClose'; - } - - if (is_callable($this->eventHandler . '::onWebSocketConnect')) { - $this->_eventOnWebSocketConnect = $this->eventHandler . '::onWebSocketConnect'; - } - - } - - /** - * onWorkerReload 回调 - * - * @param Worker $worker - */ - protected function onWorkerReload($worker) - { - // 防止进程立刻退出 - $worker->reloadable = false; - // 延迟 0.05 秒退出,避免 BusinessWorker 瞬间全部退出导致没有可用的 BusinessWorker 进程 - Timer::add(0.05, array('Workerman\Worker', 'stopAll')); - // 执行用户定义的 onWorkerReload 回调 - if ($this->_onWorkerReload) { - call_user_func($this->_onWorkerReload, $this); - } - } - - /** - * 当进程关闭时一些清理工作 - * - * @return void - */ - protected function onWorkerStop() - { - if ($this->_onWorkerStop) { - call_user_func($this->_onWorkerStop, $this); - } - if (is_callable($this->eventHandler . '::onWorkerStop')) { - call_user_func($this->eventHandler . '::onWorkerStop', $this); - } - } - - /** - * 连接服务注册中心 - * - * @return void - */ - public function connectToRegister() - { - foreach ($this->registerAddress as $register_address) { - $register_connection = new AsyncTcpConnection("text://{$register_address}"); - $secret_key = $this->secretKey; - $register_connection->onConnect = function () use ($register_connection, $secret_key, $register_address) { - $register_connection->send('{"event":"worker_connect","secret_key":"' . $secret_key . '"}'); - // 如果Register服务器不在本地服务器,则需要保持心跳 - if (strpos($register_address, '127.0.0.1') !== 0) { - $register_connection->ping_timer = Timer::add(self::PERSISTENCE_CONNECTION_PING_INTERVAL, function () use ($register_connection) { - $register_connection->send('{"event":"ping"}'); - }); - } - }; - $register_connection->onClose = function ($register_connection) { - if(!empty($register_connection->ping_timer)) { - Timer::del($register_connection->ping_timer); - } - $register_connection->reconnect(1); - }; - $register_connection->onMessage = array($this, 'onRegisterConnectionMessage'); - $register_connection->connect(); - } - } - - - /** - * 当注册中心发来消息时 - * - * @return void - */ - public function onRegisterConnectionMessage($register_connection, $data) - { - $data = json_decode($data, true); - if (!isset($data['event'])) { - echo "Received bad data from Register\n"; - return; - } - $event = $data['event']; - switch ($event) { - case 'broadcast_addresses': - if (!is_array($data['addresses'])) { - echo "Received bad data from Register. Addresses empty\n"; - return; - } - $addresses = $data['addresses']; - $this->_gatewayAddresses = array(); - foreach ($addresses as $addr) { - $this->_gatewayAddresses[$addr] = $addr; - } - $this->checkGatewayConnections($addresses); - break; - default: - echo "Receive bad event:$event from Register.\n"; - } - } - - /** - * 当 gateway 转发来数据时 - * - * @param TcpConnection $connection - * @param mixed $data - */ - public function onGatewayMessage($connection, $data) - { - $cmd = $data['cmd']; - if ($cmd === GatewayProtocol::CMD_PING) { - return; - } - // 上下文数据 - Context::$client_ip = $data['client_ip']; - Context::$client_port = $data['client_port']; - Context::$local_ip = $data['local_ip']; - Context::$local_port = $data['local_port']; - Context::$connection_id = $data['connection_id']; - Context::$client_id = Context::addressToClientId($data['local_ip'], $data['local_port'], - $data['connection_id']); - // $_SERVER 变量 - $_SERVER = array( - 'REMOTE_ADDR' => long2ip($data['client_ip']), - 'REMOTE_PORT' => $data['client_port'], - 'GATEWAY_ADDR' => long2ip($data['local_ip']), - 'GATEWAY_PORT' => $data['gateway_port'], - 'GATEWAY_CLIENT_ID' => Context::$client_id, - ); - // 检查session版本,如果是过期的session数据则拉取最新的数据 - if ($cmd !== GatewayProtocol::CMD_ON_CLOSE && isset($this->_sessionVersion[Context::$client_id]) && $this->_sessionVersion[Context::$client_id] !== crc32($data['ext_data'])) { - $_SESSION = Context::$old_session = \GatewayWorker\Lib\Gateway::getSession(Context::$client_id); - $this->_sessionVersion[Context::$client_id] = crc32($data['ext_data']); - } else { - if (!isset($this->_sessionVersion[Context::$client_id])) { - $this->_sessionVersion[Context::$client_id] = crc32($data['ext_data']); - } - // 尝试解析 session - if ($data['ext_data'] != '') { - Context::$old_session = $_SESSION = Context::sessionDecode($data['ext_data']); - } else { - Context::$old_session = $_SESSION = null; - } - } - - if ($this->processTimeout) { - pcntl_alarm($this->processTimeout); - } - // 尝试执行 Event::onConnection、Event::onMessage、Event::onClose - switch ($cmd) { - case GatewayProtocol::CMD_ON_CONNECT: - if ($this->_eventOnConnect) { - call_user_func($this->_eventOnConnect, Context::$client_id); - } - break; - case GatewayProtocol::CMD_ON_MESSAGE: - if ($this->_eventOnMessage) { - call_user_func($this->_eventOnMessage, Context::$client_id, $data['body']); - } - break; - case GatewayProtocol::CMD_ON_CLOSE: - unset($this->_sessionVersion[Context::$client_id]); - if ($this->_eventOnClose) { - call_user_func($this->_eventOnClose, Context::$client_id); - } - break; - case GatewayProtocol::CMD_ON_WEBSOCKET_CONNECT: - if ($this->_eventOnWebSocketConnect) { - call_user_func($this->_eventOnWebSocketConnect, Context::$client_id, $data['body']); - } - break; - } - if ($this->processTimeout) { - pcntl_alarm(0); - } - - // session 必须是数组 - if ($_SESSION !== null && !is_array($_SESSION)) { - throw new \Exception('$_SESSION must be an array. But $_SESSION=' . var_export($_SESSION, true) . ' is not array.'); - } - - // 判断 session 是否被更改 - if ($_SESSION !== Context::$old_session && $cmd !== GatewayProtocol::CMD_ON_CLOSE) { - $session_str_now = $_SESSION !== null ? Context::sessionEncode($_SESSION) : ''; - \GatewayWorker\Lib\Gateway::setSocketSession(Context::$client_id, $session_str_now); - $this->_sessionVersion[Context::$client_id] = crc32($session_str_now); - } - - Context::clear(); - } - - /** - * 当与 Gateway 的连接断开时触发 - * - * @param TcpConnection $connection - * @return void - */ - public function onGatewayClose($connection) - { - $addr = $connection->remoteAddress; - unset($this->gatewayConnections[$addr], $this->_connectingGatewayAddresses[$addr]); - if (isset($this->_gatewayAddresses[$addr]) && !isset($this->_waitingConnectGatewayAddresses[$addr])) { - Timer::add(1, array($this, 'tryToConnectGateway'), array($addr), false); - $this->_waitingConnectGatewayAddresses[$addr] = $addr; - } - } - - /** - * 尝试连接 Gateway 内部通讯地址 - * - * @param string $addr - */ - public function tryToConnectGateway($addr) - { - if (!isset($this->gatewayConnections[$addr]) && !isset($this->_connectingGatewayAddresses[$addr]) && isset($this->_gatewayAddresses[$addr])) { - $gateway_connection = new AsyncTcpConnection("GatewayProtocol://$addr"); - $gateway_connection->remoteAddress = $addr; - $gateway_connection->onConnect = array($this, 'onConnectGateway'); - $gateway_connection->onMessage = array($this, 'onGatewayMessage'); - $gateway_connection->onClose = array($this, 'onGatewayClose'); - $gateway_connection->onError = array($this, 'onGatewayError'); - $gateway_connection->maxSendBufferSize = $this->sendToGatewayBufferSize; - if (TcpConnection::$defaultMaxSendBufferSize == $gateway_connection->maxSendBufferSize) { - $gateway_connection->maxSendBufferSize = 50 * 1024 * 1024; - } - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_WORKER_CONNECT; - $gateway_data['body'] = json_encode(array( - 'worker_key' =>"{$this->name}:{$this->id}", - 'secret_key' => $this->secretKey, - )); - $gateway_connection->send($gateway_data); - $gateway_connection->connect(); - $this->_connectingGatewayAddresses[$addr] = $addr; - } - unset($this->_waitingConnectGatewayAddresses[$addr]); - } - - /** - * 检查 gateway 的通信端口是否都已经连 - * 如果有未连接的端口,则尝试连接 - * - * @param array $addresses_list - */ - public function checkGatewayConnections($addresses_list) - { - if (empty($addresses_list)) { - return; - } - foreach ($addresses_list as $addr) { - if (!isset($this->_waitingConnectGatewayAddresses[$addr])) { - $this->tryToConnectGateway($addr); - } - } - } - - /** - * 当连接上 gateway 的通讯端口时触发 - * 将连接 connection 对象保存起来 - * - * @param TcpConnection $connection - * @return void - */ - public function onConnectGateway($connection) - { - $this->gatewayConnections[$connection->remoteAddress] = $connection; - unset($this->_connectingGatewayAddresses[$connection->remoteAddress], $this->_waitingConnectGatewayAddresses[$connection->remoteAddress]); - } - - /** - * 当与 gateway 的连接出现错误时触发 - * - * @param TcpConnection $connection - * @param int $error_no - * @param string $error_msg - */ - public function onGatewayError($connection, $error_no, $error_msg) - { - echo "GatewayConnection Error : $error_no ,$error_msg\n"; - } - - /** - * 获取所有 Gateway 内部通讯地址 - * - * @return array - */ - public function getAllGatewayAddresses() - { - return $this->_gatewayAddresses; - } - - /** - * 业务超时回调 - * - * @param int $signal - * @throws \Exception - */ - public function timeoutHandler($signal) - { - switch ($signal) { - // 超时时钟 - case SIGALRM: - // 超时异常 - $e = new \Exception("process_timeout", 506); - $trace_str = $e->getTraceAsString(); - // 去掉第一行timeoutHandler的调用栈 - $trace_str = $e->getMessage() . ":\n" . substr($trace_str, strpos($trace_str, "\n") + 1) . "\n"; - // 开发者没有设置超时处理函数,或者超时处理函数返回空则执行退出 - if (!$this->processTimeoutHandler || !call_user_func($this->processTimeoutHandler, $trace_str, $e)) { - Worker::stopAll(); - } - break; - } - } -} diff --git a/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Gateway.php b/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Gateway.php deleted file mode 100644 index b96660cb..00000000 --- a/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Gateway.php +++ /dev/null @@ -1,1062 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace GatewayWorker; - -use GatewayWorker\Lib\Context; - -use Workerman\Connection\TcpConnection; - -use Workerman\Worker; -use Workerman\Lib\Timer; -use Workerman\Autoloader; -use Workerman\Connection\AsyncTcpConnection; -use GatewayWorker\Protocols\GatewayProtocol; - -/** - * - * Gateway,基于Worker 开发 - * 用于转发客户端的数据给Worker处理,以及转发Worker的数据给客户端 - * - * @author walkor - * - */ -class Gateway extends Worker -{ - /** - * 版本 - * - * @var string - */ - const VERSION = '3.0.22'; - - /** - * 本机 IP - * 单机部署默认 127.0.0.1,如果是分布式部署,需要设置成本机 IP - * - * @var string - */ - public $lanIp = '127.0.0.1'; - - /** - * 本机端口 - * - * @var string - */ - public $lanPort = 0; - - /** - * gateway 内部通讯起始端口,每个 gateway 实例应该都不同,步长1000 - * - * @var int - */ - public $startPort = 2000; - - /** - * 注册服务地址,用于注册 Gateway BusinessWorker,使之能够通讯 - * - * @var string|array - */ - public $registerAddress = '127.0.0.1:1236'; - - /** - * 是否可以平滑重启,gateway 不能平滑重启,否则会导致连接断开 - * - * @var bool - */ - public $reloadable = false; - - /** - * 心跳时间间隔 - * - * @var int - */ - public $pingInterval = 0; - - /** - * $pingNotResponseLimit * $pingInterval 时间内,客户端未发送任何数据,断开客户端连接 - * - * @var int - */ - public $pingNotResponseLimit = 0; - - /** - * 服务端向客户端发送的心跳数据 - * - * @var string - */ - public $pingData = ''; - - /** - * 秘钥 - * - * @var string - */ - public $secretKey = ''; - - /** - * 路由函数 - * - * @var callback - */ - public $router = null; - - - /** - * gateway进程转发给businessWorker进程的发送缓冲区大小 - * - * @var int - */ - public $sendToWorkerBufferSize = 10240000; - - /** - * gateway进程将数据发给客户端时每个客户端发送缓冲区大小 - * - * @var int - */ - public $sendToClientBufferSize = 1024000; - - /** - * 协议加速 - * - * @var bool - */ - public $protocolAccelerate = false; - - /** - * BusinessWorker 连接成功之后触发 - * - * @var callback|null - */ - public $onBusinessWorkerConnected = null; - - /** - * BusinessWorker 关闭时触发 - * - * @var callback|null - */ - public $onBusinessWorkerClose = null; - - /** - * 保存客户端的所有 connection 对象 - * - * @var array - */ - protected $_clientConnections = array(); - - /** - * uid 到 connection 的映射,一对多关系 - */ - protected $_uidConnections = array(); - - /** - * group 到 connection 的映射,一对多关系 - * - * @var array - */ - protected $_groupConnections = array(); - - /** - * 保存所有 worker 的内部连接的 connection 对象 - * - * @var array - */ - protected $_workerConnections = array(); - - /** - * gateway 内部监听 worker 内部连接的 worker - * - * @var Worker - */ - protected $_innerTcpWorker = null; - - /** - * 当 worker 启动时 - * - * @var callback - */ - protected $_onWorkerStart = null; - - /** - * 当有客户端连接时 - * - * @var callback - */ - protected $_onConnect = null; - - /** - * 当客户端发来消息时 - * - * @var callback - */ - protected $_onMessage = null; - - /** - * 当客户端连接关闭时 - * - * @var callback - */ - protected $_onClose = null; - - /** - * 当 worker 停止时 - * - * @var callback - */ - protected $_onWorkerStop = null; - - /** - * 进程启动时间 - * - * @var int - */ - protected $_startTime = 0; - - /** - * gateway 监听的端口 - * - * @var int - */ - protected $_gatewayPort = 0; - - /** - * connectionId 记录器 - * @var int - */ - protected static $_connectionIdRecorder = 0; - - /** - * 用于保持长连接的心跳时间间隔 - * - * @var int - */ - const PERSISTENCE_CONNECTION_PING_INTERVAL = 25; - - /** - * 构造函数 - * - * @param string $socket_name - * @param array $context_option - */ - public function __construct($socket_name, $context_option = array()) - { - parent::__construct($socket_name, $context_option); - $this->_gatewayPort = substr(strrchr($socket_name,':'),1); - $this->router = array("\\GatewayWorker\\Gateway", 'routerBind'); - - $backtrace = debug_backtrace(); - $this->_autoloadRootPath = dirname($backtrace[0]['file']); - } - - /** - * {@inheritdoc} - */ - public function run() - { - // 保存用户的回调,当对应的事件发生时触发 - $this->_onWorkerStart = $this->onWorkerStart; - $this->onWorkerStart = array($this, 'onWorkerStart'); - // 保存用户的回调,当对应的事件发生时触发 - $this->_onConnect = $this->onConnect; - $this->onConnect = array($this, 'onClientConnect'); - - // onMessage禁止用户设置回调 - $this->onMessage = array($this, 'onClientMessage'); - - // 保存用户的回调,当对应的事件发生时触发 - $this->_onClose = $this->onClose; - $this->onClose = array($this, 'onClientClose'); - // 保存用户的回调,当对应的事件发生时触发 - $this->_onWorkerStop = $this->onWorkerStop; - $this->onWorkerStop = array($this, 'onWorkerStop'); - - if (!is_array($this->registerAddress)) { - $this->registerAddress = array($this->registerAddress); - } - - // 记录进程启动的时间 - $this->_startTime = time(); - // 运行父方法 - parent::run(); - } - - /** - * 当客户端发来数据时,转发给worker处理 - * - * @param TcpConnection $connection - * @param mixed $data - */ - public function onClientMessage($connection, $data) - { - $connection->pingNotResponseCount = -1; - $this->sendToWorker(GatewayProtocol::CMD_ON_MESSAGE, $connection, $data); - } - - /** - * 当客户端连接上来时,初始化一些客户端的数据 - * 包括全局唯一的client_id、初始化session等 - * - * @param TcpConnection $connection - */ - public function onClientConnect($connection) - { - $connection->id = self::generateConnectionId(); - // 保存该连接的内部通讯的数据包报头,避免每次重新初始化 - $connection->gatewayHeader = array( - 'local_ip' => ip2long($this->lanIp), - 'local_port' => $this->lanPort, - 'client_ip' => ip2long($connection->getRemoteIp()), - 'client_port' => $connection->getRemotePort(), - 'gateway_port' => $this->_gatewayPort, - 'connection_id' => $connection->id, - 'flag' => 0, - ); - // 连接的 session - $connection->session = ''; - // 该连接的心跳参数 - $connection->pingNotResponseCount = -1; - // 该链接发送缓冲区大小 - $connection->maxSendBufferSize = $this->sendToClientBufferSize; - // 保存客户端连接 connection 对象 - $this->_clientConnections[$connection->id] = $connection; - - // 如果用户有自定义 onConnect 回调,则执行 - if ($this->_onConnect) { - call_user_func($this->_onConnect, $connection); - if (isset($connection->onWebSocketConnect)) { - $connection->_onWebSocketConnect = $connection->onWebSocketConnect; - } - } - if ($connection->protocol === '\Workerman\Protocols\Websocket' || $connection->protocol === 'Workerman\Protocols\Websocket') { - $connection->onWebSocketConnect = array($this, 'onWebsocketConnect'); - } - - $this->sendToWorker(GatewayProtocol::CMD_ON_CONNECT, $connection); - } - - /** - * websocket握手时触发 - * - * @param $connection - * @param $http_buffer - */ - public function onWebsocketConnect($connection, $http_buffer) - { - if (isset($connection->_onWebSocketConnect)) { - call_user_func($connection->_onWebSocketConnect, $connection, $http_buffer); - unset($connection->_onWebSocketConnect); - } - $this->sendToWorker(GatewayProtocol::CMD_ON_WEBSOCKET_CONNECT, $connection, array('get' => $_GET, 'server' => $_SERVER, 'cookie' => $_COOKIE)); - } - - /** - * 生成connection id - * @return int - */ - protected function generateConnectionId() - { - $max_unsigned_int = 4294967295; - if (self::$_connectionIdRecorder >= $max_unsigned_int) { - self::$_connectionIdRecorder = 0; - } - while(++self::$_connectionIdRecorder <= $max_unsigned_int) { - if(!isset($this->_clientConnections[self::$_connectionIdRecorder])) { - break; - } - } - return self::$_connectionIdRecorder; - } - - /** - * 发送数据给 worker 进程 - * - * @param int $cmd - * @param TcpConnection $connection - * @param mixed $body - * @return bool - */ - protected function sendToWorker($cmd, $connection, $body = '') - { - $gateway_data = $connection->gatewayHeader; - $gateway_data['cmd'] = $cmd; - $gateway_data['body'] = $body; - $gateway_data['ext_data'] = $connection->session; - if ($this->_workerConnections) { - // 调用路由函数,选择一个worker把请求转发给它 - /** @var TcpConnection $worker_connection */ - $worker_connection = call_user_func($this->router, $this->_workerConnections, $connection, $cmd, $body); - if (false === $worker_connection->send($gateway_data)) { - $msg = "SendBufferToWorker fail. May be the send buffer are overflow. See http://doc2.workerman.net/send-buffer-overflow.html"; - static::log($msg); - return false; - } - } // 没有可用的 worker - else { - // gateway 启动后 1-2 秒内 SendBufferToWorker fail 是正常现象,因为与 worker 的连接还没建立起来, - // 所以不记录日志,只是关闭连接 - $time_diff = 2; - if (time() - $this->_startTime >= $time_diff) { - $msg = 'SendBufferToWorker fail. The connections between Gateway and BusinessWorker are not ready. See http://doc2.workerman.net/send-buffer-to-worker-fail.html'; - static::log($msg); - } - $connection->destroy(); - return false; - } - return true; - } - - /** - * 随机路由,返回 worker connection 对象 - * - * @param array $worker_connections - * @param TcpConnection $client_connection - * @param int $cmd - * @param mixed $buffer - * @return TcpConnection - */ - public static function routerRand($worker_connections, $client_connection, $cmd, $buffer) - { - return $worker_connections[array_rand($worker_connections)]; - } - - /** - * client_id 与 worker 绑定 - * - * @param array $worker_connections - * @param TcpConnection $client_connection - * @param int $cmd - * @param mixed $buffer - * @return TcpConnection - */ - public static function routerBind($worker_connections, $client_connection, $cmd, $buffer) - { - if (!isset($client_connection->businessworker_address) || !isset($worker_connections[$client_connection->businessworker_address])) { - $client_connection->businessworker_address = array_rand($worker_connections); - } - return $worker_connections[$client_connection->businessworker_address]; - } - - /** - * 当客户端关闭时 - * - * @param TcpConnection $connection - */ - public function onClientClose($connection) - { - // 尝试通知 worker,触发 Event::onClose - $this->sendToWorker(GatewayProtocol::CMD_ON_CLOSE, $connection); - unset($this->_clientConnections[$connection->id]); - // 清理 uid 数据 - if (!empty($connection->uid)) { - $uid = $connection->uid; - unset($this->_uidConnections[$uid][$connection->id]); - if (empty($this->_uidConnections[$uid])) { - unset($this->_uidConnections[$uid]); - } - } - // 清理 group 数据 - if (!empty($connection->groups)) { - foreach ($connection->groups as $group) { - unset($this->_groupConnections[$group][$connection->id]); - if (empty($this->_groupConnections[$group])) { - unset($this->_groupConnections[$group]); - } - } - } - // 触发 onClose - if ($this->_onClose) { - call_user_func($this->_onClose, $connection); - } - } - - /** - * 当 Gateway 启动的时候触发的回调函数 - * - * @return void - */ - public function onWorkerStart() - { - // 分配一个内部通讯端口 - $this->lanPort = $this->startPort + $this->id; - - // 如果有设置心跳,则定时执行 - if ($this->pingInterval > 0) { - $timer_interval = $this->pingNotResponseLimit > 0 ? $this->pingInterval / 2 : $this->pingInterval; - Timer::add($timer_interval, array($this, 'ping')); - } - - // 如果BusinessWorker ip不是127.0.0.1,则需要加gateway到BusinessWorker的心跳 - if ($this->lanIp !== '127.0.0.1') { - Timer::add(self::PERSISTENCE_CONNECTION_PING_INTERVAL, array($this, 'pingBusinessWorker')); - } - - if (!class_exists('\Protocols\GatewayProtocol')) { - class_alias('GatewayWorker\Protocols\GatewayProtocol', 'Protocols\GatewayProtocol'); - } - - //如为公网IP监听,直接换成0.0.0.0 ,否则用内网IP - $listen_ip=filter_var($this->lanIp,FILTER_VALIDATE_IP,FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)?'0.0.0.0':$this->lanIp; - // 初始化 gateway 内部的监听,用于监听 worker 的连接已经连接上发来的数据 - $this->_innerTcpWorker = new Worker("GatewayProtocol://{$listen_ip}:{$this->lanPort}"); - $this->_innerTcpWorker->reusePort = false; - $this->_innerTcpWorker->listen(); - $this->_innerTcpWorker->name = 'GatewayInnerWorker'; - - // 重新设置自动加载根目录 - Autoloader::setRootPath($this->_autoloadRootPath); - - // 设置内部监听的相关回调 - $this->_innerTcpWorker->onMessage = array($this, 'onWorkerMessage'); - - $this->_innerTcpWorker->onConnect = array($this, 'onWorkerConnect'); - $this->_innerTcpWorker->onClose = array($this, 'onWorkerClose'); - - // 注册 gateway 的内部通讯地址,worker 去连这个地址,以便 gateway 与 worker 之间建立起 TCP 长连接 - $this->registerAddress(); - - if ($this->_onWorkerStart) { - call_user_func($this->_onWorkerStart, $this); - } - } - - - /** - * 当 worker 通过内部通讯端口连接到 gateway 时 - * - * @param TcpConnection $connection - */ - public function onWorkerConnect($connection) - { - $connection->maxSendBufferSize = $this->sendToWorkerBufferSize; - $connection->authorized = $this->secretKey ? false : true; - } - - /** - * 当 worker 发来数据时 - * - * @param TcpConnection $connection - * @param mixed $data - * @throws \Exception - * - * @return void - */ - public function onWorkerMessage($connection, $data) - { - $cmd = $data['cmd']; - if (empty($connection->authorized) && $cmd !== GatewayProtocol::CMD_WORKER_CONNECT && $cmd !== GatewayProtocol::CMD_GATEWAY_CLIENT_CONNECT) { - self::log("Unauthorized request from " . $connection->getRemoteIp() . ":" . $connection->getRemotePort()); - $connection->close(); - return; - } - switch ($cmd) { - // BusinessWorker连接Gateway - case GatewayProtocol::CMD_WORKER_CONNECT: - $worker_info = json_decode($data['body'], true); - if ($worker_info['secret_key'] !== $this->secretKey) { - self::log("Gateway: Worker key does not match ".var_export($this->secretKey, true)." !== ". var_export($this->secretKey)); - $connection->close(); - return; - } - $key = $connection->getRemoteIp() . ':' . $worker_info['worker_key']; - // 在一台服务器上businessWorker->name不能相同 - if (isset($this->_workerConnections[$key])) { - self::log("Gateway: Worker->name conflict. Key:{$key}"); - $connection->close(); - return; - } - $connection->key = $key; - $this->_workerConnections[$key] = $connection; - $connection->authorized = true; - if ($this->onBusinessWorkerConnected) { - call_user_func($this->onBusinessWorkerConnected, $connection); - } - return; - // GatewayClient连接Gateway - case GatewayProtocol::CMD_GATEWAY_CLIENT_CONNECT: - $worker_info = json_decode($data['body'], true); - if ($worker_info['secret_key'] !== $this->secretKey) { - self::log("Gateway: GatewayClient key does not match ".var_export($this->secretKey, true)." !== ".var_export($this->secretKey, true)); - $connection->close(); - return; - } - $connection->authorized = true; - return; - // 向某客户端发送数据,Gateway::sendToClient($client_id, $message); - case GatewayProtocol::CMD_SEND_TO_ONE: - if (isset($this->_clientConnections[$data['connection_id']])) { - $raw = (bool)($data['flag'] & GatewayProtocol::FLAG_NOT_CALL_ENCODE); - $body = $data['body']; - if (!$raw && $this->protocolAccelerate && $this->protocol) { - $body = $this->preEncodeForClient($body); - $raw = true; - } - $this->_clientConnections[$data['connection_id']]->send($body, $raw); - } - return; - // 踢出用户,Gateway::closeClient($client_id, $message); - case GatewayProtocol::CMD_KICK: - if (isset($this->_clientConnections[$data['connection_id']])) { - $this->_clientConnections[$data['connection_id']]->close($data['body']); - } - return; - // 立即销毁用户连接, Gateway::destroyClient($client_id); - case GatewayProtocol::CMD_DESTROY: - if (isset($this->_clientConnections[$data['connection_id']])) { - $this->_clientConnections[$data['connection_id']]->destroy(); - } - return; - // 广播, Gateway::sendToAll($message, $client_id_array) - case GatewayProtocol::CMD_SEND_TO_ALL: - $raw = (bool)($data['flag'] & GatewayProtocol::FLAG_NOT_CALL_ENCODE); - $body = $data['body']; - if (!$raw && $this->protocolAccelerate && $this->protocol) { - $body = $this->preEncodeForClient($body); - $raw = true; - } - $ext_data = $data['ext_data'] ? json_decode($data['ext_data'], true) : ''; - // $client_id_array 不为空时,只广播给 $client_id_array 指定的客户端 - if (isset($ext_data['connections'])) { - foreach ($ext_data['connections'] as $connection_id) { - if (isset($this->_clientConnections[$connection_id])) { - $this->_clientConnections[$connection_id]->send($body, $raw); - } - } - } // $client_id_array 为空时,广播给所有在线客户端 - else { - $exclude_connection_id = !empty($ext_data['exclude']) ? $ext_data['exclude'] : null; - foreach ($this->_clientConnections as $client_connection) { - if (!isset($exclude_connection_id[$client_connection->id])) { - $client_connection->send($body, $raw); - } - } - } - return; - case GatewayProtocol::CMD_SELECT: - $client_info_array = array(); - $ext_data = json_decode($data['ext_data'], true); - if (!$ext_data) { - echo 'CMD_SELECT ext_data=' . var_export($data['ext_data'], true) . '\r\n'; - $buffer = serialize($client_info_array); - $connection->send(pack('N', strlen($buffer)) . $buffer, true); - return; - } - $fields = $ext_data['fields']; - $where = $ext_data['where']; - if ($where) { - $connection_box_map = array( - 'groups' => $this->_groupConnections, - 'uid' => $this->_uidConnections - ); - // $where = ['groups'=>[x,x..], 'uid'=>[x,x..], 'connection_id'=>[x,x..]] - foreach ($where as $key => $items) { - if ($key !== 'connection_id') { - $connections_box = $connection_box_map[$key]; - foreach ($items as $item) { - if (isset($connections_box[$item])) { - foreach ($connections_box[$item] as $connection_id => $client_connection) { - if (!isset($client_info_array[$connection_id])) { - $client_info_array[$connection_id] = array(); - // $fields = ['groups', 'uid', 'session'] - foreach ($fields as $field) { - $client_info_array[$connection_id][$field] = isset($client_connection->$field) ? $client_connection->$field : null; - } - } - } - - } - } - } else { - foreach ($items as $connection_id) { - if (isset($this->_clientConnections[$connection_id])) { - $client_connection = $this->_clientConnections[$connection_id]; - $client_info_array[$connection_id] = array(); - // $fields = ['groups', 'uid', 'session'] - foreach ($fields as $field) { - $client_info_array[$connection_id][$field] = isset($client_connection->$field) ? $client_connection->$field : null; - } - } - } - } - } - } else { - foreach ($this->_clientConnections as $connection_id => $client_connection) { - foreach ($fields as $field) { - $client_info_array[$connection_id][$field] = isset($client_connection->$field) ? $client_connection->$field : null; - } - } - } - $buffer = serialize($client_info_array); - $connection->send(pack('N', strlen($buffer)) . $buffer, true); - return; - // 获取在线群组列表 - case GatewayProtocol::CMD_GET_GROUP_ID_LIST: - $buffer = serialize(array_keys($this->_groupConnections)); - $connection->send(pack('N', strlen($buffer)) . $buffer, true); - return; - // 重新赋值 session - case GatewayProtocol::CMD_SET_SESSION: - if (isset($this->_clientConnections[$data['connection_id']])) { - $this->_clientConnections[$data['connection_id']]->session = $data['ext_data']; - } - return; - // session合并 - case GatewayProtocol::CMD_UPDATE_SESSION: - if (!isset($this->_clientConnections[$data['connection_id']])) { - return; - } else { - if (!$this->_clientConnections[$data['connection_id']]->session) { - $this->_clientConnections[$data['connection_id']]->session = $data['ext_data']; - return; - } - $session = Context::sessionDecode($this->_clientConnections[$data['connection_id']]->session); - $session_for_merge = Context::sessionDecode($data['ext_data']); - $session = array_replace_recursive($session, $session_for_merge); - $this->_clientConnections[$data['connection_id']]->session = Context::sessionEncode($session); - } - return; - case GatewayProtocol::CMD_GET_SESSION_BY_CLIENT_ID: - if (!isset($this->_clientConnections[$data['connection_id']])) { - $session = serialize(null); - } else { - if (!$this->_clientConnections[$data['connection_id']]->session) { - $session = serialize(array()); - } else { - $session = $this->_clientConnections[$data['connection_id']]->session; - } - } - $connection->send(pack('N', strlen($session)) . $session, true); - return; - // 获得客户端sessions - case GatewayProtocol::CMD_GET_ALL_CLIENT_SESSIONS: - $client_info_array = array(); - foreach ($this->_clientConnections as $connection_id => $client_connection) { - $client_info_array[$connection_id] = $client_connection->session; - } - $buffer = serialize($client_info_array); - $connection->send(pack('N', strlen($buffer)) . $buffer, true); - return; - // 判断某个 client_id 是否在线 Gateway::isOnline($client_id) - case GatewayProtocol::CMD_IS_ONLINE: - $buffer = serialize((int)isset($this->_clientConnections[$data['connection_id']])); - $connection->send(pack('N', strlen($buffer)) . $buffer, true); - return; - // 将 client_id 与 uid 绑定 - case GatewayProtocol::CMD_BIND_UID: - $uid = $data['ext_data']; - if (empty($uid)) { - echo "bindUid(client_id, uid) uid empty, uid=" . var_export($uid, true); - return; - } - $connection_id = $data['connection_id']; - if (!isset($this->_clientConnections[$connection_id])) { - return; - } - $client_connection = $this->_clientConnections[$connection_id]; - if (isset($client_connection->uid)) { - $current_uid = $client_connection->uid; - unset($this->_uidConnections[$current_uid][$connection_id]); - if (empty($this->_uidConnections[$current_uid])) { - unset($this->_uidConnections[$current_uid]); - } - } - $client_connection->uid = $uid; - $this->_uidConnections[$uid][$connection_id] = $client_connection; - return; - // client_id 与 uid 解绑 Gateway::unbindUid($client_id, $uid); - case GatewayProtocol::CMD_UNBIND_UID: - $connection_id = $data['connection_id']; - if (!isset($this->_clientConnections[$connection_id])) { - return; - } - $client_connection = $this->_clientConnections[$connection_id]; - if (isset($client_connection->uid)) { - $current_uid = $client_connection->uid; - unset($this->_uidConnections[$current_uid][$connection_id]); - if (empty($this->_uidConnections[$current_uid])) { - unset($this->_uidConnections[$current_uid]); - } - $client_connection->uid_info = ''; - $client_connection->uid = null; - } - return; - // 发送数据给 uid Gateway::sendToUid($uid, $msg); - case GatewayProtocol::CMD_SEND_TO_UID: - $raw = (bool)($data['flag'] & GatewayProtocol::FLAG_NOT_CALL_ENCODE); - $body = $data['body']; - if (!$raw && $this->protocolAccelerate && $this->protocol) { - $body = $this->preEncodeForClient($body); - $raw = true; - } - $uid_array = json_decode($data['ext_data'], true); - foreach ($uid_array as $uid) { - if (!empty($this->_uidConnections[$uid])) { - foreach ($this->_uidConnections[$uid] as $connection) { - /** @var TcpConnection $connection */ - $connection->send($body, $raw); - } - } - } - return; - // 将 $client_id 加入用户组 Gateway::joinGroup($client_id, $group); - case GatewayProtocol::CMD_JOIN_GROUP: - $group = $data['ext_data']; - if (empty($group)) { - echo "join(group) group empty, group=" . var_export($group, true); - return; - } - $connection_id = $data['connection_id']; - if (!isset($this->_clientConnections[$connection_id])) { - return; - } - $client_connection = $this->_clientConnections[$connection_id]; - if (!isset($client_connection->groups)) { - $client_connection->groups = array(); - } - $client_connection->groups[$group] = $group; - $this->_groupConnections[$group][$connection_id] = $client_connection; - return; - // 将 $client_id 从某个用户组中移除 Gateway::leaveGroup($client_id, $group); - case GatewayProtocol::CMD_LEAVE_GROUP: - $group = $data['ext_data']; - if (empty($group)) { - echo "leave(group) group empty, group=" . var_export($group, true); - return; - } - $connection_id = $data['connection_id']; - if (!isset($this->_clientConnections[$connection_id])) { - return; - } - $client_connection = $this->_clientConnections[$connection_id]; - if (!isset($client_connection->groups[$group])) { - return; - } - unset($client_connection->groups[$group], $this->_groupConnections[$group][$connection_id]); - if (empty($this->_groupConnections[$group])) { - unset($this->_groupConnections[$group]); - } - return; - // 解散分组 - case GatewayProtocol::CMD_UNGROUP: - $group = $data['ext_data']; - if (empty($group)) { - echo "leave(group) group empty, group=" . var_export($group, true); - return; - } - if (empty($this->_groupConnections[$group])) { - return; - } - foreach ($this->_groupConnections[$group] as $client_connection) { - unset($client_connection->groups[$group]); - } - unset($this->_groupConnections[$group]); - return; - // 向某个用户组发送消息 Gateway::sendToGroup($group, $msg); - case GatewayProtocol::CMD_SEND_TO_GROUP: - $raw = (bool)($data['flag'] & GatewayProtocol::FLAG_NOT_CALL_ENCODE); - $body = $data['body']; - if (!$raw && $this->protocolAccelerate && $this->protocol) { - $body = $this->preEncodeForClient($body); - $raw = true; - } - $ext_data = json_decode($data['ext_data'], true); - $group_array = $ext_data['group']; - $exclude_connection_id = $ext_data['exclude']; - - foreach ($group_array as $group) { - if (!empty($this->_groupConnections[$group])) { - foreach ($this->_groupConnections[$group] as $connection) { - if(!isset($exclude_connection_id[$connection->id])) - { - /** @var TcpConnection $connection */ - $connection->send($body, $raw); - } - } - } - } - return; - // 获取某用户组成员信息 Gateway::getClientSessionsByGroup($group); - case GatewayProtocol::CMD_GET_CLIENT_SESSIONS_BY_GROUP: - $group = $data['ext_data']; - if (!isset($this->_groupConnections[$group])) { - $buffer = serialize(array()); - $connection->send(pack('N', strlen($buffer)) . $buffer, true); - return; - } - $client_info_array = array(); - foreach ($this->_groupConnections[$group] as $connection_id => $client_connection) { - $client_info_array[$connection_id] = $client_connection->session; - } - $buffer = serialize($client_info_array); - $connection->send(pack('N', strlen($buffer)) . $buffer, true); - return; - // 获取用户组成员数 Gateway::getClientCountByGroup($group); - case GatewayProtocol::CMD_GET_CLIENT_COUNT_BY_GROUP: - $group = $data['ext_data']; - $count = 0; - if ($group !== '') { - if (isset($this->_groupConnections[$group])) { - $count = count($this->_groupConnections[$group]); - } - } else { - $count = count($this->_clientConnections); - } - $buffer = serialize($count); - $connection->send(pack('N', strlen($buffer)) . $buffer, true); - return; - // 获取与某个 uid 绑定的所有 client_id Gateway::getClientIdByUid($uid); - case GatewayProtocol::CMD_GET_CLIENT_ID_BY_UID: - $uid = $data['ext_data']; - if (empty($this->_uidConnections[$uid])) { - $buffer = serialize(array()); - } else { - $buffer = serialize(array_keys($this->_uidConnections[$uid])); - } - $connection->send(pack('N', strlen($buffer)) . $buffer, true); - return; - default : - $err_msg = "gateway inner pack err cmd=$cmd"; - echo $err_msg; - } - } - - - /** - * 当worker连接关闭时 - * - * @param TcpConnection $connection - */ - public function onWorkerClose($connection) - { - if (isset($connection->key)) { - unset($this->_workerConnections[$connection->key]); - if ($this->onBusinessWorkerClose) { - call_user_func($this->onBusinessWorkerClose, $connection); - } - } - } - - /** - * 存储当前 Gateway 的内部通信地址 - * - * @return bool - */ - public function registerAddress() - { - $address = $this->lanIp . ':' . $this->lanPort; - foreach ($this->registerAddress as $register_address) { - $register_connection = new AsyncTcpConnection("text://{$register_address}"); - $secret_key = $this->secretKey; - $register_connection->onConnect = function($register_connection) use ($address, $secret_key, $register_address){ - $register_connection->send('{"event":"gateway_connect", "address":"' . $address . '", "secret_key":"' . $secret_key . '"}'); - // 如果Register服务器不在本地服务器,则需要保持心跳 - if (strpos($register_address, '127.0.0.1') !== 0) { - $register_connection->ping_timer = Timer::add(self::PERSISTENCE_CONNECTION_PING_INTERVAL, function () use ($register_connection) { - $register_connection->send('{"event":"ping"}'); - }); - } - }; - $register_connection->onClose = function ($register_connection) { - if(!empty($register_connection->ping_timer)) { - Timer::del($register_connection->ping_timer); - } - $register_connection->reconnect(1); - }; - $register_connection->connect(); - } - } - - - /** - * 心跳逻辑 - * - * @return void - */ - public function ping() - { - $ping_data = $this->pingData ? (string)$this->pingData : null; - $raw = false; - if ($this->protocolAccelerate && $ping_data && $this->protocol) { - $ping_data = $this->preEncodeForClient($ping_data); - $raw = true; - } - // 遍历所有客户端连接 - foreach ($this->_clientConnections as $connection) { - // 上次发送的心跳还没有回复次数大于限定值就断开 - if ($this->pingNotResponseLimit > 0 && - $connection->pingNotResponseCount >= $this->pingNotResponseLimit * 2 - ) { - $connection->destroy(); - continue; - } - // $connection->pingNotResponseCount 为 -1 说明最近客户端有发来消息,则不给客户端发送心跳 - $connection->pingNotResponseCount++; - if ($ping_data) { - if ($connection->pingNotResponseCount === 0 || - ($this->pingNotResponseLimit > 0 && $connection->pingNotResponseCount % 2 === 1) - ) { - continue; - } - $connection->send($ping_data, $raw); - } - } - } - - /** - * 向 BusinessWorker 发送心跳数据,用于保持长连接 - * - * @return void - */ - public function pingBusinessWorker() - { - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_PING; - foreach ($this->_workerConnections as $connection) { - $connection->send($gateway_data); - } - } - - /** - * @param mixed $data - * - * @return string - */ - protected function preEncodeForClient($data) - { - foreach ($this->_clientConnections as $client_connection) { - return call_user_func(array($client_connection->protocol, 'encode'), $data, $client_connection); - } - } - - /** - * 当 gateway 关闭时触发,清理数据 - * - * @return void - */ - public function onWorkerStop() - { - // 尝试触发用户设置的回调 - if ($this->_onWorkerStop) { - call_user_func($this->_onWorkerStop, $this); - } - } - - /** - * Log. - * @param string $msg - */ - public static function log($msg){ - Timer::add(1, function() use ($msg) { - Worker::log($msg); - }, null, false); - } -} diff --git a/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Lib/Context.php b/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Lib/Context.php deleted file mode 100644 index 22ebccb5..00000000 --- a/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Lib/Context.php +++ /dev/null @@ -1,136 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace GatewayWorker\Lib; - -use Exception; - -/** - * 上下文 包含当前用户 uid, 内部通信 local_ip local_port socket_id,以及客户端 client_ip client_port - */ -class Context -{ - /** - * 内部通讯 id - * - * @var string - */ - public static $local_ip; - - /** - * 内部通讯端口 - * - * @var int - */ - public static $local_port; - - /** - * 客户端 ip - * - * @var string - */ - public static $client_ip; - - /** - * 客户端端口 - * - * @var int - */ - public static $client_port; - - /** - * client_id - * - * @var string - */ - public static $client_id; - - /** - * 连接 connection->id - * - * @var int - */ - public static $connection_id; - - /** - * 旧的session - * - * @var string - */ - public static $old_session; - - /** - * 编码 session - * - * @param mixed $session_data - * @return string - */ - public static function sessionEncode($session_data = '') - { - if ($session_data !== '') { - return serialize($session_data); - } - return ''; - } - - /** - * 解码 session - * - * @param string $session_buffer - * @return mixed - */ - public static function sessionDecode($session_buffer) - { - return unserialize($session_buffer); - } - - /** - * 清除上下文 - * - * @return void - */ - public static function clear() - { - self::$local_ip = self::$local_port = self::$client_ip = self::$client_port = - self::$client_id = self::$connection_id = self::$old_session = null; - } - - /** - * 通讯地址到 client_id 的转换 - * - * @param int $local_ip - * @param int $local_port - * @param int $connection_id - * @return string - */ - public static function addressToClientId($local_ip, $local_port, $connection_id) - { - return bin2hex(pack('NnN', $local_ip, $local_port, $connection_id)); - } - - /** - * client_id 到通讯地址的转换 - * - * @param string $client_id - * @return array - * @throws Exception - */ - public static function clientIdToAddress($client_id) - { - if (strlen($client_id) !== 20) { - echo new Exception("client_id $client_id is invalid"); - return false; - } - return unpack('Nlocal_ip/nlocal_port/Nconnection_id', pack('H*', $client_id)); - } -} diff --git a/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Lib/Db.php b/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Lib/Db.php deleted file mode 100644 index 9f0e4b66..00000000 --- a/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Lib/Db.php +++ /dev/null @@ -1,76 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace GatewayWorker\Lib; - -use Config\Db as DbConfig; -use Exception; - -/** - * 数据库类 - */ -class Db -{ - /** - * 实例数组 - * - * @var array - */ - protected static $instance = array(); - - /** - * 获取实例 - * - * @param string $config_name - * @return DbConnection - * @throws Exception - */ - public static function instance($config_name) - { - if (!isset(DbConfig::$$config_name)) { - echo "\\Config\\Db::$config_name not set\n"; - throw new Exception("\\Config\\Db::$config_name not set\n"); - } - - if (empty(self::$instance[$config_name])) { - $config = DbConfig::$$config_name; - self::$instance[$config_name] = new DbConnection($config['host'], $config['port'], - $config['user'], $config['password'], $config['dbname'],$config['charset']); - } - return self::$instance[$config_name]; - } - - /** - * 关闭数据库实例 - * - * @param string $config_name - */ - public static function close($config_name) - { - if (isset(self::$instance[$config_name])) { - self::$instance[$config_name]->closeConnection(); - self::$instance[$config_name] = null; - } - } - - /** - * 关闭所有数据库实例 - */ - public static function closeAll() - { - foreach (self::$instance as $connection) { - $connection->closeConnection(); - } - self::$instance = array(); - } -} diff --git a/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Lib/DbConnection.php b/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Lib/DbConnection.php deleted file mode 100644 index df6daffc..00000000 --- a/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Lib/DbConnection.php +++ /dev/null @@ -1,1976 +0,0 @@ -type = 'SELECT'; - if (!is_array($cols)) { - $cols = array($cols); - } - $this->cols($cols); - return $this; - } - - /** - * 从哪个表删除 - * - * @param string $table - * @return self - */ - public function delete($table) - { - $this->type = 'DELETE'; - $this->table = $this->quoteName($table); - $this->fromRaw($this->quoteName($table)); - return $this; - } - - /** - * 更新哪个表 - * - * @param string $table - * @return self - */ - public function update($table) - { - $this->type = 'UPDATE'; - $this->table = $this->quoteName($table); - return $this; - } - - /** - * 向哪个表插入 - * - * @param string $table - * @return self - */ - public function insert($table) - { - $this->type = 'INSERT'; - $this->table = $this->quoteName($table); - return $this; - } - - /** - * - * 设置 SQL_CALC_FOUND_ROWS 标记. - * - * @param bool $enable - * @return self - */ - public function calcFoundRows($enable = true) - { - $this->setFlag('SQL_CALC_FOUND_ROWS', $enable); - return $this; - } - - /** - * 设置 SQL_CACHE 标记 - * - * @param bool $enable - * @return self - */ - public function cache($enable = true) - { - $this->setFlag('SQL_CACHE', $enable); - return $this; - } - - /** - * 设置 SQL_NO_CACHE 标记 - * - * @param bool $enable - * @return self - */ - public function noCache($enable = true) - { - $this->setFlag('SQL_NO_CACHE', $enable); - return $this; - } - - /** - * 设置 STRAIGHT_JOIN 标记. - * - * @param bool $enable - * @return self - */ - public function straightJoin($enable = true) - { - $this->setFlag('STRAIGHT_JOIN', $enable); - return $this; - } - - /** - * 设置 HIGH_PRIORITY 标记 - * - * @param bool $enable - * @return self - */ - public function highPriority($enable = true) - { - $this->setFlag('HIGH_PRIORITY', $enable); - return $this; - } - - /** - * 设置 SQL_SMALL_RESULT 标记 - * - * @param bool $enable - * @return self - */ - public function smallResult($enable = true) - { - $this->setFlag('SQL_SMALL_RESULT', $enable); - return $this; - } - - /** - * 设置 SQL_BIG_RESULT 标记 - * - * @param bool $enable - * @return self - */ - public function bigResult($enable = true) - { - $this->setFlag('SQL_BIG_RESULT', $enable); - return $this; - } - - /** - * 设置 SQL_BUFFER_RESULT 标记 - * - * @param bool $enable - * @return self - */ - public function bufferResult($enable = true) - { - $this->setFlag('SQL_BUFFER_RESULT', $enable); - return $this; - } - - /** - * 设置 FOR UPDATE 标记 - * - * @param bool $enable - * @return self - */ - public function forUpdate($enable = true) - { - $this->for_update = (bool)$enable; - return $this; - } - - /** - * 设置 DISTINCT 标记 - * - * @param bool $enable - * @return self - */ - public function distinct($enable = true) - { - $this->setFlag('DISTINCT', $enable); - return $this; - } - - /** - * 设置 LOW_PRIORITY 标记 - * - * @param bool $enable - * @return self - */ - public function lowPriority($enable = true) - { - $this->setFlag('LOW_PRIORITY', $enable); - return $this; - } - - /** - * 设置 IGNORE 标记 - * - * @param bool $enable - * @return self - */ - public function ignore($enable = true) - { - $this->setFlag('IGNORE', $enable); - return $this; - } - - /** - * 设置 QUICK 标记 - * - * @param bool $enable - * @return self - */ - public function quick($enable = true) - { - $this->setFlag('QUICK', $enable); - return $this; - } - - /** - * 设置 DELAYED 标记 - * - * @param bool $enable - * @return self - */ - public function delayed($enable = true) - { - $this->setFlag('DELAYED', $enable); - return $this; - } - - /** - * 序列化 - * - * @return string - */ - public function __toString() - { - $union = ''; - if ($this->union) { - $union = implode(' ', $this->union) . ' '; - } - return $union . $this->build(); - } - - /** - * 设置每页多少条记录 - * - * @param int $paging - * @return self - */ - public function setPaging($paging) - { - $this->paging = (int)$paging; - return $this; - } - - /** - * 获取每页多少条记录 - * - * @return int - */ - public function getPaging() - { - return $this->paging; - } - - /** - * 获取绑定在占位符上的值 - */ - public function getBindValues() - { - switch ($this->type) { - case 'SELECT': - return $this->getBindValuesSELECT(); - case 'DELETE': - case 'UPDATE': - case 'INSERT': - return $this->getBindValuesCOMMON(); - default : - throw new Exception("type err"); - } - } - - /** - * 获取绑定在占位符上的值 - * - * @return array - */ - public function getBindValuesSELECT() - { - $bind_values = $this->bind_values; - $i = 1; - foreach ($this->bind_where as $val) { - $bind_values[$i] = $val; - $i++; - } - foreach ($this->bind_having as $val) { - $bind_values[$i] = $val; - $i++; - } - return $bind_values; - } - - /** - * - * SELECT选择哪些列 - * - * @param mixed $key - * @param string $val - * @return void - */ - protected function addColSELECT($key, $val) - { - if (is_string($key)) { - $this->cols[$val] = $key; - } else { - $this->addColWithAlias($val); - } - } - - /** - * SELECT 增加选择的列 - * - * @param string $spec - */ - protected function addColWithAlias($spec) - { - $parts = explode(' ', $spec); - $count = count($parts); - if ($count == 2) { - $this->cols[$parts[1]] = $parts[0]; - } elseif ($count == 3 && strtoupper($parts[1]) == 'AS') { - $this->cols[$parts[2]] = $parts[0]; - } else { - $this->cols[] = $spec; - } - } - - /** - * from 哪个表 - * - * @param string $table - * @return self - */ - public function from($table) - { - return $this->fromRaw($this->quoteName($table)); - } - - /** - * from的表 - * - * @param string $table - * @return self - */ - public function fromRaw($table) - { - $this->from[] = array($table); - $this->from_key++; - return $this; - } - - /** - * - * 子查询 - * - * @param string $table - * @param string $name The alias name for the sub-select. - * @return self - */ - public function fromSubSelect($table, $name) - { - $this->from[] = array("($table) AS " . $this->quoteName($name)); - $this->from_key++; - return $this; - } - - - /** - * 增加 join 语句 - * - * @param string $table - * @param string $cond - * @param string $type - * @return self - * @throws Exception - */ - public function join($table, $cond = null, $type = '') - { - return $this->joinInternal($type, $table, $cond); - } - - /** - * 增加 join 语句 - * - * @param string $join inner, left, natural - * @param string $table - * @param string $cond - * @return self - * @throws Exception - */ - protected function joinInternal($join, $table, $cond = null) - { - if (!$this->from) { - throw new Exception('Cannot join() without from()'); - } - - $join = strtoupper(ltrim("$join JOIN")); - $table = $this->quoteName($table); - $cond = $this->fixJoinCondition($cond); - $this->from[$this->from_key][] = rtrim("$join $table $cond"); - return $this; - } - - /** - * quote - * - * @param string $cond - * @return string - * - */ - protected function fixJoinCondition($cond) - { - if (!$cond) { - return ''; - } - - $cond = $this->quoteNamesIn($cond); - - if (strtoupper(substr(ltrim($cond), 0, 3)) == 'ON ') { - return $cond; - } - - if (strtoupper(substr(ltrim($cond), 0, 6)) == 'USING ') { - return $cond; - } - - return 'ON ' . $cond; - } - - /** - * inner join - * - * @param string $table - * @param string $cond - * @return self - * @throws Exception - */ - public function innerJoin($table, $cond = null) - { - return $this->joinInternal('INNER', $table, $cond); - } - - /** - * left join - * - * @param string $table - * @param string $cond - * @return self - * @throws Exception - */ - public function leftJoin($table, $cond = null) - { - return $this->joinInternal('LEFT', $table, $cond); - } - - /** - * right join - * - * @param string $table - * @param string $cond - * @return self - * @throws Exception - */ - public function rightJoin($table, $cond = null) - { - return $this->joinInternal('RIGHT', $table, $cond); - } - - /** - * joinSubSelect - * - * @param string $join inner, left, natural - * @param string $spec - * @param string $name sub-select 的别名 - * @param string $cond - * @return self - * @throws Exception - */ - public function joinSubSelect($join, $spec, $name, $cond = null) - { - if (!$this->from) { - throw new \Exception('Cannot join() without from() first.'); - } - - $join = strtoupper(ltrim("$join JOIN")); - $name = $this->quoteName($name); - $cond = $this->fixJoinCondition($cond); - $this->from[$this->from_key][] = rtrim("$join ($spec) AS $name $cond"); - return $this; - } - - /** - * group by 语句 - * - * @param array $cols - * @return self - */ - public function groupBy(array $cols) - { - foreach ($cols as $col) { - $this->group_by[] = $this->quoteNamesIn($col); - } - return $this; - } - - /** - * having 语句 - * - * @param string $cond - * @return self - */ - public function having($cond) - { - $this->addClauseCondWithBind('having', 'AND', func_get_args()); - return $this; - } - - /** - * or having 语句 - * - * @param string $cond The HAVING condition. - * @return self - */ - public function orHaving($cond) - { - $this->addClauseCondWithBind('having', 'OR', func_get_args()); - return $this; - } - - /** - * 设置每页的记录数量 - * - * @param int $page - * @return self - */ - public function page($page) - { - $this->limit = 0; - $this->offset = 0; - - $page = (int)$page; - if ($page > 0) { - $this->limit = $this->paging; - $this->offset = $this->paging * ($page - 1); - } - return $this; - } - - /** - * union - * - * @return self - */ - public function union() - { - $this->union[] = $this->build() . ' UNION'; - $this->reset(); - return $this; - } - - /** - * unionAll - * - * @return self - */ - public function unionAll() - { - $this->union[] = $this->build() . ' UNION ALL'; - $this->reset(); - return $this; - } - - /** - * 重置 - */ - protected function reset() - { - $this->resetFlags(); - $this->cols = array(); - $this->from = array(); - $this->from_key = -1; - $this->where = array(); - $this->group_by = array(); - $this->having = array(); - $this->order_by = array(); - $this->limit = 0; - $this->offset = 0; - $this->for_update = false; - } - - /** - * 清除所有数据 - */ - protected function resetAll() - { - $this->union = array(); - $this->for_update = false; - $this->cols = array(); - $this->from = array(); - $this->from_key = -1; - $this->group_by = array(); - $this->having = array(); - $this->bind_having = array(); - $this->paging = 10; - $this->bind_values = array(); - $this->where = array(); - $this->bind_where = array(); - $this->order_by = array(); - $this->limit = 0; - $this->offset = 0; - $this->flags = array(); - $this->table = ''; - $this->last_insert_id_names = array(); - $this->col_values = array(); - $this->returning = array(); - $this->parameters = array(); - } - - /** - * 创建 SELECT SQL - * - * @return string - */ - protected function buildSELECT() - { - return 'SELECT' - . $this->buildFlags() - . $this->buildCols() - . $this->buildFrom() - . $this->buildWhere() - . $this->buildGroupBy() - . $this->buildHaving() - . $this->buildOrderBy() - . $this->buildLimit() - . $this->buildForUpdate(); - } - - /** - * 创建 DELETE SQL - */ - protected function buildDELETE() - { - return 'DELETE' - . $this->buildFlags() - . $this->buildFrom() - . $this->buildWhere() - . $this->buildOrderBy() - . $this->buildLimit() - . $this->buildReturning(); - } - - /** - * 生成 SELECT 列语句 - * - * @return string - * @throws Exception - */ - protected function buildCols() - { - if (!$this->cols) { - throw new Exception('No columns in the SELECT.'); - } - - $cols = array(); - foreach ($this->cols as $key => $val) { - if (is_int($key)) { - $cols[] = $this->quoteNamesIn($val); - } else { - $cols[] = $this->quoteNamesIn("$val AS $key"); - } - } - - return $this->indentCsv($cols); - } - - /** - * 生成 FROM 语句. - * - * @return string - */ - protected function buildFrom() - { - if (!$this->from) { - return ''; - } - - $refs = array(); - foreach ($this->from as $from) { - $refs[] = implode(' ', $from); - } - return ' FROM' . $this->indentCsv($refs); - } - - /** - * 生成 GROUP BY 语句. - * - * @return string - */ - protected function buildGroupBy() - { - if (!$this->group_by) { - return ''; - } - return ' GROUP BY' . $this->indentCsv($this->group_by); - } - - /** - * 生成 HAVING 语句. - * - * @return string - */ - protected function buildHaving() - { - if (!$this->having) { - return ''; - } - return ' HAVING' . $this->indent($this->having); - } - - /** - * 生成 FOR UPDATE 语句 - * - * @return string - */ - protected function buildForUpdate() - { - if (!$this->for_update) { - return ''; - } - return ' FOR UPDATE'; - } - - /** - * where - * - * @param string|array $cond - * @return self - */ - public function where($cond) - { - if (is_array($cond)) { - foreach ($cond as $key => $val) { - if (is_string($key)) { - $this->addWhere('AND', array($key, $val)); - } else { - $this->addWhere('AND', array($val)); - } - } - } else { - $this->addWhere('AND', func_get_args()); - } - return $this; - } - - /** - * or where - * - * @param string|array $cond - * @return self - */ - public function orWhere($cond) - { - if (is_array($cond)) { - foreach ($cond as $key => $val) { - if (is_string($key)) { - $this->addWhere('OR', array($key, $val)); - } else { - $this->addWhere('OR', array($val)); - } - } - } else { - $this->addWhere('OR', func_get_args()); - } - return $this; - } - - /** - * limit - * - * @param int $limit - * @return self - */ - public function limit($limit) - { - $this->limit = (int)$limit; - return $this; - } - - /** - * limit offset - * - * @param int $offset - * @return self - */ - public function offset($offset) - { - $this->offset = (int)$offset; - return $this; - } - - /** - * orderby. - * - * @param array $cols - * @return self - */ - public function orderBy(array $cols) - { - return $this->addOrderBy($cols); - } - - /** - * order by ASC OR DESC - * - * @param array $cols - * @param bool $order_asc - * @return self - */ - public function orderByASC(array $cols, $order_asc = true) - { - $this->order_asc = $order_asc; - return $this->addOrderBy($cols); - } - - /** - * order by DESC - * - * @param array $cols - * @return self - */ - public function orderByDESC(array $cols) - { - $this->order_asc = false; - return $this->addOrderBy($cols); - } - - // -------------abstractquery---------- - /** - * 返回逗号分隔的字符串 - * - * @param array $list - * @return string - */ - protected function indentCsv(array $list) - { - return ' ' . implode(',', $list); - } - - /** - * 返回空格分隔的字符串 - * - * @param array $list - * @return string - */ - protected function indent(array $list) - { - return ' ' . implode(' ', $list); - } - - /** - * 批量为占位符绑定值 - * - * @param array $bind_values - * @return self - * - */ - public function bindValues(array $bind_values) - { - foreach ($bind_values as $key => $val) { - $this->bindValue($key, $val); - } - return $this; - } - - /** - * 单个为占位符绑定值 - * - * @param string $name - * @param mixed $value - * @return self - */ - public function bindValue($name, $value) - { - $this->bind_values[$name] = $value; - return $this; - } - - /** - * 生成 flag - * - * @return string - */ - protected function buildFlags() - { - if (!$this->flags) { - return ''; - } - return ' ' . implode(' ', array_keys($this->flags)); - } - - /** - * 设置 flag. - * - * @param string $flag - * @param bool $enable - */ - protected function setFlag($flag, $enable = true) - { - if ($enable) { - $this->flags[$flag] = true; - } else { - unset($this->flags[$flag]); - } - } - - /** - * 重置 flag - */ - protected function resetFlags() - { - $this->flags = array(); - } - - /** - * - * 添加 where 语句 - * - * @param string $andor 'AND' or 'OR - * @param array $conditions - * @return self - * - */ - protected function addWhere($andor, $conditions) - { - $this->addClauseCondWithBind('where', $andor, $conditions); - return $this; - } - - /** - * 添加条件和绑定值 - * - * @param string $clause where 、having等 - * @param string $andor AND、OR等 - * @param array $conditions - */ - protected function addClauseCondWithBind($clause, $andor, $conditions) - { - $cond = array_shift($conditions); - $cond = $this->quoteNamesIn($cond); - - $bind =& $this->{"bind_{$clause}"}; - foreach ($conditions as $value) { - $bind[] = $value; - } - - $clause =& $this->$clause; - if ($clause) { - $clause[] = "$andor $cond"; - } else { - $clause[] = $cond; - } - } - - /** - * 生成 where 语句 - * - * @return string - */ - protected function buildWhere() - { - if (!$this->where) { - return ''; - } - return ' WHERE' . $this->indent($this->where); - } - - /** - * 增加 order by - * - * @param array $spec The columns and direction to order by. - * @return self - */ - protected function addOrderBy(array $spec) - { - foreach ($spec as $col) { - $this->order_by[] = $this->quoteNamesIn($col); - } - return $this; - } - - /** - * 生成 order by 语句 - * - * @return string - */ - protected function buildOrderBy() - { - if (!$this->order_by) { - return ''; - } - - if ($this->order_asc) { - return ' ORDER BY' . $this->indentCsv($this->order_by) . ' ASC'; - } else { - return ' ORDER BY' . $this->indentCsv($this->order_by) . ' DESC'; - } - } - - /** - * 生成 limit 语句 - * - * @return string - */ - protected function buildLimit() - { - $has_limit = $this->type == 'DELETE' || $this->type == 'UPDATE'; - $has_offset = $this->type == 'SELECT'; - - if ($has_offset && $this->limit) { - $clause = " LIMIT {$this->limit}"; - if ($this->offset) { - $clause .= " OFFSET {$this->offset}"; - } - return $clause; - } elseif ($has_limit && $this->limit) { - return " LIMIT {$this->limit}"; - } - return ''; - } - - /** - * Quotes - * - * @param string $spec - * @return string|array - */ - public function quoteName($spec) - { - $spec = trim($spec); - $seps = array(' AS ', ' ', '.'); - foreach ($seps as $sep) { - $pos = strripos($spec, $sep); - if ($pos) { - return $this->quoteNameWithSeparator($spec, $sep, $pos); - } - } - return $this->replaceName($spec); - } - - /** - * 指定分隔符的 Quotes - * - * @param string $spec - * @param string $sep - * @param int $pos - * @return string - */ - protected function quoteNameWithSeparator($spec, $sep, $pos) - { - $len = strlen($sep); - $part1 = $this->quoteName(substr($spec, 0, $pos)); - $part2 = $this->replaceName(substr($spec, $pos + $len)); - return "{$part1}{$sep}{$part2}"; - } - - /** - * Quotes "table.col" 格式的字符串 - * - * @param string $text - * @return string|array - */ - public function quoteNamesIn($text) - { - $list = $this->getListForQuoteNamesIn($text); - $last = count($list) - 1; - $text = null; - foreach ($list as $key => $val) { - if (($key + 1) % 3) { - $text .= $this->quoteNamesInLoop($val, $key == $last); - } - } - return $text; - } - - /** - * 返回 quote 元素列表 - * - * @param string $text - * @return array - */ - protected function getListForQuoteNamesIn($text) - { - $apos = "'"; - $quot = '"'; - return preg_split( - "/(($apos+|$quot+|\\$apos+|\\$quot+).*?\\2)/", - $text, - -1, - PREG_SPLIT_DELIM_CAPTURE - ); - } - - /** - * 循环 quote - * - * @param string $val - * @param bool $is_last - * @return string - */ - protected function quoteNamesInLoop($val, $is_last) - { - if ($is_last) { - return $this->replaceNamesAndAliasIn($val); - } - return $this->replaceNamesIn($val); - } - - /** - * 替换成别名 - * - * @param string $val - * @return string - */ - protected function replaceNamesAndAliasIn($val) - { - $quoted = $this->replaceNamesIn($val); - $pos = strripos($quoted, ' AS '); - if ($pos) { - $alias = $this->replaceName(substr($quoted, $pos + 4)); - $quoted = substr($quoted, 0, $pos) . " AS $alias"; - } - return $quoted; - } - - /** - * Quotes name - * - * @param string $name - * @return string - */ - protected function replaceName($name) - { - $name = trim($name); - if ($name == '*') { - return $name; - } - return '`' . $name . '`'; - } - - /** - * Quotes - * - * @param string $text - * @return string|array - */ - protected function replaceNamesIn($text) - { - $is_string_literal = strpos($text, "'") !== false - || strpos($text, '"') !== false; - if ($is_string_literal) { - return $text; - } - - $word = '[a-z_][a-z0-9_]+'; - - $find = "/(\\b)($word)\\.($word)(\\b)/i"; - - $repl = '$1`$2`.`$3`$4'; - - $text = preg_replace($find, $repl, $text); - - return $text; - } - - // ---------- insert -------------- - /** - * 设置 `table.column` 与 last-insert-id 的映射 - * - * @param array $last_insert_id_names - */ - public function setLastInsertIdNames(array $last_insert_id_names) - { - $this->last_insert_id_names = $last_insert_id_names; - } - - /** - * insert into. - * - * @param string $table - * @return self - */ - public function into($table) - { - $this->table = $this->quoteName($table); - return $this; - } - - /** - * 生成 INSERT 语句 - * - * @return string - */ - protected function buildINSERT() - { - return 'INSERT' - . $this->buildFlags() - . $this->buildInto() - . $this->buildValuesForInsert() - . $this->buildReturning(); - } - - /** - * 生成 INTO 语句 - * - * @return string - */ - protected function buildInto() - { - return " INTO " . $this->table; - } - - /** - * PDO::lastInsertId() - * - * @param string $col - * @return mixed - */ - public function getLastInsertIdName($col) - { - $key = str_replace('`', '', $this->table) . '.' . $col; - if (isset($this->last_insert_id_names[$key])) { - return $this->last_insert_id_names[$key]; - } - - return null; - } - - /** - * 设置一列,如果有第二各参数,则把第二个参数绑定在占位符上 - * - * @param string $col - * @return self - */ - public function col($col) - { - return call_user_func_array(array($this, 'addCol'), func_get_args()); - } - - /** - * 设置多列 - * - * @param array $cols - * @return self - */ - public function cols(array $cols) - { - if ($this->type == 'SELECT') { - foreach ($cols as $key => $val) { - $this->addColSELECT($key, $val); - } - return $this; - } - return $this->addCols($cols); - } - - /** - * 直接设置列的值 - * - * @param string $col - * @param string $value - * @return self - */ - public function set($col, $value) - { - return $this->setCol($col, $value); - } - - /** - * 为 INSERT 语句绑定值 - * - * @return string - */ - protected function buildValuesForInsert() - { - return ' (' . $this->indentCsv(array_keys($this->col_values)) . ') VALUES (' . - $this->indentCsv(array_values($this->col_values)) . ')'; - } - - // ------update------- - /** - * 更新哪个表 - * - * @param string $table - * @return self - */ - public function table($table) - { - $this->table = $this->quoteName($table); - return $this; - } - - /** - * 生成完整 SQL 语句 - * - * @return string - * @throws Exception - */ - protected function build() - { - switch ($this->type) { - case 'DELETE': - return $this->buildDELETE(); - case 'INSERT': - return $this->buildINSERT(); - case 'UPDATE': - return $this->buildUPDATE(); - case 'SELECT': - return $this->buildSELECT(); - } - throw new Exception("type empty"); - } - - /** - * 生成更新的 SQL 语句 - */ - protected function buildUPDATE() - { - return 'UPDATE' - . $this->buildFlags() - . $this->buildTable() - . $this->buildValuesForUpdate() - . $this->buildWhere() - . $this->buildOrderBy() - . $this->buildLimit() - . $this->buildReturning(); - } - - /** - * 哪个表 - * - * @return string - */ - protected function buildTable() - { - return " {$this->table}"; - } - - /** - * 为更新语句绑定值 - * - * @return string - */ - protected function buildValuesForUpdate() - { - $values = array(); - foreach ($this->col_values as $col => $value) { - $values[] = "{$col} = {$value}"; - } - return ' SET' . $this->indentCsv($values); - } - - // ----------Dml--------------- - /** - * 获取绑定的值 - * - * @return array - */ - public function getBindValuesCOMMON() - { - $bind_values = $this->bind_values; - $i = 1; - foreach ($this->bind_where as $val) { - $bind_values[$i] = $val; - $i++; - } - return $bind_values; - } - - /** - * 设置列 - * - * @param string $col - * @return self - */ - protected function addCol($col) - { - $key = $this->quoteName($col); - $this->col_values[$key] = ":$col"; - $args = func_get_args(); - if (count($args) > 1) { - $this->bindValue($col, $args[1]); - } - return $this; - } - - /** - * 设置多个列 - * - * @param array $cols - * @return self - */ - protected function addCols(array $cols) - { - foreach ($cols as $key => $val) { - if (is_int($key)) { - $this->addCol($val); - } else { - $this->addCol($key, $val); - } - } - return $this; - } - - /** - * 设置单列的值 - * - * @param string $col . - * @param string $value - * @return self - */ - protected function setCol($col, $value) - { - if ($value === null) { - $value = 'NULL'; - } - - $key = $this->quoteName($col); - $value = $this->quoteNamesIn($value); - $this->col_values[$key] = $value; - return $this; - } - - /** - * 增加返回的列 - * - * @param array $cols - * @return self - * - */ - protected function addReturning(array $cols) - { - foreach ($cols as $col) { - $this->returning[] = $this->quoteNamesIn($col); - } - return $this; - } - - /** - * 生成 RETURNING 语句 - * - * @return string - */ - protected function buildReturning() - { - if (!$this->returning) { - return ''; - } - return ' RETURNING' . $this->indentCsv($this->returning); - } - - /** - * 构造函数 - * - * @param string $host - * @param int $port - * @param string $user - * @param string $password - * @param string $db_name - * @param string $charset - */ - public function __construct($host, $port, $user, $password, $db_name, $charset = 'utf8') - { - $this->settings = array( - 'host' => $host, - 'port' => $port, - 'user' => $user, - 'password' => $password, - 'dbname' => $db_name, - 'charset' => $charset, - ); - $this->connect(); - } - - /** - * 创建 PDO 实例 - */ - protected function connect() - { - $dsn = 'mysql:dbname=' . $this->settings["dbname"] . ';host=' . - $this->settings["host"] . ';port=' . $this->settings['port']; - $this->pdo = new PDO($dsn, $this->settings["user"], $this->settings["password"], - array( - PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES ' . (!empty($this->settings['charset']) ? - $this->settings['charset'] : 'utf8') - )); - $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - $this->pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false); - $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); - } - - /** - * 关闭连接 - */ - public function closeConnection() - { - $this->pdo = null; - } - - /** - * 执行 - * - * @param string $query - * @param string $parameters - * @throws PDOException - */ - protected function execute($query, $parameters = "") - { - try { - $this->sQuery = @$this->pdo->prepare($query); - $this->bindMore($parameters); - if (!empty($this->parameters)) { - foreach ($this->parameters as $param) { - $parameters = explode("\x7F", $param); - $this->sQuery->bindParam($parameters[0], $parameters[1]); - } - } - $this->success = $this->sQuery->execute(); - } catch (PDOException $e) { - // 服务端断开时重连一次 - if ($e->errorInfo[1] == 2006 || $e->errorInfo[1] == 2013) { - $this->closeConnection(); - $this->connect(); - - try { - $this->sQuery = $this->pdo->prepare($query); - $this->bindMore($parameters); - if (!empty($this->parameters)) { - foreach ($this->parameters as $param) { - $parameters = explode("\x7F", $param); - $this->sQuery->bindParam($parameters[0], $parameters[1]); - } - } - $this->success = $this->sQuery->execute(); - } catch (PDOException $ex) { - $this->rollBackTrans(); - throw $ex; - } - } else { - $this->rollBackTrans(); - $msg = $e->getMessage(); - $err_msg = "SQL:".$this->lastSQL()." ".$msg; - $exception = new \PDOException($err_msg, (int)$e->getCode()); - throw $exception; - } - } - $this->parameters = array(); - } - - /** - * 绑定 - * - * @param string $para - * @param string $value - */ - public function bind($para, $value) - { - if (is_string($para)) { - $this->parameters[sizeof($this->parameters)] = ":" . $para . "\x7F" . $value; - } else { - $this->parameters[sizeof($this->parameters)] = $para . "\x7F" . $value; - } - } - - /** - * 绑定多个 - * - * @param array $parray - */ - public function bindMore($parray) - { - if (empty($this->parameters) && is_array($parray)) { - $columns = array_keys($parray); - foreach ($columns as $i => &$column) { - $this->bind($column, $parray[$column]); - } - } - } - - /** - * 执行 SQL - * - * @param string $query - * @param array $params - * @param int $fetchmode - * @return mixed - */ - public function query($query = '', $params = null, $fetchmode = PDO::FETCH_ASSOC) - { - $query = trim($query); - if (empty($query)) { - $query = $this->build(); - if (!$params) { - $params = $this->getBindValues(); - } - } - - $this->resetAll(); - $this->lastSql = $query; - - $this->execute($query, $params); - - $rawStatement = explode(" ", $query); - - $statement = strtolower(trim($rawStatement[0])); - if ($statement === 'select' || $statement === 'show') { - return $this->sQuery->fetchAll($fetchmode); - } elseif ($statement === 'update' || $statement === 'delete') { - return $this->sQuery->rowCount(); - } elseif ($statement === 'insert') { - if ($this->sQuery->rowCount() > 0) { - return $this->lastInsertId(); - } - } else { - return null; - } - - return null; - } - - /** - * 返回一列 - * - * @param string $query - * @param array $params - * @return array - */ - public function column($query = '', $params = null) - { - $query = trim($query); - if (empty($query)) { - $query = $this->build(); - if (!$params) { - $params = $this->getBindValues(); - } - } - - $this->resetAll(); - $this->lastSql = $query; - - $this->execute($query, $params); - $columns = $this->sQuery->fetchAll(PDO::FETCH_NUM); - $column = null; - foreach ($columns as $cells) { - $column[] = $cells[0]; - } - return $column; - } - - /** - * 返回一行 - * - * @param string $query - * @param array $params - * @param int $fetchmode - * @return array - */ - public function row($query = '', $params = null, $fetchmode = PDO::FETCH_ASSOC) - { - $query = trim($query); - if (empty($query)) { - $query = $this->build(); - if (!$params) { - $params = $this->getBindValues(); - } - } - - $this->resetAll(); - $this->lastSql = $query; - - $this->execute($query, $params); - return $this->sQuery->fetch($fetchmode); - } - - /** - * 返回单个值 - * - * @param string $query - * @param array $params - * @return string - */ - public function single($query = '', $params = null) - { - $query = trim($query); - if (empty($query)) { - $query = $this->build(); - if (!$params) { - $params = $this->getBindValues(); - } - } - - $this->resetAll(); - $this->lastSql = $query; - - $this->execute($query, $params); - return $this->sQuery->fetchColumn(); - } - - /** - * 返回 lastInsertId - * - * @return string - */ - public function lastInsertId() - { - return $this->pdo->lastInsertId(); - } - - /** - * 返回最后一条执行的 sql - * - * @return string - */ - public function lastSQL() - { - return $this->lastSql; - } - - /** - * 开始事务 - */ - public function beginTrans() - { - try { - $this->pdo->beginTransaction(); - } catch (PDOException $e) { - // 服务端断开时重连一次 - if ($e->errorInfo[1] == 2006 || $e->errorInfo[1] == 2013) { - $this->pdo->beginTransaction(); - } else { - throw $e; - } - } - } - - /** - * 提交事务 - */ - public function commitTrans() - { - $this->pdo->commit(); - } - - /** - * 事务回滚 - */ - public function rollBackTrans() - { - if ($this->pdo->inTransaction()) { - $this->pdo->rollBack(); - } - } -} diff --git a/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Lib/Gateway.php b/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Lib/Gateway.php deleted file mode 100644 index 8be26a18..00000000 --- a/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Lib/Gateway.php +++ /dev/null @@ -1,1371 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace GatewayWorker\Lib; - -use Exception; -use GatewayWorker\Protocols\GatewayProtocol; -use Workerman\Connection\TcpConnection; - -/** - * 数据发送相关 - */ -class Gateway -{ - /** - * gateway 实例 - * - * @var object - */ - protected static $businessWorker = null; - - /** - * 注册中心地址 - * - * @var string|array - */ - public static $registerAddress = '127.0.0.1:1236'; - - /** - * 秘钥 - * @var string - */ - public static $secretKey = ''; - - /** - * 链接超时时间 - * @var int - */ - public static $connectTimeout = 3; - - /** - * 与Gateway是否是长链接 - * @var bool - */ - public static $persistentConnection = false; - - /** - * 向所有客户端连接(或者 client_id_array 指定的客户端连接)广播消息 - * - * @param string $message 向客户端发送的消息 - * @param array $client_id_array 客户端 id 数组 - * @param array $exclude_client_id 不给这些client_id发 - * @param bool $raw 是否发送原始数据(即不调用gateway的协议的encode方法) - * @return void - * @throws Exception - */ - public static function sendToAll($message, $client_id_array = null, $exclude_client_id = null, $raw = false) - { - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_SEND_TO_ALL; - $gateway_data['body'] = $message; - if ($raw) { - $gateway_data['flag'] |= GatewayProtocol::FLAG_NOT_CALL_ENCODE; - } - - if ($exclude_client_id) { - if (!is_array($exclude_client_id)) { - $exclude_client_id = array($exclude_client_id); - } - if ($client_id_array) { - $exclude_client_id = array_flip($exclude_client_id); - } - } - - if ($client_id_array) { - if (!is_array($client_id_array)) { - echo new \Exception('bad $client_id_array:'.var_export($client_id_array, true)); - return; - } - $data_array = array(); - foreach ($client_id_array as $client_id) { - if (isset($exclude_client_id[$client_id])) { - continue; - } - $address = Context::clientIdToAddress($client_id); - if ($address) { - $key = long2ip($address['local_ip']) . ":{$address['local_port']}"; - $data_array[$key][$address['connection_id']] = $address['connection_id']; - } - } - foreach ($data_array as $addr => $connection_id_list) { - $the_gateway_data = $gateway_data; - $the_gateway_data['ext_data'] = json_encode(array('connections' => $connection_id_list)); - static::sendToGateway($addr, $the_gateway_data); - } - return; - } elseif (empty($client_id_array) && is_array($client_id_array)) { - return; - } - - if (!$exclude_client_id) { - return static::sendToAllGateway($gateway_data); - } - - $address_connection_array = static::clientIdArrayToAddressArray($exclude_client_id); - - // 如果有businessWorker实例,说明运行在workerman环境中,通过businessWorker中的长连接发送数据 - if (static::$businessWorker) { - foreach (static::$businessWorker->gatewayConnections as $address => $gateway_connection) { - $gateway_data['ext_data'] = isset($address_connection_array[$address]) ? - json_encode(array('exclude'=> $address_connection_array[$address])) : ''; - /** @var TcpConnection $gateway_connection */ - $gateway_connection->send($gateway_data); - } - } // 运行在其它环境中,通过注册中心得到gateway地址 - else { - $all_addresses = static::getAllGatewayAddressesFromRegister(); - foreach ($all_addresses as $address) { - $gateway_data['ext_data'] = isset($address_connection_array[$address]) ? - json_encode(array('exclude'=> $address_connection_array[$address])) : ''; - static::sendToGateway($address, $gateway_data); - } - } - - } - - /** - * 向某个client_id对应的连接发消息 - * - * @param string $client_id - * @param string $message - * @param bool $raw - * @return bool - */ - public static function sendToClient($client_id, $message, $raw = false) - { - return static::sendCmdAndMessageToClient($client_id, GatewayProtocol::CMD_SEND_TO_ONE, $message, '', $raw); - } - - /** - * 向当前客户端连接发送消息 - * - * @param string $message - * @param bool $raw - * @return bool - */ - public static function sendToCurrentClient($message, $raw = false) - { - return static::sendCmdAndMessageToClient(null, GatewayProtocol::CMD_SEND_TO_ONE, $message, '', $raw); - } - - /** - * 判断某个uid是否在线 - * - * @param string $uid - * @return int 0|1 - */ - public static function isUidOnline($uid) - { - return (int)static::getClientIdByUid($uid); - } - - /** - * 判断client_id对应的连接是否在线 - * - * @param string $client_id - * @return int 0|1 - */ - public static function isOnline($client_id) - { - $address_data = Context::clientIdToAddress($client_id); - if (!$address_data) { - return 0; - } - $address = long2ip($address_data['local_ip']) . ":{$address_data['local_port']}"; - if (isset(static::$businessWorker)) { - if (!isset(static::$businessWorker->gatewayConnections[$address])) { - return 0; - } - } - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_IS_ONLINE; - $gateway_data['connection_id'] = $address_data['connection_id']; - return (int)static::sendAndRecv($address, $gateway_data); - } - - /** - * 获取所有在线用户的session,client_id为 key(弃用,请用getAllClientSessions代替) - * - * @param string $group - * @return array - */ - public static function getAllClientInfo($group = '') - { - echo "Warning: Gateway::getAllClientInfo is deprecated and will be removed in a future, please use Gateway::getAllClientSessions instead."; - return static::getAllClientSessions($group); - } - - /** - * 获取所有在线client_id的session,client_id为 key - * - * @param string $group - * @return array - */ - public static function getAllClientSessions($group = '') - { - $gateway_data = GatewayProtocol::$empty; - if (!$group) { - $gateway_data['cmd'] = GatewayProtocol::CMD_GET_ALL_CLIENT_SESSIONS; - } else { - $gateway_data['cmd'] = GatewayProtocol::CMD_GET_CLIENT_SESSIONS_BY_GROUP; - $gateway_data['ext_data'] = $group; - } - $status_data = array(); - $all_buffer_array = static::getBufferFromAllGateway($gateway_data); - foreach ($all_buffer_array as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $data) { - if ($data) { - foreach ($data as $connection_id => $session_buffer) { - $client_id = Context::addressToClientId($local_ip, $local_port, $connection_id); - if ($client_id === Context::$client_id) { - $status_data[$client_id] = (array)$_SESSION; - } else { - $status_data[$client_id] = $session_buffer ? Context::sessionDecode($session_buffer) : array(); - } - } - } - } - } - return $status_data; - } - - /** - * 获取某个组的连接信息(弃用,请用getClientSessionsByGroup代替) - * - * @param string $group - * @return array - */ - public static function getClientInfoByGroup($group) - { - echo "Warning: Gateway::getClientInfoByGroup is deprecated and will be removed in a future, please use Gateway::getClientSessionsByGroup instead."; - return static::getAllClientSessions($group); - } - - /** - * 获取某个组的所有client_id的session信息 - * - * @param string $group - * - * @return array - */ - public static function getClientSessionsByGroup($group) - { - if (static::isValidGroupId($group)) { - return static::getAllClientSessions($group); - } - return array(); - } - - /** - * 获取所有在线client_id数 - * - * @return int - */ - public static function getAllClientIdCount() - { - return static::getClientCountByGroup(); - } - - /** - * 获取所有在线client_id数(getAllClientIdCount的别名) - * - * @return int - */ - public static function getAllClientCount() - { - return static::getAllClientIdCount(); - } - - /** - * 获取某个组的在线client_id数 - * - * @param string $group - * @return int - */ - public static function getClientIdCountByGroup($group = '') - { - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_GET_CLIENT_COUNT_BY_GROUP; - $gateway_data['ext_data'] = $group; - $total_count = 0; - $all_buffer_array = static::getBufferFromAllGateway($gateway_data); - foreach ($all_buffer_array as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $count) { - if ($count) { - $total_count += $count; - } - } - } - return $total_count; - } - - /** - * getClientIdCountByGroup 函数的别名 - * - * @param string $group - * @return int - */ - public static function getClientCountByGroup($group = '') - { - return static::getClientIdCountByGroup($group); - } - - /** - * 获取某个群组在线client_id列表 - * - * @param string $group - * @return array - */ - public static function getClientIdListByGroup($group) - { - if (!static::isValidGroupId($group)) { - return array(); - } - - $data = static::select(array('uid'), array('groups' => is_array($group) ? $group : array($group))); - $client_id_map = array(); - foreach ($data as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $items) { - //$items = ['connection_id'=>['uid'=>x, 'group'=>[x,x..], 'session'=>[..]], 'client_id'=>[..], ..]; - foreach ($items as $connection_id => $info) { - $client_id = Context::addressToClientId($local_ip, $local_port, $connection_id); - $client_id_map[$client_id] = $client_id; - } - } - } - return $client_id_map; - } - - /** - * 获取集群所有在线client_id列表 - * - * @return array - */ - public static function getAllClientIdList() - { - return static::formatClientIdFromGatewayBuffer(static::select(array('uid'))); - } - - /** - * 格式化client_id - * - * @param $data - * @return array - */ - protected static function formatClientIdFromGatewayBuffer($data) - { - $client_id_list = array(); - foreach ($data as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $items) { - //$items = ['connection_id'=>['uid'=>x, 'group'=>[x,x..], 'session'=>[..]], 'client_id'=>[..], ..]; - foreach ($items as $connection_id => $info) { - $client_id = Context::addressToClientId($local_ip, $local_port, $connection_id); - $client_id_list[$client_id] = $client_id; - } - } - } - return $client_id_list; - } - - - /** - * 获取与 uid 绑定的 client_id 列表 - * - * @param string $uid - * @return array - */ - public static function getClientIdByUid($uid) - { - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_GET_CLIENT_ID_BY_UID; - $gateway_data['ext_data'] = $uid; - $client_list = array(); - $all_buffer_array = static::getBufferFromAllGateway($gateway_data); - foreach ($all_buffer_array as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $connection_id_array) { - if ($connection_id_array) { - foreach ($connection_id_array as $connection_id) { - $client_list[] = Context::addressToClientId($local_ip, $local_port, $connection_id); - } - } - } - } - return $client_list; - } - - /** - * 获取某个群组在线uid列表 - * - * @param string $group - * @return array - */ - public static function getUidListByGroup($group) - { - if (!static::isValidGroupId($group)) { - return array(); - } - - $group = is_array($group) ? $group : array($group); - $data = static::select(array('uid'), array('groups' => $group)); - $uid_map = array(); - foreach ($data as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $items) { - //$items = ['connection_id'=>['uid'=>x, 'group'=>[x,x..], 'session'=>[..]], 'client_id'=>[..], ..]; - foreach ($items as $connection_id => $info) { - if (!empty($info['uid'])) { - $uid_map[$info['uid']] = $info['uid']; - } - } - } - } - return $uid_map; - } - - /** - * 获取某个群组在线uid数 - * - * @param string $group - * @return int - */ - public static function getUidCountByGroup($group) - { - if (static::isValidGroupId($group)) { - return count(static::getUidListByGroup($group)); - } - return 0; - } - - /** - * 获取全局在线uid列表 - * - * @return array - */ - public static function getAllUidList() - { - $data = static::select(array('uid')); - $uid_map = array(); - foreach ($data as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $items) { - //$items = ['connection_id'=>['uid'=>x, 'group'=>[x,x..], 'session'=>[..]], 'client_id'=>[..], ..]; - foreach ($items as $connection_id => $info) { - if (!empty($info['uid'])) { - $uid_map[$info['uid']] = $info['uid']; - } - } - } - } - return $uid_map; - } - - /** - * 获取全局在线uid数 - * @return int - */ - public static function getAllUidCount() - { - return count(static::getAllUidList()); - } - - /** - * 通过client_id获取uid - * - * @param $client_id - * @return mixed - */ - public static function getUidByClientId($client_id) - { - $data = static::select(array('uid'), array('client_id'=>array($client_id))); - foreach ($data as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $items) { - //$items = ['connection_id'=>['uid'=>x, 'group'=>[x,x..], 'session'=>[..]], 'client_id'=>[..], ..]; - foreach ($items as $info) { - return $info['uid']; - } - } - } - } - - /** - * 获取所有在线的群组id - * - * @return array - */ - public static function getAllGroupIdList() - { - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_GET_GROUP_ID_LIST; - $group_id_list = array(); - $all_buffer_array = static::getBufferFromAllGateway($gateway_data); - foreach ($all_buffer_array as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $group_id_array) { - if (is_array($group_id_array)) { - foreach ($group_id_array as $group_id) { - if (!isset($group_id_list[$group_id])) { - $group_id_list[$group_id] = $group_id; - } - } - } - } - } - return $group_id_list; - } - - - /** - * 获取所有在线分组的uid数量,也就是每个分组的在线用户数 - * - * @return array - */ - public static function getAllGroupUidCount() - { - $group_uid_map = static::getAllGroupUidList(); - $group_uid_count_map = array(); - foreach ($group_uid_map as $group_id => $uid_list) { - $group_uid_count_map[$group_id] = count($uid_list); - } - return $group_uid_count_map; - } - - - - /** - * 获取所有分组uid在线列表 - * - * @return array - */ - public static function getAllGroupUidList() - { - $data = static::select(array('uid','groups')); - $group_uid_map = array(); - foreach ($data as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $items) { - //$items = ['connection_id'=>['uid'=>x, 'group'=>[x,x..], 'session'=>[..]], 'client_id'=>[..], ..]; - foreach ($items as $connection_id => $info) { - if (empty($info['uid']) || empty($info['groups'])) { - break; - } - $uid = $info['uid']; - foreach ($info['groups'] as $group_id) { - if(!isset($group_uid_map[$group_id])) { - $group_uid_map[$group_id] = array(); - } - $group_uid_map[$group_id][$uid] = $uid; - } - } - } - } - return $group_uid_map; - } - - /** - * 获取所有群组在线client_id列表 - * - * @return array - */ - public static function getAllGroupClientIdList() - { - $data = static::select(array('groups')); - $group_client_id_map = array(); - foreach ($data as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $items) { - //$items = ['connection_id'=>['uid'=>x, 'group'=>[x,x..], 'session'=>[..]], 'client_id'=>[..], ..]; - foreach ($items as $connection_id => $info) { - if (empty($info['groups'])) { - break; - } - $client_id = Context::addressToClientId($local_ip, $local_port, $connection_id); - foreach ($info['groups'] as $group_id) { - if(!isset($group_client_id_map[$group_id])) { - $group_client_id_map[$group_id] = array(); - } - $group_client_id_map[$group_id][$client_id] = $client_id; - } - } - } - } - return $group_client_id_map; - } - - /** - * 获取所有群组在线client_id数量,也就是获取每个群组在线连接数 - * - * @return array - */ - public static function getAllGroupClientIdCount() - { - $group_client_map = static::getAllGroupClientIdList(); - $group_client_count_map = array(); - foreach ($group_client_map as $group_id => $client_id_list) { - $group_client_count_map[$group_id] = count($client_id_list); - } - return $group_client_count_map; - } - - - /** - * 根据条件到gateway搜索数据 - * - * @param array $fields - * @param array $where - * @return array - */ - protected static function select($fields = array('session','uid','groups'), $where = array()) - { - $t = microtime(true); - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_SELECT; - $gateway_data['ext_data'] = array('fields' => $fields, 'where' => $where); - $gateway_data_list = array(); - // 有client_id,能计算出需要和哪些gateway通讯,只和必要的gateway通讯能降低系统负载 - if (isset($where['client_id'])) { - $client_id_list = $where['client_id']; - unset($gateway_data['ext_data']['where']['client_id']); - $gateway_data['ext_data']['where']['connection_id'] = array(); - foreach ($client_id_list as $client_id) { - $address_data = Context::clientIdToAddress($client_id); - if (!$address_data) { - continue; - } - $address = long2ip($address_data['local_ip']) . ":{$address_data['local_port']}"; - if (!isset($gateway_data_list[$address])) { - $gateway_data_list[$address] = $gateway_data; - } - $gateway_data_list[$address]['ext_data']['where']['connection_id'][$address_data['connection_id']] = $address_data['connection_id']; - } - foreach ($gateway_data_list as $address => $item) { - $gateway_data_list[$address]['ext_data'] = json_encode($item['ext_data']); - } - // 有其它条件,则还是需要向所有gateway发送 - if (count($where) !== 1) { - $gateway_data['ext_data'] = json_encode($gateway_data['ext_data']); - foreach (static::getAllGatewayAddress() as $address) { - if (!isset($gateway_data_list[$address])) { - $gateway_data_list[$address] = $gateway_data; - } - } - } - $data = static::getBufferFromSomeGateway($gateway_data_list); - } else { - $gateway_data['ext_data'] = json_encode($gateway_data['ext_data']); - $data = static::getBufferFromAllGateway($gateway_data); - } - - return $data; - } - - /** - * 生成验证包,用于验证此客户端的合法性 - * - * @return string - */ - protected static function generateAuthBuffer() - { - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_GATEWAY_CLIENT_CONNECT; - $gateway_data['body'] = json_encode(array( - 'secret_key' => static::$secretKey, - )); - return GatewayProtocol::encode($gateway_data); - } - - /** - * 批量向某些gateway发包,并得到返回数组 - * - * @param array $gateway_data_array - * @return array - * @throws Exception - */ - protected static function getBufferFromSomeGateway($gateway_data_array) - { - $gateway_buffer_array = array(); - $auth_buffer = static::$secretKey ? static::generateAuthBuffer() : ''; - foreach ($gateway_data_array as $address => $gateway_data) { - if ($auth_buffer) { - $gateway_buffer_array[$address] = $auth_buffer.GatewayProtocol::encode($gateway_data); - } else { - $gateway_buffer_array[$address] = GatewayProtocol::encode($gateway_data); - } - } - return static::getBufferFromGateway($gateway_buffer_array); - } - - /** - * 批量向所有 gateway 发包,并得到返回数组 - * - * @param string $gateway_data - * @return array - * @throws Exception - */ - protected static function getBufferFromAllGateway($gateway_data) - { - $addresses = static::getAllGatewayAddress(); - $gateway_buffer_array = array(); - $gateway_buffer = GatewayProtocol::encode($gateway_data); - $gateway_buffer = static::$secretKey ? static::generateAuthBuffer() . $gateway_buffer : $gateway_buffer; - foreach ($addresses as $address) { - $gateway_buffer_array[$address] = $gateway_buffer; - } - - return static::getBufferFromGateway($gateway_buffer_array); - } - - /** - * 获取所有gateway内部通讯地址 - * - * @return array - * @throws Exception - */ - protected static function getAllGatewayAddress() - { - if (isset(static::$businessWorker)) { - $addresses = static::$businessWorker->getAllGatewayAddresses(); - if (empty($addresses)) { - throw new Exception('businessWorker::getAllGatewayAddresses return empty'); - } - } else { - $addresses = static::getAllGatewayAddressesFromRegister(); - if (empty($addresses)) { - return array(); - } - } - return $addresses; - } - - /** - * 批量向gateway发送并获取数据 - * @param $gateway_buffer_array - * @return array - */ - protected static function getBufferFromGateway($gateway_buffer_array) - { - $client_array = $status_data = $client_address_map = $receive_buffer_array = $recv_length_array = array(); - // 批量向所有gateway进程发送请求数据 - foreach ($gateway_buffer_array as $address => $gateway_buffer) { - $client = stream_socket_client("tcp://$address", $errno, $errmsg, static::$connectTimeout); - if ($client && strlen($gateway_buffer) === stream_socket_sendto($client, $gateway_buffer)) { - $socket_id = (int)$client; - $client_array[$socket_id] = $client; - $client_address_map[$socket_id] = explode(':', $address); - $receive_buffer_array[$socket_id] = ''; - } - } - // 超时5秒 - $timeout = 5; - $time_start = microtime(true); - // 批量接收请求 - while (count($client_array) > 0) { - $write = $except = array(); - $read = $client_array; - if (@stream_select($read, $write, $except, $timeout)) { - foreach ($read as $client) { - $socket_id = (int)$client; - $buffer = stream_socket_recvfrom($client, 65535); - if ($buffer !== '' && $buffer !== false) { - $receive_buffer_array[$socket_id] .= $buffer; - $receive_length = strlen($receive_buffer_array[$socket_id]); - if (empty($recv_length_array[$socket_id]) && $receive_length >= 4) { - $recv_length_array[$socket_id] = current(unpack('N', $receive_buffer_array[$socket_id])); - } - if (!empty($recv_length_array[$socket_id]) && $receive_length >= $recv_length_array[$socket_id] + 4) { - unset($client_array[$socket_id]); - } - } elseif (feof($client)) { - unset($client_array[$socket_id]); - } - } - } - if (microtime(true) - $time_start > $timeout) { - break; - } - } - $format_buffer_array = array(); - foreach ($receive_buffer_array as $socket_id => $buffer) { - $local_ip = ip2long($client_address_map[$socket_id][0]); - $local_port = $client_address_map[$socket_id][1]; - $format_buffer_array[$local_ip][$local_port] = unserialize(substr($buffer, 4)); - } - return $format_buffer_array; - } - - /** - * 踢掉某个客户端,并以$message通知被踢掉客户端 - * - * @param string $client_id - * @param string $message - * @return void - */ - public static function closeClient($client_id, $message = null) - { - if ($client_id === Context::$client_id) { - return static::closeCurrentClient($message); - } // 不是发给当前用户则使用存储中的地址 - else { - $address_data = Context::clientIdToAddress($client_id); - if (!$address_data) { - return false; - } - $address = long2ip($address_data['local_ip']) . ":{$address_data['local_port']}"; - return static::kickAddress($address, $address_data['connection_id'], $message); - } - } - - /** - * 踢掉当前客户端,并以$message通知被踢掉客户端 - * - * @param string $message - * @return bool - * @throws Exception - */ - public static function closeCurrentClient($message = null) - { - if (!Context::$connection_id) { - throw new Exception('closeCurrentClient can not be called in async context'); - } - $address = long2ip(Context::$local_ip) . ':' . Context::$local_port; - return static::kickAddress($address, Context::$connection_id, $message); - } - - /** - * 踢掉某个客户端并直接立即销毁相关连接 - * - * @param string $client_id - * @return bool - */ - public static function destoryClient($client_id) - { - if ($client_id === Context::$client_id) { - return static::destoryCurrentClient(); - } // 不是发给当前用户则使用存储中的地址 - else { - $address_data = Context::clientIdToAddress($client_id); - if (!$address_data) { - return false; - } - $address = long2ip($address_data['local_ip']) . ":{$address_data['local_port']}"; - return static::destroyAddress($address, $address_data['connection_id']); - } - } - - /** - * 踢掉当前客户端并直接立即销毁相关连接 - * - * @return bool - * @throws Exception - */ - public static function destoryCurrentClient() - { - if (!Context::$connection_id) { - throw new Exception('destoryCurrentClient can not be called in async context'); - } - $address = long2ip(Context::$local_ip) . ':' . Context::$local_port; - return static::destroyAddress($address, Context::$connection_id); - } - - /** - * 将 client_id 与 uid 绑定 - * - * @param string $client_id - * @param int|string $uid - * @return void - */ - public static function bindUid($client_id, $uid) - { - static::sendCmdAndMessageToClient($client_id, GatewayProtocol::CMD_BIND_UID, '', $uid); - } - - /** - * 将 client_id 与 uid 解除绑定 - * - * @param string $client_id - * @param int|string $uid - * @return void - */ - public static function unbindUid($client_id, $uid) - { - static::sendCmdAndMessageToClient($client_id, GatewayProtocol::CMD_UNBIND_UID, '', $uid); - } - - /** - * 将 client_id 加入组 - * - * @param string $client_id - * @param int|string $group - * @return void - */ - public static function joinGroup($client_id, $group) - { - - static::sendCmdAndMessageToClient($client_id, GatewayProtocol::CMD_JOIN_GROUP, '', $group); - } - - /** - * 将 client_id 离开组 - * - * @param string $client_id - * @param int|string $group - * - * @return void - */ - public static function leaveGroup($client_id, $group) - { - static::sendCmdAndMessageToClient($client_id, GatewayProtocol::CMD_LEAVE_GROUP, '', $group); - } - - /** - * 取消分组 - * - * @param int|string $group - * - * @return void - */ - public static function ungroup($group) - { - if (!static::isValidGroupId($group)) { - return false; - } - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_UNGROUP; - $gateway_data['ext_data'] = $group; - return static::sendToAllGateway($gateway_data); - - } - - /** - * 向所有 uid 发送 - * - * @param int|string|array $uid - * @param string $message - * @param bool $raw - * - * @return void - */ - public static function sendToUid($uid, $message, $raw = false) - { - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_SEND_TO_UID; - $gateway_data['body'] = $message; - if ($raw) { - $gateway_data['flag'] |= GatewayProtocol::FLAG_NOT_CALL_ENCODE; - } - - if (!is_array($uid)) { - $uid = array($uid); - } - - $gateway_data['ext_data'] = json_encode($uid); - - static::sendToAllGateway($gateway_data); - } - - /** - * 向 group 发送 - * - * @param int|string|array $group 组(不允许是 0 '0' false null array()等为空的值) - * @param string $message 消息 - * @param array $exclude_client_id 不给这些client_id发 - * @param bool $raw 发送原始数据(即不调用gateway的协议的encode方法) - * - * @return void - */ - public static function sendToGroup($group, $message, $exclude_client_id = null, $raw = false) - { - if (!static::isValidGroupId($group)) { - return false; - } - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_SEND_TO_GROUP; - $gateway_data['body'] = $message; - if ($raw) { - $gateway_data['flag'] |= GatewayProtocol::FLAG_NOT_CALL_ENCODE; - } - - if (!is_array($group)) { - $group = array($group); - } - - // 分组发送,没有排除的client_id,直接发送 - $default_ext_data_buffer = json_encode(array('group'=> $group, 'exclude'=> null)); - if (empty($exclude_client_id)) { - $gateway_data['ext_data'] = $default_ext_data_buffer; - return static::sendToAllGateway($gateway_data); - } - - // 分组发送,有排除的client_id,需要将client_id转换成对应gateway进程内的connectionId - if (!is_array($exclude_client_id)) { - $exclude_client_id = array($exclude_client_id); - } - - $address_connection_array = static::clientIdArrayToAddressArray($exclude_client_id); - // 如果有businessWorker实例,说明运行在workerman环境中,通过businessWorker中的长连接发送数据 - if (static::$businessWorker) { - foreach (static::$businessWorker->gatewayConnections as $address => $gateway_connection) { - $gateway_data['ext_data'] = isset($address_connection_array[$address]) ? - json_encode(array('group'=> $group, 'exclude'=> $address_connection_array[$address])) : - $default_ext_data_buffer; - /** @var TcpConnection $gateway_connection */ - $gateway_connection->send($gateway_data); - } - } // 运行在其它环境中,通过注册中心得到gateway地址 - else { - $addresses = static::getAllGatewayAddressesFromRegister(); - foreach ($addresses as $address) { - $gateway_data['ext_data'] = isset($address_connection_array[$address]) ? - json_encode(array('group'=> $group, 'exclude'=> $address_connection_array[$address])) : - $default_ext_data_buffer; - static::sendToGateway($address, $gateway_data); - } - } - } - - /** - * 更新 session,框架自动调用,开发者不要调用 - * - * @param string $client_id - * @param string $session_str - * @return bool - */ - public static function setSocketSession($client_id, $session_str) - { - return static::sendCmdAndMessageToClient($client_id, GatewayProtocol::CMD_SET_SESSION, '', $session_str); - } - - /** - * 设置 session,原session值会被覆盖 - * - * @param string $client_id - * @param array $session - * - * @return void - */ - public static function setSession($client_id, array $session) - { - if (Context::$client_id === $client_id) { - $_SESSION = $session; - Context::$old_session = $_SESSION; - } - static::setSocketSession($client_id, Context::sessionEncode($session)); - } - - /** - * 更新 session,实际上是与老的session合并 - * - * @param string $client_id - * @param array $session - * - * @return void - */ - public static function updateSession($client_id, array $session) - { - if (Context::$client_id === $client_id) { - $_SESSION = array_replace_recursive((array)$_SESSION, $session); - Context::$old_session = $_SESSION; - } - static::sendCmdAndMessageToClient($client_id, GatewayProtocol::CMD_UPDATE_SESSION, '', Context::sessionEncode($session)); - } - - /** - * 获取某个client_id的session - * - * @param string $client_id - * @return mixed false表示出错、null表示用户不存在、array表示具体的session信息 - */ - public static function getSession($client_id) - { - $address_data = Context::clientIdToAddress($client_id); - if (!$address_data) { - return false; - } - $address = long2ip($address_data['local_ip']) . ":{$address_data['local_port']}"; - if (isset(static::$businessWorker)) { - if (!isset(static::$businessWorker->gatewayConnections[$address])) { - return null; - } - } - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_GET_SESSION_BY_CLIENT_ID; - $gateway_data['connection_id'] = $address_data['connection_id']; - return static::sendAndRecv($address, $gateway_data); - } - - /** - * 向某个用户网关发送命令和消息 - * - * @param string $client_id - * @param int $cmd - * @param string $message - * @param string $ext_data - * @param bool $raw - * @return boolean - */ - protected static function sendCmdAndMessageToClient($client_id, $cmd, $message, $ext_data = '', $raw = false) - { - // 如果是发给当前用户则直接获取上下文中的地址 - if ($client_id === Context::$client_id || $client_id === null) { - $address = long2ip(Context::$local_ip) . ':' . Context::$local_port; - $connection_id = Context::$connection_id; - } else { - $address_data = Context::clientIdToAddress($client_id); - if (!$address_data) { - return false; - } - $address = long2ip($address_data['local_ip']) . ":{$address_data['local_port']}"; - $connection_id = $address_data['connection_id']; - } - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = $cmd; - $gateway_data['connection_id'] = $connection_id; - $gateway_data['body'] = $message; - if (!empty($ext_data)) { - $gateway_data['ext_data'] = $ext_data; - } - if ($raw) { - $gateway_data['flag'] |= GatewayProtocol::FLAG_NOT_CALL_ENCODE; - } - - return static::sendToGateway($address, $gateway_data); - } - - /** - * 发送数据并返回 - * - * @param int $address - * @param mixed $data - * @return bool - * @throws Exception - */ - protected static function sendAndRecv($address, $data) - { - $buffer = GatewayProtocol::encode($data); - $buffer = static::$secretKey ? static::generateAuthBuffer() . $buffer : $buffer; - $client = stream_socket_client("tcp://$address", $errno, $errmsg, static::$connectTimeout); - if (!$client) { - throw new Exception("can not connect to tcp://$address $errmsg"); - } - if (strlen($buffer) === stream_socket_sendto($client, $buffer)) { - $timeout = 5; - // 阻塞读 - stream_set_blocking($client, 1); - // 1秒超时 - stream_set_timeout($client, 1); - $all_buffer = ''; - $time_start = microtime(true); - $pack_len = 0; - while (1) { - $buf = stream_socket_recvfrom($client, 655350); - if ($buf !== '' && $buf !== false) { - $all_buffer .= $buf; - } else { - if (feof($client)) { - throw new Exception("connection close tcp://$address"); - } elseif (microtime(true) - $time_start > $timeout) { - break; - } - continue; - } - $recv_len = strlen($all_buffer); - if (!$pack_len && $recv_len >= 4) { - $pack_len= current(unpack('N', $all_buffer)); - } - // 回复的数据都是以\n结尾 - if (($pack_len && $recv_len >= $pack_len + 4) || microtime(true) - $time_start > $timeout) { - break; - } - } - // 返回结果 - return unserialize(substr($all_buffer, 4)); - } else { - throw new Exception("sendAndRecv($address, \$bufer) fail ! Can not send data!", 502); - } - } - - /** - * 发送数据到网关 - * - * @param string $address - * @param array $gateway_data - * @return bool - */ - protected static function sendToGateway($address, $gateway_data) - { - return static::sendBufferToGateway($address, GatewayProtocol::encode($gateway_data)); - } - - /** - * 发送buffer数据到网关 - * @param string $address - * @param string $gateway_buffer - * @return bool - */ - protected static function sendBufferToGateway($address, $gateway_buffer) - { - // 有$businessWorker说明是workerman环境,使用$businessWorker发送数据 - if (static::$businessWorker) { - if (!isset(static::$businessWorker->gatewayConnections[$address])) { - return false; - } - return static::$businessWorker->gatewayConnections[$address]->send($gateway_buffer, true); - } - // 非workerman环境 - $gateway_buffer = static::$secretKey ? static::generateAuthBuffer() . $gateway_buffer : $gateway_buffer; - $flag = static::$persistentConnection ? STREAM_CLIENT_PERSISTENT | STREAM_CLIENT_CONNECT : STREAM_CLIENT_CONNECT; - $client = stream_socket_client("tcp://$address", $errno, $errmsg, static::$connectTimeout, $flag); - return strlen($gateway_buffer) == stream_socket_sendto($client, $gateway_buffer); - } - - /** - * 向所有 gateway 发送数据 - * - * @param string $gateway_data - * @throws Exception - * - * @return void - */ - protected static function sendToAllGateway($gateway_data) - { - $buffer = GatewayProtocol::encode($gateway_data); - // 如果有businessWorker实例,说明运行在workerman环境中,通过businessWorker中的长连接发送数据 - if (static::$businessWorker) { - foreach (static::$businessWorker->gatewayConnections as $gateway_connection) { - /** @var TcpConnection $gateway_connection */ - $gateway_connection->send($buffer, true); - } - } // 运行在其它环境中,通过注册中心得到gateway地址 - else { - $all_addresses = static::getAllGatewayAddressesFromRegister(); - foreach ($all_addresses as $address) { - static::sendBufferToGateway($address, $buffer); - } - } - } - - /** - * 踢掉某个网关的 socket - * - * @param string $address - * @param int $connection_id - * @return bool - */ - protected static function kickAddress($address, $connection_id, $message) - { - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_KICK; - $gateway_data['connection_id'] = $connection_id; - $gateway_data['body'] = $message; - return static::sendToGateway($address, $gateway_data); - } - - /** - * 销毁某个网关的 socket - * - * @param string $address - * @param int $connection_id - * @return bool - */ - protected static function destroyAddress($address, $connection_id) - { - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_DESTROY; - $gateway_data['connection_id'] = $connection_id; - return static::sendToGateway($address, $gateway_data); - } - - /** - * 将clientid数组转换成address数组 - * - * @param array $client_id_array - * @return array - */ - protected static function clientIdArrayToAddressArray(array $client_id_array) - { - $address_connection_array = array(); - foreach ($client_id_array as $client_id) { - $address_data = Context::clientIdToAddress($client_id); - if ($address_data) { - $address = long2ip($address_data['local_ip']) . - ":{$address_data['local_port']}"; - $address_connection_array[$address][$address_data['connection_id']] = $address_data['connection_id']; - } - } - return $address_connection_array; - } - - /** - * 设置 gateway 实例 - * - * @param \GatewayWorker\BusinessWorker $business_worker_instance - */ - public static function setBusinessWorker($business_worker_instance) - { - static::$businessWorker = $business_worker_instance; - } - - /** - * 获取通过注册中心获取所有 gateway 通讯地址 - * - * @return array - * @throws Exception - */ - protected static function getAllGatewayAddressesFromRegister() - { - static $addresses_cache, $last_update; - $time_now = time(); - $expiration_time = 1; - $register_addresses = (array)static::$registerAddress; - if(empty($addresses_cache) || $time_now - $last_update > $expiration_time) { - foreach ($register_addresses as $register_address) { - $client = stream_socket_client('tcp://' . $register_address, $errno, $errmsg, static::$connectTimeout); - if ($client) { - break; - } - } - if (!$client) { - throw new Exception('Can not connect to tcp://' . $register_address . ' ' . $errmsg); - } - - fwrite($client, '{"event":"worker_connect","secret_key":"' . static::$secretKey . '"}' . "\n"); - stream_set_timeout($client, 5); - $ret = fgets($client, 655350); - if (!$ret || !$data = json_decode(trim($ret), true)) { - throw new Exception('getAllGatewayAddressesFromRegister fail. tcp://' . - $register_address . ' return ' . var_export($ret, true)); - } - $last_update = $time_now; - $addresses_cache = $data['addresses']; - } - if (!$addresses_cache) { - throw new Exception('Gateway::getAllGatewayAddressesFromRegister() with registerAddress:' . - json_encode(static::$registerAddress) . ' return ' . var_export($addresses_cache, true)); - } - return $addresses_cache; - } - - /** - * 检查群组id是否合法 - * - * @param $group - * @return bool - */ - protected static function isValidGroupId($group) - { - if (empty($group)) { - echo new \Exception('group('.var_export($group, true).') empty'); - return false; - } - return true; - } -} - -if (!class_exists('\Protocols\GatewayProtocol')) { - class_alias('GatewayWorker\Protocols\GatewayProtocol', 'Protocols\GatewayProtocol'); -} diff --git a/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Protocols/GatewayProtocol.php b/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Protocols/GatewayProtocol.php deleted file mode 100644 index 9eec3be7..00000000 --- a/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Protocols/GatewayProtocol.php +++ /dev/null @@ -1,216 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace GatewayWorker\Protocols; - -/** - * Gateway 与 Worker 间通讯的二进制协议 - * - * struct GatewayProtocol - * { - * unsigned int pack_len, - * unsigned char cmd,//命令字 - * unsigned int local_ip, - * unsigned short local_port, - * unsigned int client_ip, - * unsigned short client_port, - * unsigned int connection_id, - * unsigned char flag, - * unsigned short gateway_port, - * unsigned int ext_len, - * char[ext_len] ext_data, - * char[pack_length-HEAD_LEN] body//包体 - * } - * NCNnNnNCnN - */ -class GatewayProtocol -{ - // 发给worker,gateway有一个新的连接 - const CMD_ON_CONNECT = 1; - - // 发给worker的,客户端有消息 - const CMD_ON_MESSAGE = 3; - - // 发给worker上的关闭链接事件 - const CMD_ON_CLOSE = 4; - - // 发给gateway的向单个用户发送数据 - const CMD_SEND_TO_ONE = 5; - - // 发给gateway的向所有用户发送数据 - const CMD_SEND_TO_ALL = 6; - - // 发给gateway的踢出用户 - // 1、如果有待发消息,将在发送完后立即销毁用户连接 - // 2、如果无待发消息,将立即销毁用户连接 - const CMD_KICK = 7; - - // 发给gateway的立即销毁用户连接 - const CMD_DESTROY = 8; - - // 发给gateway,通知用户session更新 - const CMD_UPDATE_SESSION = 9; - - // 获取在线状态 - const CMD_GET_ALL_CLIENT_SESSIONS = 10; - - // 判断是否在线 - const CMD_IS_ONLINE = 11; - - // client_id绑定到uid - const CMD_BIND_UID = 12; - - // 解绑 - const CMD_UNBIND_UID = 13; - - // 向uid发送数据 - const CMD_SEND_TO_UID = 14; - - // 根据uid获取绑定的clientid - const CMD_GET_CLIENT_ID_BY_UID = 15; - - // 加入组 - const CMD_JOIN_GROUP = 20; - - // 离开组 - const CMD_LEAVE_GROUP = 21; - - // 向组成员发消息 - const CMD_SEND_TO_GROUP = 22; - - // 获取组成员 - const CMD_GET_CLIENT_SESSIONS_BY_GROUP = 23; - - // 获取组在线连接数 - const CMD_GET_CLIENT_COUNT_BY_GROUP = 24; - - // 按照条件查找 - const CMD_SELECT = 25; - - // 获取在线的群组ID - const CMD_GET_GROUP_ID_LIST = 26; - - // 取消分组 - const CMD_UNGROUP = 27; - - // worker连接gateway事件 - const CMD_WORKER_CONNECT = 200; - - // 心跳 - const CMD_PING = 201; - - // GatewayClient连接gateway事件 - const CMD_GATEWAY_CLIENT_CONNECT = 202; - - // 根据client_id获取session - const CMD_GET_SESSION_BY_CLIENT_ID = 203; - - // 发给gateway,覆盖session - const CMD_SET_SESSION = 204; - - // 当websocket握手时触发,只有websocket协议支持此命令字 - const CMD_ON_WEBSOCKET_CONNECT = 205; - - // 包体是标量 - const FLAG_BODY_IS_SCALAR = 0x01; - - // 通知gateway在send时不调用协议encode方法,在广播组播时提升性能 - const FLAG_NOT_CALL_ENCODE = 0x02; - - /** - * 包头长度 - * - * @var int - */ - const HEAD_LEN = 28; - - public static $empty = array( - 'cmd' => 0, - 'local_ip' => 0, - 'local_port' => 0, - 'client_ip' => 0, - 'client_port' => 0, - 'connection_id' => 0, - 'flag' => 0, - 'gateway_port' => 0, - 'ext_data' => '', - 'body' => '', - ); - - /** - * 返回包长度 - * - * @param string $buffer - * @return int return current package length - */ - public static function input($buffer) - { - if (strlen($buffer) < self::HEAD_LEN) { - return 0; - } - - $data = unpack("Npack_len", $buffer); - return $data['pack_len']; - } - - /** - * 获取整个包的 buffer - * - * @param mixed $data - * @return string - */ - public static function encode($data) - { - $flag = (int)is_scalar($data['body']); - if (!$flag) { - $data['body'] = serialize($data['body']); - } - $data['flag'] |= $flag; - $ext_len = strlen($data['ext_data']); - $package_len = self::HEAD_LEN + $ext_len + strlen($data['body']); - return pack("NCNnNnNCnN", $package_len, - $data['cmd'], $data['local_ip'], - $data['local_port'], $data['client_ip'], - $data['client_port'], $data['connection_id'], - $data['flag'], $data['gateway_port'], - $ext_len) . $data['ext_data'] . $data['body']; - } - - /** - * 从二进制数据转换为数组 - * - * @param string $buffer - * @return array - */ - public static function decode($buffer) - { - $data = unpack("Npack_len/Ccmd/Nlocal_ip/nlocal_port/Nclient_ip/nclient_port/Nconnection_id/Cflag/ngateway_port/Next_len", - $buffer); - if ($data['ext_len'] > 0) { - $data['ext_data'] = substr($buffer, self::HEAD_LEN, $data['ext_len']); - if ($data['flag'] & self::FLAG_BODY_IS_SCALAR) { - $data['body'] = substr($buffer, self::HEAD_LEN + $data['ext_len']); - } else { - $data['body'] = unserialize(substr($buffer, self::HEAD_LEN + $data['ext_len'])); - } - } else { - $data['ext_data'] = ''; - if ($data['flag'] & self::FLAG_BODY_IS_SCALAR) { - $data['body'] = substr($buffer, self::HEAD_LEN); - } else { - $data['body'] = unserialize(substr($buffer, self::HEAD_LEN)); - } - } - return $data; - } -} diff --git a/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Register.php b/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Register.php deleted file mode 100644 index a2cf3596..00000000 --- a/GatewayWorker_linux/vendor/workerman/gateway-worker/src/Register.php +++ /dev/null @@ -1,193 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace GatewayWorker; - -use Workerman\Worker; -use Workerman\Lib\Timer; - -/** - * - * 注册中心,用于注册 Gateway 和 BusinessWorker - * - * @author walkor - * - */ -class Register extends Worker -{ - /** - * {@inheritdoc} - */ - public $name = 'Register'; - - /** - * {@inheritdoc} - */ - public $reloadable = false; - - /** - * 秘钥 - * @var string - */ - public $secretKey = ''; - - /** - * 所有 gateway 的连接 - * - * @var array - */ - protected $_gatewayConnections = array(); - - /** - * 所有 worker 的连接 - * - * @var array - */ - protected $_workerConnections = array(); - - /** - * 进程启动时间 - * - * @var int - */ - protected $_startTime = 0; - - /** - * {@inheritdoc} - */ - public function run() - { - // 设置 onMessage 连接回调 - $this->onConnect = array($this, 'onConnect'); - - // 设置 onMessage 回调 - $this->onMessage = array($this, 'onMessage'); - - // 设置 onClose 回调 - $this->onClose = array($this, 'onClose'); - - // 记录进程启动的时间 - $this->_startTime = time(); - - // 强制使用text协议 - $this->protocol = '\Workerman\Protocols\Text'; - - // reusePort - $this->reusePort = false; - - // 运行父方法 - parent::run(); - } - - /** - * 设置个定时器,将未及时发送验证的连接关闭 - * - * @param \Workerman\Connection\ConnectionInterface $connection - * @return void - */ - public function onConnect($connection) - { - $connection->timeout_timerid = Timer::add(10, function () use ($connection) { - Worker::log("Register auth timeout (".$connection->getRemoteIp()."). See http://doc2.workerman.net/register-auth-timeout.html"); - $connection->close(); - }, null, false); - } - - /** - * 设置消息回调 - * - * @param \Workerman\Connection\ConnectionInterface $connection - * @param string $buffer - * @return void - */ - public function onMessage($connection, $buffer) - { - // 删除定时器 - Timer::del($connection->timeout_timerid); - $data = @json_decode($buffer, true); - if (empty($data['event'])) { - $error = "Bad request for Register service. Request info(IP:".$connection->getRemoteIp().", Request Buffer:$buffer). See http://doc2.workerman.net/register-auth-timeout.html"; - Worker::log($error); - return $connection->close($error); - } - $event = $data['event']; - $secret_key = isset($data['secret_key']) ? $data['secret_key'] : ''; - // 开始验证 - switch ($event) { - // 是 gateway 连接 - case 'gateway_connect': - if (empty($data['address'])) { - echo "address not found\n"; - return $connection->close(); - } - if ($secret_key !== $this->secretKey) { - Worker::log("Register: Key does not match ".var_export($secret_key, true)." !== ".var_export($this->secretKey, true)); - return $connection->close(); - } - $this->_gatewayConnections[$connection->id] = $data['address']; - $this->broadcastAddresses(); - break; - // 是 worker 连接 - case 'worker_connect': - if ($secret_key !== $this->secretKey) { - Worker::log("Register: Key does not match ".var_export($secret_key, true)." !== ".var_export($this->secretKey, true)); - return $connection->close(); - } - $this->_workerConnections[$connection->id] = $connection; - $this->broadcastAddresses($connection); - break; - case 'ping': - break; - default: - Worker::log("Register unknown event:$event IP: ".$connection->getRemoteIp()." Buffer:$buffer. See http://doc2.workerman.net/register-auth-timeout.html"); - $connection->close(); - } - } - - /** - * 连接关闭时 - * - * @param \Workerman\Connection\ConnectionInterface $connection - */ - public function onClose($connection) - { - if (isset($this->_gatewayConnections[$connection->id])) { - unset($this->_gatewayConnections[$connection->id]); - $this->broadcastAddresses(); - } - if (isset($this->_workerConnections[$connection->id])) { - unset($this->_workerConnections[$connection->id]); - } - } - - /** - * 向 BusinessWorker 广播 gateway 内部通讯地址 - * - * @param \Workerman\Connection\ConnectionInterface $connection - */ - public function broadcastAddresses($connection = null) - { - $data = array( - 'event' => 'broadcast_addresses', - 'addresses' => array_unique(array_values($this->_gatewayConnections)), - ); - $buffer = json_encode($data); - if ($connection) { - $connection->send($buffer); - return; - } - foreach ($this->_workerConnections as $con) { - $con->send($buffer); - } - } -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/.github/FUNDING.yml b/GatewayWorker_linux/vendor/workerman/workerman/.github/FUNDING.yml deleted file mode 100644 index beae44f7..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/.github/FUNDING.yml +++ /dev/null @@ -1,4 +0,0 @@ -# These are supported funding model platforms - -open_collective: workerman -patreon: walkor diff --git a/GatewayWorker_linux/vendor/workerman/workerman/.gitignore b/GatewayWorker_linux/vendor/workerman/workerman/.gitignore deleted file mode 100644 index f3f9e18c..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -logs -.buildpath -.project -.settings -.idea -.DS_Store diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Autoloader.php b/GatewayWorker_linux/vendor/workerman/workerman/Autoloader.php deleted file mode 100644 index 7d760e94..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Autoloader.php +++ /dev/null @@ -1,69 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman; - -/** - * Autoload. - */ -class Autoloader -{ - /** - * Autoload root path. - * - * @var string - */ - protected static $_autoloadRootPath = ''; - - /** - * Set autoload root path. - * - * @param string $root_path - * @return void - */ - public static function setRootPath($root_path) - { - self::$_autoloadRootPath = $root_path; - } - - /** - * Load files by namespace. - * - * @param string $name - * @return boolean - */ - public static function loadByNamespace($name) - { - $class_path = \str_replace('\\', \DIRECTORY_SEPARATOR, $name); - if (\strpos($name, 'Workerman\\') === 0) { - $class_file = __DIR__ . \substr($class_path, \strlen('Workerman')) . '.php'; - } else { - if (self::$_autoloadRootPath) { - $class_file = self::$_autoloadRootPath . \DIRECTORY_SEPARATOR . $class_path . '.php'; - } - if (empty($class_file) || !\is_file($class_file)) { - $class_file = __DIR__ . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . "$class_path.php"; - } - } - - if (\is_file($class_file)) { - require_once($class_file); - if (\class_exists($name, false)) { - return true; - } - } - return false; - } -} - -\spl_autoload_register('\Workerman\Autoloader::loadByNamespace'); \ No newline at end of file diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Connection/AsyncTcpConnection.php b/GatewayWorker_linux/vendor/workerman/workerman/Connection/AsyncTcpConnection.php deleted file mode 100644 index 600d700b..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Connection/AsyncTcpConnection.php +++ /dev/null @@ -1,376 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Connection; - -use Workerman\Events\EventInterface; -use Workerman\Lib\Timer; -use Workerman\Worker; -use \Exception; - -/** - * AsyncTcpConnection. - */ -class AsyncTcpConnection extends TcpConnection -{ - /** - * Emitted when socket connection is successfully established. - * - * @var callable|null - */ - public $onConnect = null; - - /** - * Transport layer protocol. - * - * @var string - */ - public $transport = 'tcp'; - - /** - * Status. - * - * @var int - */ - protected $_status = self::STATUS_INITIAL; - - /** - * Remote host. - * - * @var string - */ - protected $_remoteHost = ''; - - /** - * Remote port. - * - * @var int - */ - protected $_remotePort = 80; - - /** - * Connect start time. - * - * @var float - */ - protected $_connectStartTime = 0; - - /** - * Remote URI. - * - * @var string - */ - protected $_remoteURI = ''; - - /** - * Context option. - * - * @var array - */ - protected $_contextOption = null; - - /** - * Reconnect timer. - * - * @var int - */ - protected $_reconnectTimer = null; - - - /** - * PHP built-in protocols. - * - * @var array - */ - protected static $_builtinTransports = array( - 'tcp' => 'tcp', - 'udp' => 'udp', - 'unix' => 'unix', - 'ssl' => 'ssl', - 'sslv2' => 'sslv2', - 'sslv3' => 'sslv3', - 'tls' => 'tls' - ); - - /** - * Construct. - * - * @param string $remote_address - * @param array $context_option - * @throws Exception - */ - public function __construct($remote_address, array $context_option = array()) - { - $address_info = \parse_url($remote_address); - if (!$address_info) { - list($scheme, $this->_remoteAddress) = \explode(':', $remote_address, 2); - if('unix' === strtolower($scheme)) { - $this->_remoteAddress = substr($remote_address, strpos($remote_address, '/') + 2); - } - if (!$this->_remoteAddress) { - Worker::safeEcho(new \Exception('bad remote_address')); - } - } else { - if (!isset($address_info['port'])) { - $address_info['port'] = 0; - } - if (!isset($address_info['path'])) { - $address_info['path'] = '/'; - } - if (!isset($address_info['query'])) { - $address_info['query'] = ''; - } else { - $address_info['query'] = '?' . $address_info['query']; - } - $this->_remoteHost = $address_info['host']; - $this->_remotePort = $address_info['port']; - $this->_remoteURI = "{$address_info['path']}{$address_info['query']}"; - $scheme = isset($address_info['scheme']) ? $address_info['scheme'] : 'tcp'; - $this->_remoteAddress = 'unix' === strtolower($scheme) - ? substr($remote_address, strpos($remote_address, '/') + 2) - : $this->_remoteHost . ':' . $this->_remotePort; - } - - $this->id = $this->_id = self::$_idRecorder++; - if(\PHP_INT_MAX === self::$_idRecorder){ - self::$_idRecorder = 0; - } - // Check application layer protocol class. - if (!isset(self::$_builtinTransports[$scheme])) { - $scheme = \ucfirst($scheme); - $this->protocol = '\\Protocols\\' . $scheme; - if (!\class_exists($this->protocol)) { - $this->protocol = "\\Workerman\\Protocols\\$scheme"; - if (!\class_exists($this->protocol)) { - throw new Exception("class \\Protocols\\$scheme not exist"); - } - } - } else { - $this->transport = self::$_builtinTransports[$scheme]; - } - - // For statistics. - ++self::$statistics['connection_count']; - $this->maxSendBufferSize = self::$defaultMaxSendBufferSize; - $this->maxPackageSize = self::$defaultMaxPackageSize; - $this->_contextOption = $context_option; - static::$connections[$this->_id] = $this; - } - - /** - * Do connect. - * - * @return void - */ - public function connect() - { - if ($this->_status !== self::STATUS_INITIAL && $this->_status !== self::STATUS_CLOSING && - $this->_status !== self::STATUS_CLOSED) { - return; - } - $this->_status = self::STATUS_CONNECTING; - $this->_connectStartTime = \microtime(true); - if ($this->transport !== 'unix') { - if (!$this->_remotePort) { - $this->_remotePort = $this->transport === 'ssl' ? 443 : 80; - $this->_remoteAddress = $this->_remoteHost.':'.$this->_remotePort; - } - // Open socket connection asynchronously. - if ($this->_contextOption) { - $context = \stream_context_create($this->_contextOption); - $this->_socket = \stream_socket_client("tcp://{$this->_remoteHost}:{$this->_remotePort}", - $errno, $errstr, 0, \STREAM_CLIENT_ASYNC_CONNECT, $context); - } else { - $this->_socket = \stream_socket_client("tcp://{$this->_remoteHost}:{$this->_remotePort}", - $errno, $errstr, 0, \STREAM_CLIENT_ASYNC_CONNECT); - } - } else { - $this->_socket = \stream_socket_client("{$this->transport}://{$this->_remoteAddress}", $errno, $errstr, 0, - \STREAM_CLIENT_ASYNC_CONNECT); - } - // If failed attempt to emit onError callback. - if (!$this->_socket || !\is_resource($this->_socket)) { - $this->emitError(\WORKERMAN_CONNECT_FAIL, $errstr); - if ($this->_status === self::STATUS_CLOSING) { - $this->destroy(); - } - if ($this->_status === self::STATUS_CLOSED) { - $this->onConnect = null; - } - return; - } - // Add socket to global event loop waiting connection is successfully established or faild. - Worker::$globalEvent->add($this->_socket, EventInterface::EV_WRITE, array($this, 'checkConnection')); - // For windows. - if(\DIRECTORY_SEPARATOR === '\\') { - Worker::$globalEvent->add($this->_socket, EventInterface::EV_EXCEPT, array($this, 'checkConnection')); - } - } - - /** - * Reconnect. - * - * @param int $after - * @return void - */ - public function reconnect($after = 0) - { - $this->_status = self::STATUS_INITIAL; - static::$connections[$this->_id] = $this; - if ($this->_reconnectTimer) { - Timer::del($this->_reconnectTimer); - } - if ($after > 0) { - $this->_reconnectTimer = Timer::add($after, array($this, 'connect'), null, false); - return; - } - $this->connect(); - } - - /** - * CancelReconnect. - */ - public function cancelReconnect() - { - if ($this->_reconnectTimer) { - Timer::del($this->_reconnectTimer); - } - } - - /** - * Get remote address. - * - * @return string - */ - public function getRemoteHost() - { - return $this->_remoteHost; - } - - /** - * Get remote URI. - * - * @return string - */ - public function getRemoteURI() - { - return $this->_remoteURI; - } - - /** - * Try to emit onError callback. - * - * @param int $code - * @param string $msg - * @return void - */ - protected function emitError($code, $msg) - { - $this->_status = self::STATUS_CLOSING; - if ($this->onError) { - try { - \call_user_func($this->onError, $this, $code, $msg); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - } - - /** - * Check connection is successfully established or faild. - * - * @param resource $socket - * @return void - */ - public function checkConnection() - { - // Remove EV_EXPECT for windows. - if(\DIRECTORY_SEPARATOR === '\\') { - Worker::$globalEvent->del($this->_socket, EventInterface::EV_EXCEPT); - } - - // Remove write listener. - Worker::$globalEvent->del($this->_socket, EventInterface::EV_WRITE); - - if ($this->_status !== self::STATUS_CONNECTING) { - return; - } - - // Check socket state. - if ($address = \stream_socket_get_name($this->_socket, true)) { - // Nonblocking. - \stream_set_blocking($this->_socket, false); - // Compatible with hhvm - if (\function_exists('stream_set_read_buffer')) { - \stream_set_read_buffer($this->_socket, 0); - } - // Try to open keepalive for tcp and disable Nagle algorithm. - if (\function_exists('socket_import_stream') && $this->transport === 'tcp') { - $raw_socket = \socket_import_stream($this->_socket); - \socket_set_option($raw_socket, \SOL_SOCKET, \SO_KEEPALIVE, 1); - \socket_set_option($raw_socket, \SOL_TCP, \TCP_NODELAY, 1); - } - - // SSL handshake. - if ($this->transport === 'ssl') { - $this->_sslHandshakeCompleted = $this->doSslHandshake($this->_socket); - if ($this->_sslHandshakeCompleted === false) { - return; - } - } else { - // There are some data waiting to send. - if ($this->_sendBuffer) { - Worker::$globalEvent->add($this->_socket, EventInterface::EV_WRITE, array($this, 'baseWrite')); - } - } - - // Register a listener waiting read event. - Worker::$globalEvent->add($this->_socket, EventInterface::EV_READ, array($this, 'baseRead')); - - $this->_status = self::STATUS_ESTABLISHED; - $this->_remoteAddress = $address; - - // Try to emit onConnect callback. - if ($this->onConnect) { - try { - \call_user_func($this->onConnect, $this); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - // Try to emit protocol::onConnect - if ($this->protocol && \method_exists($this->protocol, 'onConnect')) { - try { - \call_user_func(array($this->protocol, 'onConnect'), $this); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - } else { - // Connection failed. - $this->emitError(\WORKERMAN_CONNECT_FAIL, 'connect ' . $this->_remoteAddress . ' fail after ' . round(\microtime(true) - $this->_connectStartTime, 4) . ' seconds'); - if ($this->_status === self::STATUS_CLOSING) { - $this->destroy(); - } - if ($this->_status === self::STATUS_CLOSED) { - $this->onConnect = null; - } - } - } -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Connection/AsyncUdpConnection.php b/GatewayWorker_linux/vendor/workerman/workerman/Connection/AsyncUdpConnection.php deleted file mode 100644 index 745f0606..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Connection/AsyncUdpConnection.php +++ /dev/null @@ -1,203 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Connection; - -use Workerman\Events\EventInterface; -use Workerman\Worker; -use \Exception; - -/** - * AsyncUdpConnection. - */ -class AsyncUdpConnection extends UdpConnection -{ - /** - * Emitted when socket connection is successfully established. - * - * @var callable - */ - public $onConnect = null; - - /** - * Emitted when socket connection closed. - * - * @var callable - */ - public $onClose = null; - - /** - * Connected or not. - * - * @var bool - */ - protected $connected = false; - - /** - * Context option. - * - * @var array - */ - protected $_contextOption = null; - - /** - * Construct. - * - * @param string $remote_address - * @throws Exception - */ - public function __construct($remote_address, $context_option = null) - { - // Get the application layer communication protocol and listening address. - list($scheme, $address) = \explode(':', $remote_address, 2); - // Check application layer protocol class. - if ($scheme !== 'udp') { - $scheme = \ucfirst($scheme); - $this->protocol = '\\Protocols\\' . $scheme; - if (!\class_exists($this->protocol)) { - $this->protocol = "\\Workerman\\Protocols\\$scheme"; - if (!\class_exists($this->protocol)) { - throw new Exception("class \\Protocols\\$scheme not exist"); - } - } - } - - $this->_remoteAddress = \substr($address, 2); - $this->_contextOption = $context_option; - } - - /** - * For udp package. - * - * @param resource $socket - * @return bool - */ - public function baseRead($socket) - { - $recv_buffer = \stream_socket_recvfrom($socket, Worker::MAX_UDP_PACKAGE_SIZE, 0, $remote_address); - if (false === $recv_buffer || empty($remote_address)) { - return false; - } - - if ($this->onMessage) { - if ($this->protocol) { - $parser = $this->protocol; - $recv_buffer = $parser::decode($recv_buffer, $this); - } - ++ConnectionInterface::$statistics['total_request']; - try { - \call_user_func($this->onMessage, $this, $recv_buffer); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - return true; - } - - /** - * Sends data on the connection. - * - * @param string $send_buffer - * @param bool $raw - * @return void|boolean - */ - public function send($send_buffer, $raw = false) - { - if (false === $raw && $this->protocol) { - $parser = $this->protocol; - $send_buffer = $parser::encode($send_buffer, $this); - if ($send_buffer === '') { - return; - } - } - if ($this->connected === false) { - $this->connect(); - } - return \strlen($send_buffer) === \stream_socket_sendto($this->_socket, $send_buffer, 0); - } - - - /** - * Close connection. - * - * @param mixed $data - * @param bool $raw - * - * @return bool - */ - public function close($data = null, $raw = false) - { - if ($data !== null) { - $this->send($data, $raw); - } - Worker::$globalEvent->del($this->_socket, EventInterface::EV_READ); - \fclose($this->_socket); - $this->connected = false; - // Try to emit onClose callback. - if ($this->onClose) { - try { - \call_user_func($this->onClose, $this); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - $this->onConnect = $this->onMessage = $this->onClose = null; - return true; - } - - /** - * Connect. - * - * @return void - */ - public function connect() - { - if ($this->connected === true) { - return; - } - if ($this->_contextOption) { - $context = \stream_context_create($this->_contextOption); - $this->_socket = \stream_socket_client("udp://{$this->_remoteAddress}", $errno, $errmsg, - 30, \STREAM_CLIENT_CONNECT, $context); - } else { - $this->_socket = \stream_socket_client("udp://{$this->_remoteAddress}", $errno, $errmsg); - } - - if (!$this->_socket) { - Worker::safeEcho(new \Exception($errmsg)); - return; - } - - \stream_set_blocking($this->_socket, false); - - if ($this->onMessage) { - Worker::$globalEvent->add($this->_socket, EventInterface::EV_READ, array($this, 'baseRead')); - } - $this->connected = true; - // Try to emit onConnect callback. - if ($this->onConnect) { - try { - \call_user_func($this->onConnect, $this); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - } - -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Connection/ConnectionInterface.php b/GatewayWorker_linux/vendor/workerman/workerman/Connection/ConnectionInterface.php deleted file mode 100644 index 4d3f5e10..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Connection/ConnectionInterface.php +++ /dev/null @@ -1,125 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Connection; - -/** - * ConnectionInterface. - */ -abstract class ConnectionInterface -{ - /** - * Statistics for status command. - * - * @var array - */ - public static $statistics = array( - 'connection_count' => 0, - 'total_request' => 0, - 'throw_exception' => 0, - 'send_fail' => 0, - ); - - /** - * Emitted when data is received. - * - * @var callable - */ - public $onMessage = null; - - /** - * Emitted when the other end of the socket sends a FIN packet. - * - * @var callable - */ - public $onClose = null; - - /** - * Emitted when an error occurs with connection. - * - * @var callable - */ - public $onError = null; - - /** - * Sends data on the connection. - * - * @param mixed $send_buffer - * @return void|boolean - */ - abstract public function send($send_buffer); - - /** - * Get remote IP. - * - * @return string - */ - abstract public function getRemoteIp(); - - /** - * Get remote port. - * - * @return int - */ - abstract public function getRemotePort(); - - /** - * Get remote address. - * - * @return string - */ - abstract public function getRemoteAddress(); - - /** - * Get local IP. - * - * @return string - */ - abstract public function getLocalIp(); - - /** - * Get local port. - * - * @return int - */ - abstract public function getLocalPort(); - - /** - * Get local address. - * - * @return string - */ - abstract public function getLocalAddress(); - - /** - * Is ipv4. - * - * @return bool - */ - abstract public function isIPv4(); - - /** - * Is ipv6. - * - * @return bool - */ - abstract public function isIPv6(); - - /** - * Close connection. - * - * @param string|null $data - * @return void - */ - abstract public function close($data = null); -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Connection/TcpConnection.php b/GatewayWorker_linux/vendor/workerman/workerman/Connection/TcpConnection.php deleted file mode 100644 index 4984a506..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Connection/TcpConnection.php +++ /dev/null @@ -1,974 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Connection; - -use Workerman\Events\EventInterface; -use Workerman\Worker; -use \Exception; - -/** - * TcpConnection. - */ -class TcpConnection extends ConnectionInterface -{ - /** - * Read buffer size. - * - * @var int - */ - const READ_BUFFER_SIZE = 65535; - - /** - * Status initial. - * - * @var int - */ - const STATUS_INITIAL = 0; - - /** - * Status connecting. - * - * @var int - */ - const STATUS_CONNECTING = 1; - - /** - * Status connection established. - * - * @var int - */ - const STATUS_ESTABLISHED = 2; - - /** - * Status closing. - * - * @var int - */ - const STATUS_CLOSING = 4; - - /** - * Status closed. - * - * @var int - */ - const STATUS_CLOSED = 8; - - /** - * Emitted when data is received. - * - * @var callable - */ - public $onMessage = null; - - /** - * Emitted when the other end of the socket sends a FIN packet. - * - * @var callable - */ - public $onClose = null; - - /** - * Emitted when an error occurs with connection. - * - * @var callable - */ - public $onError = null; - - /** - * Emitted when the send buffer becomes full. - * - * @var callable - */ - public $onBufferFull = null; - - /** - * Emitted when the send buffer becomes empty. - * - * @var callable - */ - public $onBufferDrain = null; - - /** - * Application layer protocol. - * The format is like this Workerman\\Protocols\\Http. - * - * @var \Workerman\Protocols\ProtocolInterface - */ - public $protocol = null; - - /** - * Transport (tcp/udp/unix/ssl). - * - * @var string - */ - public $transport = 'tcp'; - - /** - * Which worker belong to. - * - * @var Worker - */ - public $worker = null; - - /** - * Bytes read. - * - * @var int - */ - public $bytesRead = 0; - - /** - * Bytes written. - * - * @var int - */ - public $bytesWritten = 0; - - /** - * Connection->id. - * - * @var int - */ - public $id = 0; - - /** - * A copy of $worker->id which used to clean up the connection in worker->connections - * - * @var int - */ - protected $_id = 0; - - /** - * Sets the maximum send buffer size for the current connection. - * OnBufferFull callback will be emited When the send buffer is full. - * - * @var int - */ - public $maxSendBufferSize = 1048576; - - /** - * Default send buffer size. - * - * @var int - */ - public static $defaultMaxSendBufferSize = 1048576; - - /** - * Sets the maximum acceptable packet size for the current connection. - * - * @var int - */ - public $maxPackageSize = 1048576; - - /** - * Default maximum acceptable packet size. - * - * @var int - */ - public static $defaultMaxPackageSize = 10485760; - - /** - * Id recorder. - * - * @var int - */ - protected static $_idRecorder = 1; - - /** - * Socket - * - * @var resource - */ - protected $_socket = null; - - /** - * Send buffer. - * - * @var string - */ - protected $_sendBuffer = ''; - - /** - * Receive buffer. - * - * @var string - */ - protected $_recvBuffer = ''; - - /** - * Current package length. - * - * @var int - */ - protected $_currentPackageLength = 0; - - /** - * Connection status. - * - * @var int - */ - protected $_status = self::STATUS_ESTABLISHED; - - /** - * Remote address. - * - * @var string - */ - protected $_remoteAddress = ''; - - /** - * Is paused. - * - * @var bool - */ - protected $_isPaused = false; - - /** - * SSL handshake completed or not. - * - * @var bool - */ - protected $_sslHandshakeCompleted = false; - - /** - * All connection instances. - * - * @var array - */ - public static $connections = array(); - - /** - * Status to string. - * - * @var array - */ - public static $_statusToString = array( - self::STATUS_INITIAL => 'INITIAL', - self::STATUS_CONNECTING => 'CONNECTING', - self::STATUS_ESTABLISHED => 'ESTABLISHED', - self::STATUS_CLOSING => 'CLOSING', - self::STATUS_CLOSED => 'CLOSED', - ); - - /** - * Construct. - * - * @param resource $socket - * @param string $remote_address - */ - public function __construct($socket, $remote_address = '') - { - ++self::$statistics['connection_count']; - $this->id = $this->_id = self::$_idRecorder++; - if(self::$_idRecorder === \PHP_INT_MAX){ - self::$_idRecorder = 0; - } - $this->_socket = $socket; - \stream_set_blocking($this->_socket, 0); - // Compatible with hhvm - if (\function_exists('stream_set_read_buffer')) { - \stream_set_read_buffer($this->_socket, 0); - } - Worker::$globalEvent->add($this->_socket, EventInterface::EV_READ, array($this, 'baseRead')); - $this->maxSendBufferSize = self::$defaultMaxSendBufferSize; - $this->maxPackageSize = self::$defaultMaxPackageSize; - $this->_remoteAddress = $remote_address; - static::$connections[$this->id] = $this; - } - - /** - * Get status. - * - * @param bool $raw_output - * - * @return int|string - */ - public function getStatus($raw_output = true) - { - if ($raw_output) { - return $this->_status; - } - return self::$_statusToString[$this->_status]; - } - - /** - * Sends data on the connection. - * - * @param mixed $send_buffer - * @param bool $raw - * @return bool|null - */ - public function send($send_buffer, $raw = false) - { - if ($this->_status === self::STATUS_CLOSING || $this->_status === self::STATUS_CLOSED) { - return false; - } - - // Try to call protocol::encode($send_buffer) before sending. - if (false === $raw && $this->protocol !== null) { - $parser = $this->protocol; - $send_buffer = $parser::encode($send_buffer, $this); - if ($send_buffer === '') { - return; - } - } - - if ($this->_status !== self::STATUS_ESTABLISHED || - ($this->transport === 'ssl' && $this->_sslHandshakeCompleted !== true) - ) { - if ($this->_sendBuffer && $this->bufferIsFull()) { - ++self::$statistics['send_fail']; - return false; - } - $this->_sendBuffer .= $send_buffer; - $this->checkBufferWillFull(); - return; - } - - // Attempt to send data directly. - if ($this->_sendBuffer === '') { - if ($this->transport === 'ssl') { - Worker::$globalEvent->add($this->_socket, EventInterface::EV_WRITE, array($this, 'baseWrite')); - $this->_sendBuffer = $send_buffer; - $this->checkBufferWillFull(); - return; - } - $len = 0; - try { - $len = @\fwrite($this->_socket, $send_buffer); - } catch (\Exception $e) { - Worker::log($e); - } catch (\Error $e) { - Worker::log($e); - } - // send successful. - if ($len === \strlen($send_buffer)) { - $this->bytesWritten += $len; - return true; - } - // Send only part of the data. - if ($len > 0) { - $this->_sendBuffer = \substr($send_buffer, $len); - $this->bytesWritten += $len; - } else { - // Connection closed? - if (!\is_resource($this->_socket) || \feof($this->_socket)) { - ++self::$statistics['send_fail']; - if ($this->onError) { - try { - \call_user_func($this->onError, $this, \WORKERMAN_SEND_FAIL, 'client closed'); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - $this->destroy(); - return false; - } - $this->_sendBuffer = $send_buffer; - } - Worker::$globalEvent->add($this->_socket, EventInterface::EV_WRITE, array($this, 'baseWrite')); - // Check if the send buffer will be full. - $this->checkBufferWillFull(); - return; - } - - if ($this->bufferIsFull()) { - ++self::$statistics['send_fail']; - return false; - } - - $this->_sendBuffer .= $send_buffer; - // Check if the send buffer is full. - $this->checkBufferWillFull(); - } - - /** - * Get remote IP. - * - * @return string - */ - public function getRemoteIp() - { - $pos = \strrpos($this->_remoteAddress, ':'); - if ($pos) { - return (string) \substr($this->_remoteAddress, 0, $pos); - } - return ''; - } - - /** - * Get remote port. - * - * @return int - */ - public function getRemotePort() - { - if ($this->_remoteAddress) { - return (int) \substr(\strrchr($this->_remoteAddress, ':'), 1); - } - return 0; - } - - /** - * Get remote address. - * - * @return string - */ - public function getRemoteAddress() - { - return $this->_remoteAddress; - } - - /** - * Get local IP. - * - * @return string - */ - public function getLocalIp() - { - $address = $this->getLocalAddress(); - $pos = \strrpos($address, ':'); - if (!$pos) { - return ''; - } - return \substr($address, 0, $pos); - } - - /** - * Get local port. - * - * @return int - */ - public function getLocalPort() - { - $address = $this->getLocalAddress(); - $pos = \strrpos($address, ':'); - if (!$pos) { - return 0; - } - return (int)\substr(\strrchr($address, ':'), 1); - } - - /** - * Get local address. - * - * @return string - */ - public function getLocalAddress() - { - if (!\is_resource($this->_socket)) { - return ''; - } - return (string)@\stream_socket_get_name($this->_socket, false); - } - - /** - * Get send buffer queue size. - * - * @return integer - */ - public function getSendBufferQueueSize() - { - return \strlen($this->_sendBuffer); - } - - /** - * Get recv buffer queue size. - * - * @return integer - */ - public function getRecvBufferQueueSize() - { - return \strlen($this->_recvBuffer); - } - - /** - * Is ipv4. - * - * return bool. - */ - public function isIpV4() - { - if ($this->transport === 'unix') { - return false; - } - return \strpos($this->getRemoteIp(), ':') === false; - } - - /** - * Is ipv6. - * - * return bool. - */ - public function isIpV6() - { - if ($this->transport === 'unix') { - return false; - } - return \strpos($this->getRemoteIp(), ':') !== false; - } - - /** - * Pauses the reading of data. That is onMessage will not be emitted. Useful to throttle back an upload. - * - * @return void - */ - public function pauseRecv() - { - Worker::$globalEvent->del($this->_socket, EventInterface::EV_READ); - $this->_isPaused = true; - } - - /** - * Resumes reading after a call to pauseRecv. - * - * @return void - */ - public function resumeRecv() - { - if ($this->_isPaused === true) { - Worker::$globalEvent->add($this->_socket, EventInterface::EV_READ, array($this, 'baseRead')); - $this->_isPaused = false; - $this->baseRead($this->_socket, false); - } - } - - - - /** - * Base read handler. - * - * @param resource $socket - * @param bool $check_eof - * @return void - */ - public function baseRead($socket, $check_eof = true) - { - // SSL handshake. - if ($this->transport === 'ssl' && $this->_sslHandshakeCompleted !== true) { - if ($this->doSslHandshake($socket)) { - $this->_sslHandshakeCompleted = true; - if ($this->_sendBuffer) { - Worker::$globalEvent->add($socket, EventInterface::EV_WRITE, array($this, 'baseWrite')); - } - } else { - return; - } - } - - $buffer = ''; - try { - $buffer = @\fread($socket, self::READ_BUFFER_SIZE); - } catch (\Exception $e) {} catch (\Error $e) {} - - // Check connection closed. - if ($buffer === '' || $buffer === false) { - if ($check_eof && (\feof($socket) || !\is_resource($socket) || $buffer === false)) { - $this->destroy(); - return; - } - } else { - $this->bytesRead += \strlen($buffer); - $this->_recvBuffer .= $buffer; - } - - // If the application layer protocol has been set up. - if ($this->protocol !== null) { - $parser = $this->protocol; - while ($this->_recvBuffer !== '' && !$this->_isPaused) { - // The current packet length is known. - if ($this->_currentPackageLength) { - // Data is not enough for a package. - if ($this->_currentPackageLength > \strlen($this->_recvBuffer)) { - break; - } - } else { - // Get current package length. - try { - $this->_currentPackageLength = $parser::input($this->_recvBuffer, $this); - } catch (\Exception $e) {} catch (\Error $e) {} - // The packet length is unknown. - if ($this->_currentPackageLength === 0) { - break; - } elseif ($this->_currentPackageLength > 0 && $this->_currentPackageLength <= $this->maxPackageSize) { - // Data is not enough for a package. - if ($this->_currentPackageLength > \strlen($this->_recvBuffer)) { - break; - } - } // Wrong package. - else { - Worker::safeEcho('Error package. package_length=' . \var_export($this->_currentPackageLength, true)); - $this->destroy(); - return; - } - } - - // The data is enough for a packet. - ++self::$statistics['total_request']; - // The current packet length is equal to the length of the buffer. - if (\strlen($this->_recvBuffer) === $this->_currentPackageLength) { - $one_request_buffer = $this->_recvBuffer; - $this->_recvBuffer = ''; - } else { - // Get a full package from the buffer. - $one_request_buffer = \substr($this->_recvBuffer, 0, $this->_currentPackageLength); - // Remove the current package from the receive buffer. - $this->_recvBuffer = \substr($this->_recvBuffer, $this->_currentPackageLength); - } - // Reset the current packet length to 0. - $this->_currentPackageLength = 0; - if (!$this->onMessage) { - continue; - } - try { - // Decode request buffer before Emitting onMessage callback. - \call_user_func($this->onMessage, $this, $parser::decode($one_request_buffer, $this)); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - return; - } - - if ($this->_recvBuffer === '' || $this->_isPaused) { - return; - } - - // Applications protocol is not set. - ++self::$statistics['total_request']; - if (!$this->onMessage) { - $this->_recvBuffer = ''; - return; - } - try { - \call_user_func($this->onMessage, $this, $this->_recvBuffer); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - // Clean receive buffer. - $this->_recvBuffer = ''; - } - - /** - * Base write handler. - * - * @return void|bool - */ - public function baseWrite() - { - \set_error_handler(function(){}); - if ($this->transport === 'ssl') { - $len = @\fwrite($this->_socket, $this->_sendBuffer, 8192); - } else { - $len = @\fwrite($this->_socket, $this->_sendBuffer); - } - \restore_error_handler(); - if ($len === \strlen($this->_sendBuffer)) { - $this->bytesWritten += $len; - Worker::$globalEvent->del($this->_socket, EventInterface::EV_WRITE); - $this->_sendBuffer = ''; - // Try to emit onBufferDrain callback when the send buffer becomes empty. - if ($this->onBufferDrain) { - try { - \call_user_func($this->onBufferDrain, $this); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - if ($this->_status === self::STATUS_CLOSING) { - $this->destroy(); - } - return true; - } - if ($len > 0) { - $this->bytesWritten += $len; - $this->_sendBuffer = \substr($this->_sendBuffer, $len); - } else { - ++self::$statistics['send_fail']; - $this->destroy(); - } - } - - /** - * SSL handshake. - * - * @param resource $socket - * @return bool - */ - public function doSslHandshake($socket){ - if (\feof($socket)) { - $this->destroy(); - return false; - } - $async = $this instanceof AsyncTcpConnection; - - /** - * We disabled ssl3 because https://blog.qualys.com/ssllabs/2014/10/15/ssl-3-is-dead-killed-by-the-poodle-attack. - * You can enable ssl3 by the codes below. - */ - /*if($async){ - $type = STREAM_CRYPTO_METHOD_SSLv2_CLIENT | STREAM_CRYPTO_METHOD_SSLv23_CLIENT | STREAM_CRYPTO_METHOD_SSLv3_CLIENT; - }else{ - $type = STREAM_CRYPTO_METHOD_SSLv2_SERVER | STREAM_CRYPTO_METHOD_SSLv23_SERVER | STREAM_CRYPTO_METHOD_SSLv3_SERVER; - }*/ - - if($async){ - $type = \STREAM_CRYPTO_METHOD_SSLv2_CLIENT | \STREAM_CRYPTO_METHOD_SSLv23_CLIENT; - }else{ - $type = \STREAM_CRYPTO_METHOD_SSLv2_SERVER | \STREAM_CRYPTO_METHOD_SSLv23_SERVER; - } - - // Hidden error. - \set_error_handler(function($errno, $errstr, $file){ - if (!Worker::$daemonize) { - Worker::safeEcho("SSL handshake error: $errstr \n"); - } - }); - $ret = \stream_socket_enable_crypto($socket, true, $type); - \restore_error_handler(); - // Negotiation has failed. - if (false === $ret) { - $this->destroy(); - return false; - } elseif (0 === $ret) { - // There isn't enough data and should try again. - return 0; - } - if (isset($this->onSslHandshake)) { - try { - \call_user_func($this->onSslHandshake, $this); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - return true; - } - - /** - * This method pulls all the data out of a readable stream, and writes it to the supplied destination. - * - * @param self $dest - * @return void - */ - public function pipe(self $dest) - { - $source = $this; - $this->onMessage = function ($source, $data) use ($dest) { - $dest->send($data); - }; - $this->onClose = function ($source) use ($dest) { - $dest->close(); - }; - $dest->onBufferFull = function ($dest) use ($source) { - $source->pauseRecv(); - }; - $dest->onBufferDrain = function ($dest) use ($source) { - $source->resumeRecv(); - }; - } - - /** - * Remove $length of data from receive buffer. - * - * @param int $length - * @return void - */ - public function consumeRecvBuffer($length) - { - $this->_recvBuffer = \substr($this->_recvBuffer, $length); - } - - /** - * Close connection. - * - * @param mixed $data - * @param bool $raw - * @return void - */ - public function close($data = null, $raw = false) - { - if($this->_status === self::STATUS_CONNECTING){ - $this->destroy(); - return; - } - - if ($this->_status === self::STATUS_CLOSING || $this->_status === self::STATUS_CLOSED) { - return; - } - - if ($data !== null) { - $this->send($data, $raw); - } - - $this->_status = self::STATUS_CLOSING; - - if ($this->_sendBuffer === '') { - $this->destroy(); - } else { - $this->pauseRecv(); - } - } - - /** - * Get the real socket. - * - * @return resource - */ - public function getSocket() - { - return $this->_socket; - } - - /** - * Check whether the send buffer will be full. - * - * @return void - */ - protected function checkBufferWillFull() - { - if ($this->maxSendBufferSize <= \strlen($this->_sendBuffer)) { - if ($this->onBufferFull) { - try { - \call_user_func($this->onBufferFull, $this); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - } - } - - /** - * Whether send buffer is full. - * - * @return bool - */ - protected function bufferIsFull() - { - // Buffer has been marked as full but still has data to send then the packet is discarded. - if ($this->maxSendBufferSize <= \strlen($this->_sendBuffer)) { - if ($this->onError) { - try { - \call_user_func($this->onError, $this, \WORKERMAN_SEND_FAIL, 'send buffer full and drop package'); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - return true; - } - return false; - } - - /** - * Whether send buffer is Empty. - * - * @return bool - */ - public function bufferIsEmpty() - { - return empty($this->_sendBuffer); - } - - /** - * Destroy connection. - * - * @return void - */ - public function destroy() - { - // Avoid repeated calls. - if ($this->_status === self::STATUS_CLOSED) { - return; - } - // Remove event listener. - Worker::$globalEvent->del($this->_socket, EventInterface::EV_READ); - Worker::$globalEvent->del($this->_socket, EventInterface::EV_WRITE); - - // Close socket. - try { - @\fclose($this->_socket); - } catch (\Exception $e) {} catch (\Error $e) {} - - $this->_status = self::STATUS_CLOSED; - // Try to emit onClose callback. - if ($this->onClose) { - try { - \call_user_func($this->onClose, $this); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - // Try to emit protocol::onClose - if ($this->protocol && \method_exists($this->protocol, 'onClose')) { - try { - \call_user_func(array($this->protocol, 'onClose'), $this); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - $this->_sendBuffer = $this->_recvBuffer = ''; - $this->_currentPackageLength = 0; - $this->_isPaused = $this->_sslHandshakeCompleted = false; - if ($this->_status === self::STATUS_CLOSED) { - // Cleaning up the callback to avoid memory leaks. - $this->onMessage = $this->onClose = $this->onError = $this->onBufferFull = $this->onBufferDrain = null; - // Remove from worker->connections. - if ($this->worker) { - unset($this->worker->connections[$this->_id]); - } - unset(static::$connections[$this->_id]); - } - } - - /** - * Destruct. - * - * @return void - */ - public function __destruct() - { - static $mod; - self::$statistics['connection_count']--; - if (Worker::getGracefulStop()) { - if (!isset($mod)) { - $mod = \ceil((self::$statistics['connection_count'] + 1) / 3); - } - - if (0 === self::$statistics['connection_count'] % $mod) { - Worker::log('worker[' . \posix_getpid() . '] remains ' . self::$statistics['connection_count'] . ' connection(s)'); - } - - if(0 === self::$statistics['connection_count']) { - Worker::stopAll(); - } - } - } -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Connection/UdpConnection.php b/GatewayWorker_linux/vendor/workerman/workerman/Connection/UdpConnection.php deleted file mode 100644 index 2974129e..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Connection/UdpConnection.php +++ /dev/null @@ -1,208 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Connection; - -/** - * UdpConnection. - */ -class UdpConnection extends ConnectionInterface -{ - /** - * Application layer protocol. - * The format is like this Workerman\\Protocols\\Http. - * - * @var \Workerman\Protocols\ProtocolInterface - */ - public $protocol = null; - - /** - * Transport layer protocol. - * - * @var string - */ - public $transport = 'udp'; - - /** - * Udp socket. - * - * @var resource - */ - protected $_socket = null; - - /** - * Remote address. - * - * @var string - */ - protected $_remoteAddress = ''; - - /** - * Construct. - * - * @param resource $socket - * @param string $remote_address - */ - public function __construct($socket, $remote_address) - { - $this->_socket = $socket; - $this->_remoteAddress = $remote_address; - } - - /** - * Sends data on the connection. - * - * @param string $send_buffer - * @param bool $raw - * @return void|boolean - */ - public function send($send_buffer, $raw = false) - { - if (false === $raw && $this->protocol) { - $parser = $this->protocol; - $send_buffer = $parser::encode($send_buffer, $this); - if ($send_buffer === '') { - return; - } - } - return \strlen($send_buffer) === \stream_socket_sendto($this->_socket, $send_buffer, 0, $this->_remoteAddress); - } - - /** - * Get remote IP. - * - * @return string - */ - public function getRemoteIp() - { - $pos = \strrpos($this->_remoteAddress, ':'); - if ($pos) { - return \trim(\substr($this->_remoteAddress, 0, $pos), '[]'); - } - return ''; - } - - /** - * Get remote port. - * - * @return int - */ - public function getRemotePort() - { - if ($this->_remoteAddress) { - return (int)\substr(\strrchr($this->_remoteAddress, ':'), 1); - } - return 0; - } - - /** - * Get remote address. - * - * @return string - */ - public function getRemoteAddress() - { - return $this->_remoteAddress; - } - - /** - * Get local IP. - * - * @return string - */ - public function getLocalIp() - { - $address = $this->getLocalAddress(); - $pos = \strrpos($address, ':'); - if (!$pos) { - return ''; - } - return \substr($address, 0, $pos); - } - - /** - * Get local port. - * - * @return int - */ - public function getLocalPort() - { - $address = $this->getLocalAddress(); - $pos = \strrpos($address, ':'); - if (!$pos) { - return 0; - } - return (int)\substr(\strrchr($address, ':'), 1); - } - - /** - * Get local address. - * - * @return string - */ - public function getLocalAddress() - { - return (string)@\stream_socket_get_name($this->_socket, false); - } - - /** - * Is ipv4. - * - * @return bool. - */ - public function isIpV4() - { - if ($this->transport === 'unix') { - return false; - } - return \strpos($this->getRemoteIp(), ':') === false; - } - - /** - * Is ipv6. - * - * @return bool. - */ - public function isIpV6() - { - if ($this->transport === 'unix') { - return false; - } - return \strpos($this->getRemoteIp(), ':') !== false; - } - - /** - * Close connection. - * - * @param mixed $data - * @param bool $raw - * @return bool - */ - public function close($data = null, $raw = false) - { - if ($data !== null) { - $this->send($data, $raw); - } - return true; - } - - /** - * Get the real socket. - * - * @return resource - */ - public function getSocket() - { - return $this->_socket; - } -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Events/Ev.php b/GatewayWorker_linux/vendor/workerman/workerman/Events/Ev.php deleted file mode 100644 index 82c9bdff..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Events/Ev.php +++ /dev/null @@ -1,191 +0,0 @@ - - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Events; - -use Workerman\Worker; -use \EvWatcher; - -/** - * ev eventloop - */ -class Ev implements EventInterface -{ - /** - * All listeners for read/write event. - * - * @var array - */ - protected $_allEvents = array(); - - /** - * Event listeners of signal. - * - * @var array - */ - protected $_eventSignal = array(); - - /** - * All timer event listeners. - * [func, args, event, flag, time_interval] - * - * @var array - */ - protected $_eventTimer = array(); - - /** - * Timer id. - * - * @var int - */ - protected static $_timerId = 1; - - /** - * Add a timer. - * {@inheritdoc} - */ - public function add($fd, $flag, $func, $args = null) - { - $callback = function ($event, $socket) use ($fd, $func) { - try { - \call_user_func($func, $fd); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - }; - switch ($flag) { - case self::EV_SIGNAL: - $event = new \EvSignal($fd, $callback); - $this->_eventSignal[$fd] = $event; - return true; - case self::EV_TIMER: - case self::EV_TIMER_ONCE: - $repeat = $flag === self::EV_TIMER_ONCE ? 0 : $fd; - $param = array($func, (array)$args, $flag, $fd, self::$_timerId); - $event = new \EvTimer($fd, $repeat, array($this, 'timerCallback'), $param); - $this->_eventTimer[self::$_timerId] = $event; - return self::$_timerId++; - default : - $fd_key = (int)$fd; - $real_flag = $flag === self::EV_READ ? \Ev::READ : \Ev::WRITE; - $event = new \EvIo($fd, $real_flag, $callback); - $this->_allEvents[$fd_key][$flag] = $event; - return true; - } - - } - - /** - * Remove a timer. - * {@inheritdoc} - */ - public function del($fd, $flag) - { - switch ($flag) { - case self::EV_READ: - case self::EV_WRITE: - $fd_key = (int)$fd; - if (isset($this->_allEvents[$fd_key][$flag])) { - $this->_allEvents[$fd_key][$flag]->stop(); - unset($this->_allEvents[$fd_key][$flag]); - } - if (empty($this->_allEvents[$fd_key])) { - unset($this->_allEvents[$fd_key]); - } - break; - case self::EV_SIGNAL: - $fd_key = (int)$fd; - if (isset($this->_eventSignal[$fd_key])) { - $this->_eventSignal[$fd_key]->stop(); - unset($this->_eventSignal[$fd_key]); - } - break; - case self::EV_TIMER: - case self::EV_TIMER_ONCE: - if (isset($this->_eventTimer[$fd])) { - $this->_eventTimer[$fd]->stop(); - unset($this->_eventTimer[$fd]); - } - break; - } - return true; - } - - /** - * Timer callback. - * - * @param EvWatcher $event - */ - public function timerCallback(EvWatcher $event) - { - $param = $event->data; - $timer_id = $param[4]; - if ($param[2] === self::EV_TIMER_ONCE) { - $this->_eventTimer[$timer_id]->stop(); - unset($this->_eventTimer[$timer_id]); - } - try { - \call_user_func_array($param[0], $param[1]); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - - /** - * Remove all timers. - * - * @return void - */ - public function clearAllTimer() - { - foreach ($this->_eventTimer as $event) { - $event->stop(); - } - $this->_eventTimer = array(); - } - - /** - * Main loop. - * - * @see EventInterface::loop() - */ - public function loop() - { - \Ev::run(); - } - - /** - * Destroy loop. - * - * @return void - */ - public function destroy() - { - foreach ($this->_allEvents as $event) { - $event->stop(); - } - } - - /** - * Get timer count. - * - * @return integer - */ - public function getTimerCount() - { - return \count($this->_eventTimer); - } -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Events/Event.php b/GatewayWorker_linux/vendor/workerman/workerman/Events/Event.php deleted file mode 100644 index 9e25521c..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Events/Event.php +++ /dev/null @@ -1,215 +0,0 @@ - - * @copyright 有个鬼<42765633@qq.com> - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Events; - -use Workerman\Worker; - -/** - * libevent eventloop - */ -class Event implements EventInterface -{ - /** - * Event base. - * @var object - */ - protected $_eventBase = null; - - /** - * All listeners for read/write event. - * @var array - */ - protected $_allEvents = array(); - - /** - * Event listeners of signal. - * @var array - */ - protected $_eventSignal = array(); - - /** - * All timer event listeners. - * [func, args, event, flag, time_interval] - * @var array - */ - protected $_eventTimer = array(); - - /** - * Timer id. - * @var int - */ - protected static $_timerId = 1; - - /** - * construct - * @return void - */ - public function __construct() - { - if (\class_exists('\\\\EventBase', false)) { - $class_name = '\\\\EventBase'; - } else { - $class_name = '\EventBase'; - } - $this->_eventBase = new $class_name(); - } - - /** - * @see EventInterface::add() - */ - public function add($fd, $flag, $func, $args=array()) - { - if (\class_exists('\\\\Event', false)) { - $class_name = '\\\\Event'; - } else { - $class_name = '\Event'; - } - switch ($flag) { - case self::EV_SIGNAL: - - $fd_key = (int)$fd; - $event = $class_name::signal($this->_eventBase, $fd, $func); - if (!$event||!$event->add()) { - return false; - } - $this->_eventSignal[$fd_key] = $event; - return true; - - case self::EV_TIMER: - case self::EV_TIMER_ONCE: - - $param = array($func, (array)$args, $flag, $fd, self::$_timerId); - $event = new $class_name($this->_eventBase, -1, $class_name::TIMEOUT|$class_name::PERSIST, array($this, "timerCallback"), $param); - if (!$event||!$event->addTimer($fd)) { - return false; - } - $this->_eventTimer[self::$_timerId] = $event; - return self::$_timerId++; - - default : - $fd_key = (int)$fd; - $real_flag = $flag === self::EV_READ ? $class_name::READ | $class_name::PERSIST : $class_name::WRITE | $class_name::PERSIST; - $event = new $class_name($this->_eventBase, $fd, $real_flag, $func, $fd); - if (!$event||!$event->add()) { - return false; - } - $this->_allEvents[$fd_key][$flag] = $event; - return true; - } - } - - /** - * @see Events\EventInterface::del() - */ - public function del($fd, $flag) - { - switch ($flag) { - - case self::EV_READ: - case self::EV_WRITE: - - $fd_key = (int)$fd; - if (isset($this->_allEvents[$fd_key][$flag])) { - $this->_allEvents[$fd_key][$flag]->del(); - unset($this->_allEvents[$fd_key][$flag]); - } - if (empty($this->_allEvents[$fd_key])) { - unset($this->_allEvents[$fd_key]); - } - break; - - case self::EV_SIGNAL: - $fd_key = (int)$fd; - if (isset($this->_eventSignal[$fd_key])) { - $this->_eventSignal[$fd_key]->del(); - unset($this->_eventSignal[$fd_key]); - } - break; - - case self::EV_TIMER: - case self::EV_TIMER_ONCE: - if (isset($this->_eventTimer[$fd])) { - $this->_eventTimer[$fd]->del(); - unset($this->_eventTimer[$fd]); - } - break; - } - return true; - } - - /** - * Timer callback. - * @param int|null $fd - * @param int $what - * @param int $timer_id - */ - public function timerCallback($fd, $what, $param) - { - $timer_id = $param[4]; - - if ($param[2] === self::EV_TIMER_ONCE) { - $this->_eventTimer[$timer_id]->del(); - unset($this->_eventTimer[$timer_id]); - } - - try { - \call_user_func_array($param[0], $param[1]); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - - /** - * @see Events\EventInterface::clearAllTimer() - * @return void - */ - public function clearAllTimer() - { - foreach ($this->_eventTimer as $event) { - $event->del(); - } - $this->_eventTimer = array(); - } - - - /** - * @see EventInterface::loop() - */ - public function loop() - { - $this->_eventBase->loop(); - } - - /** - * Destroy loop. - * - * @return void - */ - public function destroy() - { - $this->_eventBase->exit(); - } - - /** - * Get timer count. - * - * @return integer - */ - public function getTimerCount() - { - return \count($this->_eventTimer); - } -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Events/EventInterface.php b/GatewayWorker_linux/vendor/workerman/workerman/Events/EventInterface.php deleted file mode 100644 index e6f59c64..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Events/EventInterface.php +++ /dev/null @@ -1,107 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Events; - -interface EventInterface -{ - /** - * Read event. - * - * @var int - */ - const EV_READ = 1; - - /** - * Write event. - * - * @var int - */ - const EV_WRITE = 2; - - /** - * Except event - * - * @var int - */ - const EV_EXCEPT = 3; - - /** - * Signal event. - * - * @var int - */ - const EV_SIGNAL = 4; - - /** - * Timer event. - * - * @var int - */ - const EV_TIMER = 8; - - /** - * Timer once event. - * - * @var int - */ - const EV_TIMER_ONCE = 16; - - /** - * Add event listener to event loop. - * - * @param mixed $fd - * @param int $flag - * @param callable $func - * @param array $args - * @return bool - */ - public function add($fd, $flag, $func, $args = array()); - - /** - * Remove event listener from event loop. - * - * @param mixed $fd - * @param int $flag - * @return bool - */ - public function del($fd, $flag); - - /** - * Remove all timers. - * - * @return void - */ - public function clearAllTimer(); - - /** - * Main loop. - * - * @return void - */ - public function loop(); - - /** - * Destroy loop. - * - * @return mixed - */ - public function destroy(); - - /** - * Get Timer count. - * - * @return mixed - */ - public function getTimerCount(); -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Events/Libevent.php b/GatewayWorker_linux/vendor/workerman/workerman/Events/Libevent.php deleted file mode 100644 index 5f61e9c2..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Events/Libevent.php +++ /dev/null @@ -1,225 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Events; - -use Workerman\Worker; - -/** - * libevent eventloop - */ -class Libevent implements EventInterface -{ - /** - * Event base. - * - * @var resource - */ - protected $_eventBase = null; - - /** - * All listeners for read/write event. - * - * @var array - */ - protected $_allEvents = array(); - - /** - * Event listeners of signal. - * - * @var array - */ - protected $_eventSignal = array(); - - /** - * All timer event listeners. - * [func, args, event, flag, time_interval] - * - * @var array - */ - protected $_eventTimer = array(); - - /** - * construct - */ - public function __construct() - { - $this->_eventBase = \event_base_new(); - } - - /** - * {@inheritdoc} - */ - public function add($fd, $flag, $func, $args = array()) - { - switch ($flag) { - case self::EV_SIGNAL: - $fd_key = (int)$fd; - $real_flag = \EV_SIGNAL | \EV_PERSIST; - $this->_eventSignal[$fd_key] = \event_new(); - if (!\event_set($this->_eventSignal[$fd_key], $fd, $real_flag, $func, null)) { - return false; - } - if (!\event_base_set($this->_eventSignal[$fd_key], $this->_eventBase)) { - return false; - } - if (!\event_add($this->_eventSignal[$fd_key])) { - return false; - } - return true; - case self::EV_TIMER: - case self::EV_TIMER_ONCE: - $event = \event_new(); - $timer_id = (int)$event; - if (!\event_set($event, 0, \EV_TIMEOUT, array($this, 'timerCallback'), $timer_id)) { - return false; - } - - if (!\event_base_set($event, $this->_eventBase)) { - return false; - } - - $time_interval = $fd * 1000000; - if (!\event_add($event, $time_interval)) { - return false; - } - $this->_eventTimer[$timer_id] = array($func, (array)$args, $event, $flag, $time_interval); - return $timer_id; - - default : - $fd_key = (int)$fd; - $real_flag = $flag === self::EV_READ ? \EV_READ | \EV_PERSIST : \EV_WRITE | \EV_PERSIST; - - $event = \event_new(); - - if (!\event_set($event, $fd, $real_flag, $func, null)) { - return false; - } - - if (!\event_base_set($event, $this->_eventBase)) { - return false; - } - - if (!\event_add($event)) { - return false; - } - - $this->_allEvents[$fd_key][$flag] = $event; - - return true; - } - - } - - /** - * {@inheritdoc} - */ - public function del($fd, $flag) - { - switch ($flag) { - case self::EV_READ: - case self::EV_WRITE: - $fd_key = (int)$fd; - if (isset($this->_allEvents[$fd_key][$flag])) { - \event_del($this->_allEvents[$fd_key][$flag]); - unset($this->_allEvents[$fd_key][$flag]); - } - if (empty($this->_allEvents[$fd_key])) { - unset($this->_allEvents[$fd_key]); - } - break; - case self::EV_SIGNAL: - $fd_key = (int)$fd; - if (isset($this->_eventSignal[$fd_key])) { - \event_del($this->_eventSignal[$fd_key]); - unset($this->_eventSignal[$fd_key]); - } - break; - case self::EV_TIMER: - case self::EV_TIMER_ONCE: - // 这里 fd 为timerid - if (isset($this->_eventTimer[$fd])) { - \event_del($this->_eventTimer[$fd][2]); - unset($this->_eventTimer[$fd]); - } - break; - } - return true; - } - - /** - * Timer callback. - * - * @param mixed $_null1 - * @param int $_null2 - * @param mixed $timer_id - */ - protected function timerCallback($_null1, $_null2, $timer_id) - { - if ($this->_eventTimer[$timer_id][3] === self::EV_TIMER) { - \event_add($this->_eventTimer[$timer_id][2], $this->_eventTimer[$timer_id][4]); - } - try { - \call_user_func_array($this->_eventTimer[$timer_id][0], $this->_eventTimer[$timer_id][1]); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - if (isset($this->_eventTimer[$timer_id]) && $this->_eventTimer[$timer_id][3] === self::EV_TIMER_ONCE) { - $this->del($timer_id, self::EV_TIMER_ONCE); - } - } - - /** - * {@inheritdoc} - */ - public function clearAllTimer() - { - foreach ($this->_eventTimer as $task_data) { - \event_del($task_data[2]); - } - $this->_eventTimer = array(); - } - - /** - * {@inheritdoc} - */ - public function loop() - { - \event_base_loop($this->_eventBase); - } - - /** - * Destroy loop. - * - * @return void - */ - public function destroy() - { - foreach ($this->_eventSignal as $event) { - \event_del($event); - } - } - - /** - * Get timer count. - * - * @return integer - */ - public function getTimerCount() - { - return \count($this->_eventTimer); - } -} - diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Events/React/Base.php b/GatewayWorker_linux/vendor/workerman/workerman/Events/React/Base.php deleted file mode 100644 index bce4f735..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Events/React/Base.php +++ /dev/null @@ -1,264 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Events\React; - -use Workerman\Events\EventInterface; -use React\EventLoop\TimerInterface; -use React\EventLoop\LoopInterface; - -/** - * Class StreamSelectLoop - * @package Workerman\Events\React - */ -class Base implements LoopInterface -{ - /** - * @var array - */ - protected $_timerIdMap = array(); - - /** - * @var int - */ - protected $_timerIdIndex = 0; - - /** - * @var array - */ - protected $_signalHandlerMap = array(); - - /** - * @var LoopInterface - */ - protected $_eventLoop = null; - - /** - * Base constructor. - */ - public function __construct() - { - $this->_eventLoop = new \React\EventLoop\StreamSelectLoop(); - } - - /** - * Add event listener to event loop. - * - * @param int $fd - * @param int $flag - * @param callable $func - * @param array $args - * @return bool - */ - public function add($fd, $flag, $func, array $args = array()) - { - $args = (array)$args; - switch ($flag) { - case EventInterface::EV_READ: - return $this->addReadStream($fd, $func); - case EventInterface::EV_WRITE: - return $this->addWriteStream($fd, $func); - case EventInterface::EV_SIGNAL: - if (isset($this->_signalHandlerMap[$fd])) { - $this->removeSignal($fd, $this->_signalHandlerMap[$fd]); - } - $this->_signalHandlerMap[$fd] = $func; - return $this->addSignal($fd, $func); - case EventInterface::EV_TIMER: - $timer_obj = $this->addPeriodicTimer($fd, function() use ($func, $args) { - \call_user_func_array($func, $args); - }); - $this->_timerIdMap[++$this->_timerIdIndex] = $timer_obj; - return $this->_timerIdIndex; - case EventInterface::EV_TIMER_ONCE: - $index = ++$this->_timerIdIndex; - $timer_obj = $this->addTimer($fd, function() use ($func, $args, $index) { - $this->del($index,EventInterface::EV_TIMER_ONCE); - \call_user_func_array($func, $args); - }); - $this->_timerIdMap[$index] = $timer_obj; - return $this->_timerIdIndex; - } - return false; - } - - /** - * Remove event listener from event loop. - * - * @param mixed $fd - * @param int $flag - * @return bool - */ - public function del($fd, $flag) - { - switch ($flag) { - case EventInterface::EV_READ: - return $this->removeReadStream($fd); - case EventInterface::EV_WRITE: - return $this->removeWriteStream($fd); - case EventInterface::EV_SIGNAL: - if (!isset($this->_eventLoop[$fd])) { - return false; - } - $func = $this->_eventLoop[$fd]; - unset($this->_eventLoop[$fd]); - return $this->removeSignal($fd, $func); - - case EventInterface::EV_TIMER: - case EventInterface::EV_TIMER_ONCE: - if (isset($this->_timerIdMap[$fd])){ - $timer_obj = $this->_timerIdMap[$fd]; - unset($this->_timerIdMap[$fd]); - $this->cancelTimer($timer_obj); - return true; - } - } - return false; - } - - - /** - * Main loop. - * - * @return void - */ - public function loop() - { - $this->run(); - } - - - /** - * Destroy loop. - * - * @return void - */ - public function destroy() - { - - } - - /** - * Get timer count. - * - * @return integer - */ - public function getTimerCount() - { - return \count($this->_timerIdMap); - } - - /** - * @param resource $stream - * @param callable $listener - */ - public function addReadStream($stream, $listener) - { - return $this->_eventLoop->addReadStream($stream, $listener); - } - - /** - * @param resource $stream - * @param callable $listener - */ - public function addWriteStream($stream, $listener) - { - return $this->_eventLoop->addWriteStream($stream, $listener); - } - - /** - * @param resource $stream - */ - public function removeReadStream($stream) - { - return $this->_eventLoop->removeReadStream($stream); - } - - /** - * @param resource $stream - */ - public function removeWriteStream($stream) - { - return $this->_eventLoop->removeWriteStream($stream); - } - - /** - * @param float|int $interval - * @param callable $callback - * @return \React\EventLoop\Timer\Timer|TimerInterface - */ - public function addTimer($interval, $callback) - { - return $this->_eventLoop->addTimer($interval, $callback); - } - - /** - * @param float|int $interval - * @param callable $callback - * @return \React\EventLoop\Timer\Timer|TimerInterface - */ - public function addPeriodicTimer($interval, $callback) - { - return $this->_eventLoop->addPeriodicTimer($interval, $callback); - } - - /** - * @param TimerInterface $timer - */ - public function cancelTimer(TimerInterface $timer) - { - return $this->_eventLoop->cancelTimer($timer); - } - - /** - * @param callable $listener - */ - public function futureTick($listener) - { - return $this->_eventLoop->futureTick($listener); - } - - /** - * @param int $signal - * @param callable $listener - */ - public function addSignal($signal, $listener) - { - return $this->_eventLoop->addSignal($signal, $listener); - } - - /** - * @param int $signal - * @param callable $listener - */ - public function removeSignal($signal, $listener) - { - return $this->_eventLoop->removeSignal($signal, $listener); - } - - /** - * Run. - */ - public function run() - { - return $this->_eventLoop->run(); - } - - /** - * Stop. - */ - public function stop() - { - return $this->_eventLoop->stop(); - } -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Events/React/ExtEventLoop.php b/GatewayWorker_linux/vendor/workerman/workerman/Events/React/ExtEventLoop.php deleted file mode 100644 index 3dab25b9..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Events/React/ExtEventLoop.php +++ /dev/null @@ -1,27 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Events\React; - -/** - * Class ExtEventLoop - * @package Workerman\Events\React - */ -class ExtEventLoop extends Base -{ - - public function __construct() - { - $this->_eventLoop = new \React\EventLoop\ExtEventLoop(); - } -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Events/React/ExtLibEventLoop.php b/GatewayWorker_linux/vendor/workerman/workerman/Events/React/ExtLibEventLoop.php deleted file mode 100644 index eb02b358..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Events/React/ExtLibEventLoop.php +++ /dev/null @@ -1,27 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Events\React; -use Workerman\Events\EventInterface; - -/** - * Class ExtLibEventLoop - * @package Workerman\Events\React - */ -class ExtLibEventLoop extends Base -{ - public function __construct() - { - $this->_eventLoop = new \React\EventLoop\ExtLibeventLoop(); - } -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Events/React/StreamSelectLoop.php b/GatewayWorker_linux/vendor/workerman/workerman/Events/React/StreamSelectLoop.php deleted file mode 100644 index 7f5f94bd..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Events/React/StreamSelectLoop.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Events\React; - -/** - * Class StreamSelectLoop - * @package Workerman\Events\React - */ -class StreamSelectLoop extends Base -{ - public function __construct() - { - $this->_eventLoop = new \React\EventLoop\StreamSelectLoop(); - } -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Events/Select.php b/GatewayWorker_linux/vendor/workerman/workerman/Events/Select.php deleted file mode 100644 index 069ab8b6..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Events/Select.php +++ /dev/null @@ -1,341 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Events; - -/** - * select eventloop - */ -class Select implements EventInterface -{ - /** - * All listeners for read/write event. - * - * @var array - */ - public $_allEvents = array(); - - /** - * Event listeners of signal. - * - * @var array - */ - public $_signalEvents = array(); - - /** - * Fds waiting for read event. - * - * @var array - */ - protected $_readFds = array(); - - /** - * Fds waiting for write event. - * - * @var array - */ - protected $_writeFds = array(); - - /** - * Fds waiting for except event. - * - * @var array - */ - protected $_exceptFds = array(); - - /** - * Timer scheduler. - * {['data':timer_id, 'priority':run_timestamp], ..} - * - * @var \SplPriorityQueue - */ - protected $_scheduler = null; - - /** - * All timer event listeners. - * [[func, args, flag, timer_interval], ..] - * - * @var array - */ - protected $_eventTimer = array(); - - /** - * Timer id. - * - * @var int - */ - protected $_timerId = 1; - - /** - * Select timeout. - * - * @var int - */ - protected $_selectTimeout = 100000000; - - /** - * Paired socket channels - * - * @var array - */ - protected $channel = array(); - - /** - * Construct. - */ - public function __construct() - { - // Init SplPriorityQueue. - $this->_scheduler = new \SplPriorityQueue(); - $this->_scheduler->setExtractFlags(\SplPriorityQueue::EXTR_BOTH); - } - - /** - * {@inheritdoc} - */ - public function add($fd, $flag, $func, $args = array()) - { - switch ($flag) { - case self::EV_READ: - case self::EV_WRITE: - $count = $flag === self::EV_READ ? \count($this->_readFds) : \count($this->_writeFds); - if ($count >= 1024) { - echo "Warning: system call select exceeded the maximum number of connections 1024, please install event/libevent extension for more connections.\n"; - } else if (\DIRECTORY_SEPARATOR !== '/' && $count >= 256) { - echo "Warning: system call select exceeded the maximum number of connections 256.\n"; - } - $fd_key = (int)$fd; - $this->_allEvents[$fd_key][$flag] = array($func, $fd); - if ($flag === self::EV_READ) { - $this->_readFds[$fd_key] = $fd; - } else { - $this->_writeFds[$fd_key] = $fd; - } - break; - case self::EV_EXCEPT: - $fd_key = (int)$fd; - $this->_allEvents[$fd_key][$flag] = array($func, $fd); - $this->_exceptFds[$fd_key] = $fd; - break; - case self::EV_SIGNAL: - // Windows not support signal. - if(\DIRECTORY_SEPARATOR !== '/') { - return false; - } - $fd_key = (int)$fd; - $this->_signalEvents[$fd_key][$flag] = array($func, $fd); - \pcntl_signal($fd, array($this, 'signalHandler')); - break; - case self::EV_TIMER: - case self::EV_TIMER_ONCE: - $timer_id = $this->_timerId++; - $run_time = \microtime(true) + $fd; - $this->_scheduler->insert($timer_id, -$run_time); - $this->_eventTimer[$timer_id] = array($func, (array)$args, $flag, $fd); - $select_timeout = ($run_time - \microtime(true)) * 1000000; - $select_timeout = $select_timeout <= 0 ? 1 : $select_timeout; - if( $this->_selectTimeout > $select_timeout ){ - $this->_selectTimeout = (int) $select_timeout; - } - return $timer_id; - } - - return true; - } - - /** - * Signal handler. - * - * @param int $signal - */ - public function signalHandler($signal) - { - \call_user_func_array($this->_signalEvents[$signal][self::EV_SIGNAL][0], array($signal)); - } - - /** - * {@inheritdoc} - */ - public function del($fd, $flag) - { - $fd_key = (int)$fd; - switch ($flag) { - case self::EV_READ: - unset($this->_allEvents[$fd_key][$flag], $this->_readFds[$fd_key]); - if (empty($this->_allEvents[$fd_key])) { - unset($this->_allEvents[$fd_key]); - } - return true; - case self::EV_WRITE: - unset($this->_allEvents[$fd_key][$flag], $this->_writeFds[$fd_key]); - if (empty($this->_allEvents[$fd_key])) { - unset($this->_allEvents[$fd_key]); - } - return true; - case self::EV_EXCEPT: - unset($this->_allEvents[$fd_key][$flag], $this->_exceptFds[$fd_key]); - if(empty($this->_allEvents[$fd_key])) - { - unset($this->_allEvents[$fd_key]); - } - return true; - case self::EV_SIGNAL: - if(\DIRECTORY_SEPARATOR !== '/') { - return false; - } - unset($this->_signalEvents[$fd_key]); - \pcntl_signal($fd, SIG_IGN); - break; - case self::EV_TIMER: - case self::EV_TIMER_ONCE; - unset($this->_eventTimer[$fd_key]); - return true; - } - return false; - } - - /** - * Tick for timer. - * - * @return void - */ - protected function tick() - { - while (!$this->_scheduler->isEmpty()) { - $scheduler_data = $this->_scheduler->top(); - $timer_id = $scheduler_data['data']; - $next_run_time = -$scheduler_data['priority']; - $time_now = \microtime(true); - $this->_selectTimeout = (int) (($next_run_time - $time_now) * 1000000); - if ($this->_selectTimeout <= 0) { - $this->_scheduler->extract(); - - if (!isset($this->_eventTimer[$timer_id])) { - continue; - } - - // [func, args, flag, timer_interval] - $task_data = $this->_eventTimer[$timer_id]; - if ($task_data[2] === self::EV_TIMER) { - $next_run_time = $time_now + $task_data[3]; - $this->_scheduler->insert($timer_id, -$next_run_time); - } - \call_user_func_array($task_data[0], $task_data[1]); - if (isset($this->_eventTimer[$timer_id]) && $task_data[2] === self::EV_TIMER_ONCE) { - $this->del($timer_id, self::EV_TIMER_ONCE); - } - continue; - } - return; - } - $this->_selectTimeout = 100000000; - } - - /** - * {@inheritdoc} - */ - public function clearAllTimer() - { - $this->_scheduler = new \SplPriorityQueue(); - $this->_scheduler->setExtractFlags(\SplPriorityQueue::EXTR_BOTH); - $this->_eventTimer = array(); - } - - /** - * {@inheritdoc} - */ - public function loop() - { - while (1) { - if(\DIRECTORY_SEPARATOR === '/') { - // Calls signal handlers for pending signals - \pcntl_signal_dispatch(); - } - - $read = $this->_readFds; - $write = $this->_writeFds; - $except = $this->_exceptFds; - $ret = false; - - if ($read || $write || $except) { - // Waiting read/write/signal/timeout events. - try { - $ret = @stream_select($read, $write, $except, 0, $this->_selectTimeout); - } catch (\Exception $e) {} catch (\Error $e) {} - - } else { - $this->_selectTimeout >= 1 && usleep($this->_selectTimeout); - $ret = false; - } - - - if (!$this->_scheduler->isEmpty()) { - $this->tick(); - } - - if (!$ret) { - continue; - } - - if ($read) { - foreach ($read as $fd) { - $fd_key = (int)$fd; - if (isset($this->_allEvents[$fd_key][self::EV_READ])) { - \call_user_func_array($this->_allEvents[$fd_key][self::EV_READ][0], - array($this->_allEvents[$fd_key][self::EV_READ][1])); - } - } - } - - if ($write) { - foreach ($write as $fd) { - $fd_key = (int)$fd; - if (isset($this->_allEvents[$fd_key][self::EV_WRITE])) { - \call_user_func_array($this->_allEvents[$fd_key][self::EV_WRITE][0], - array($this->_allEvents[$fd_key][self::EV_WRITE][1])); - } - } - } - - if($except) { - foreach($except as $fd) { - $fd_key = (int) $fd; - if(isset($this->_allEvents[$fd_key][self::EV_EXCEPT])) { - \call_user_func_array($this->_allEvents[$fd_key][self::EV_EXCEPT][0], - array($this->_allEvents[$fd_key][self::EV_EXCEPT][1])); - } - } - } - } - } - - /** - * Destroy loop. - * - * @return void - */ - public function destroy() - { - - } - - /** - * Get timer count. - * - * @return integer - */ - public function getTimerCount() - { - return \count($this->_eventTimer); - } -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Events/Swoole.php b/GatewayWorker_linux/vendor/workerman/workerman/Events/Swoole.php deleted file mode 100644 index fcd74723..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Events/Swoole.php +++ /dev/null @@ -1,230 +0,0 @@ - - * @link http://www.workerman.net/ - * @link https://github.com/ares333/Workerman - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Events; - -use Workerman\Worker; -use Swoole\Event; -use Swoole\Timer; - -class Swoole implements EventInterface -{ - - protected $_timer = array(); - - protected $_timerOnceMap = array(); - - protected $mapId = 0; - - protected $_fd = array(); - - // milisecond - public static $signalDispatchInterval = 500; - - protected $_hasSignal = false; - - /** - * - * {@inheritdoc} - * - * @see \Workerman\Events\EventInterface::add() - */ - public function add($fd, $flag, $func, $args = array()) - { - switch ($flag) { - case self::EV_SIGNAL: - $res = \pcntl_signal($fd, $func, false); - if (! $this->_hasSignal && $res) { - Timer::tick(static::$signalDispatchInterval, - function () { - \pcntl_signal_dispatch(); - }); - $this->_hasSignal = true; - } - return $res; - case self::EV_TIMER: - case self::EV_TIMER_ONCE: - $method = self::EV_TIMER === $flag ? 'tick' : 'after'; - if ($this->mapId > \PHP_INT_MAX) { - $this->mapId = 0; - } - $mapId = $this->mapId++; - $t = (int)($fd * 1000); - if ($t < 1) { - $t = 1; - } - $timer_id = Timer::$method($t, - function ($timer_id = null) use ($func, $args, $mapId) { - try { - \call_user_func_array($func, (array)$args); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - // EV_TIMER_ONCE - if (! isset($timer_id)) { - // may be deleted in $func - if (\array_key_exists($mapId, $this->_timerOnceMap)) { - $timer_id = $this->_timerOnceMap[$mapId]; - unset($this->_timer[$timer_id], - $this->_timerOnceMap[$mapId]); - } - } - }); - if ($flag === self::EV_TIMER_ONCE) { - $this->_timerOnceMap[$mapId] = $timer_id; - $this->_timer[$timer_id] = $mapId; - } else { - $this->_timer[$timer_id] = null; - } - return $timer_id; - case self::EV_READ: - case self::EV_WRITE: - $fd_key = (int) $fd; - if (! isset($this->_fd[$fd_key])) { - if ($flag === self::EV_READ) { - $res = Event::add($fd, $func, null, SWOOLE_EVENT_READ); - $fd_type = SWOOLE_EVENT_READ; - } else { - $res = Event::add($fd, null, $func, SWOOLE_EVENT_WRITE); - $fd_type = SWOOLE_EVENT_WRITE; - } - if ($res) { - $this->_fd[$fd_key] = $fd_type; - } - } else { - $fd_val = $this->_fd[$fd_key]; - $res = true; - if ($flag === self::EV_READ) { - if (($fd_val & SWOOLE_EVENT_READ) !== SWOOLE_EVENT_READ) { - $res = Event::set($fd, $func, null, - SWOOLE_EVENT_READ | SWOOLE_EVENT_WRITE); - $this->_fd[$fd_key] |= SWOOLE_EVENT_READ; - } - } else { - if (($fd_val & SWOOLE_EVENT_WRITE) !== SWOOLE_EVENT_WRITE) { - $res = Event::set($fd, null, $func, - SWOOLE_EVENT_READ | SWOOLE_EVENT_WRITE); - $this->_fd[$fd_key] |= SWOOLE_EVENT_WRITE; - } - } - } - return $res; - } - } - - /** - * - * {@inheritdoc} - * - * @see \Workerman\Events\EventInterface::del() - */ - public function del($fd, $flag) - { - switch ($flag) { - case self::EV_SIGNAL: - return \pcntl_signal($fd, SIG_IGN, false); - case self::EV_TIMER: - case self::EV_TIMER_ONCE: - // already remove in EV_TIMER_ONCE callback. - if (! \array_key_exists($fd, $this->_timer)) { - return true; - } - $res = Timer::clear($fd); - if ($res) { - $mapId = $this->_timer[$fd]; - if (isset($mapId)) { - unset($this->_timerOnceMap[$mapId]); - } - unset($this->_timer[$fd]); - } - return $res; - case self::EV_READ: - case self::EV_WRITE: - $fd_key = (int) $fd; - if (isset($this->_fd[$fd_key])) { - $fd_val = $this->_fd[$fd_key]; - if ($flag === self::EV_READ) { - $flag_remove = ~ SWOOLE_EVENT_READ; - } else { - $flag_remove = ~ SWOOLE_EVENT_WRITE; - } - $fd_val &= $flag_remove; - if (0 === $fd_val) { - $res = Event::del($fd); - if ($res) { - unset($this->_fd[$fd_key]); - } - } else { - $res = Event::set($fd, null, null, $fd_val); - if ($res) { - $this->_fd[$fd_key] = $fd_val; - } - } - } else { - $res = true; - } - return $res; - } - } - - /** - * - * {@inheritdoc} - * - * @see \Workerman\Events\EventInterface::clearAllTimer() - */ - public function clearAllTimer() - { - foreach (array_keys($this->_timer) as $v) { - Timer::clear($v); - } - $this->_timer = array(); - $this->_timerOnceMap = array(); - } - - /** - * - * {@inheritdoc} - * - * @see \Workerman\Events\EventInterface::loop() - */ - public function loop() - { - Event::wait(); - } - - /** - * - * {@inheritdoc} - * - * @see \Workerman\Events\EventInterface::destroy() - */ - public function destroy() - { - Event::exit(); - posix_kill(posix_getpid(), SIGINT); - } - - /** - * - * {@inheritdoc} - * - * @see \Workerman\Events\EventInterface::getTimerCount() - */ - public function getTimerCount() - { - return \count($this->_timer); - } -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Lib/Constants.php b/GatewayWorker_linux/vendor/workerman/workerman/Lib/Constants.php deleted file mode 100644 index f5e24241..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Lib/Constants.php +++ /dev/null @@ -1,44 +0,0 @@ - - * @copyright walkor - * @license http://www.opensource.org/licenses/mit-license.php MIT License - * - * @link http://www.workerman.net/ - */ - -// Pcre.jit is not stable, temporarily disabled. -ini_set('pcre.jit', 0); - -// For onError callback. -const WORKERMAN_CONNECT_FAIL = 1; -// For onError callback. -const WORKERMAN_SEND_FAIL = 2; - -// Define OS Type -const OS_TYPE_LINUX = 'linux'; -const OS_TYPE_WINDOWS = 'windows'; - -// Compatible with php7 -if (!class_exists('Error')) { - class Error extends Exception - { - } -} - -if (!interface_exists('SessionHandlerInterface')) { - interface SessionHandlerInterface { - public function close(); - public function destroy($session_id); - public function gc($maxlifetime); - public function open($save_path ,$session_name); - public function read($session_id); - public function write($session_id , $session_data); - } -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Lib/Timer.php b/GatewayWorker_linux/vendor/workerman/workerman/Lib/Timer.php deleted file mode 100644 index b1100510..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Lib/Timer.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Lib; - -/** - * Do not use Workerman\Lib\Timer. - * Please use Workerman\Timer. - * This class is only used for compatibility with workerman 3.* - * @package Workerman\Lib - */ -class Timer extends \Workerman\Timer {} \ No newline at end of file diff --git a/GatewayWorker_linux/vendor/workerman/workerman/MIT-LICENSE.txt b/GatewayWorker_linux/vendor/workerman/workerman/MIT-LICENSE.txt deleted file mode 100644 index fd6b1c83..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/MIT-LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License - -Copyright (c) 2009-2015 walkor and contributors (see https://github.com/walkor/workerman/contributors) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Frame.php b/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Frame.php deleted file mode 100644 index 26b04de4..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Frame.php +++ /dev/null @@ -1,61 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Protocols; - -use Workerman\Connection\TcpConnection; - -/** - * Frame Protocol. - */ -class Frame -{ - /** - * Check the integrity of the package. - * - * @param string $buffer - * @param TcpConnection $connection - * @return int - */ - public static function input($buffer, TcpConnection $connection) - { - if (\strlen($buffer) < 4) { - return 0; - } - $unpack_data = \unpack('Ntotal_length', $buffer); - return $unpack_data['total_length']; - } - - /** - * Decode. - * - * @param string $buffer - * @return string - */ - public static function decode($buffer) - { - return \substr($buffer, 4); - } - - /** - * Encode. - * - * @param string $buffer - * @return string - */ - public static function encode($buffer) - { - $total_length = 4 + \strlen($buffer); - return \pack('N', $total_length) . $buffer; - } -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http.php b/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http.php deleted file mode 100644 index be3599fb..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http.php +++ /dev/null @@ -1,330 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Protocols; - -use Workerman\Connection\TcpConnection; -use Workerman\Protocols\Http\Request; -use Workerman\Protocols\Http\Response; -use Workerman\Protocols\Websocket; -use Workerman\Worker; - -/** - * Class Http. - * @package Workerman\Protocols - */ -class Http -{ - /** - * Request class name. - * - * @var string - */ - protected static $_requestClass = 'Workerman\Protocols\Http\Request'; - - /** - * Session name. - * - * @var string - */ - protected static $_sessionName = 'PHPSID'; - - /** - * Upload tmp dir. - * - * @var string - */ - protected static $_uploadTmpDir = ''; - - /** - * Open cache. - * - * @var bool. - */ - protected static $_enableCache = true; - - /** - * Get or set session name. - * - * @param string|null $name - * @return string - */ - public static function sessionName($name = null) - { - if ($name !== null && $name !== '') { - static::$_sessionName = (string)$name; - } - return static::$_sessionName; - } - - /** - * Get or set the request class name. - * - * @param string|null $class_name - * @return string - */ - public static function requestClass($class_name = null) - { - if ($class_name) { - static::$_requestClass = $class_name; - } - return static::$_requestClass; - } - - /** - * Enable or disable Cache. - * - * @param mixed $value - */ - public static function enableCache($value) - { - static::$_enableCache = (bool)$value; - } - - /** - * Check the integrity of the package. - * - * @param string $recv_buffer - * @param TcpConnection $connection - * @return int - */ - public static function input($recv_buffer, TcpConnection $connection) - { - static $input = array(); - if (!isset($recv_buffer[512]) && isset($input[$recv_buffer])) { - return $input[$recv_buffer]; - } - $crlf_pos = \strpos($recv_buffer, "\r\n\r\n"); - if (false === $crlf_pos) { - // Judge whether the package length exceeds the limit. - if ($recv_len = \strlen($recv_buffer) >= 16384) { - $connection->close("HTTP/1.1 413 Request Entity Too Large\r\n\r\n"); - return 0; - } - return 0; - } - - $head_len = $crlf_pos + 4; - $method = \strstr($recv_buffer, ' ', true); - - if ($method === 'GET' || $method === 'OPTIONS' || $method === 'HEAD' || $method === 'DELETE') { - if (!isset($recv_buffer[512])) { - $input[$recv_buffer] = $head_len; - if (\count($input) > 512) { - unset($input[key($input)]); - } - } - return $head_len; - } else if ($method !== 'POST' && $method !== 'PUT' && $method !== 'PATCH') { - $connection->close("HTTP/1.1 400 Bad Request\r\n\r\n", true); - return 0; - } - - $header = \substr($recv_buffer, 0, $crlf_pos); - $length = false; - if ($pos = \strpos($header, "\r\nContent-Length: ")) { - $length = $head_len + (int)\substr($header, $pos + 18, 10); - } else if (\preg_match("/\r\ncontent-length: ?(\d+)/i", $header, $match)) { - $length = $head_len + $match[1]; - } - - if ($length !== false) { - if (!isset($recv_buffer[512])) { - $input[$recv_buffer] = $length; - if (\count($input) > 512) { - unset($input[key($input)]); - } - } - if ($length > $connection->maxPackageSize) { - $connection->close("HTTP/1.1 413 Request Entity Too Large\r\n\r\n"); - return 0; - } - return $length; - } - - $connection->close("HTTP/1.1 400 Bad Request\r\n\r\n", true); - return 0; - } - - /** - * Http decode. - * - * @param string $recv_buffer - * @param TcpConnection $connection - * @return \Workerman\Protocols\Http\Request - */ - public static function decode($recv_buffer, TcpConnection $connection) - { - static $requests = array(); - $cacheable = static::$_enableCache && !isset($recv_buffer[512]); - if (true === $cacheable && isset($requests[$recv_buffer])) { - $request = $requests[$recv_buffer]; - $request->connection = $connection; - $connection->__request = $request; - $request->properties = array(); - return $request; - } - $request = new static::$_requestClass($recv_buffer); - $request->connection = $connection; - $connection->__request = $request; - if (true === $cacheable) { - $requests[$recv_buffer] = $request; - if (\count($requests) > 512) { - unset($requests[key($requests)]); - } - } - return $request; - } - - /** - * Http encode. - * - * @param string|Response $response - * @param TcpConnection $connection - * @return string - */ - public static function encode($response, TcpConnection $connection) - { - if (isset($connection->__request)) { - $connection->__request->session = null; - $connection->__request->connection = null; - $connection->__request = null; - } - if (!\is_object($response)) { - $ext_header = ''; - if (isset($connection->__header)) { - foreach ($connection->__header as $name => $value) { - if (\is_array($value)) { - foreach ($value as $item) { - $ext_header = "$name: $item\r\n"; - } - } else { - $ext_header = "$name: $value\r\n"; - } - } - unset($connection->__header); - } - $body_len = \strlen($response); - return "HTTP/1.1 200 OK\r\nServer: workerman\r\n{$ext_header}Connection: keep-alive\r\nContent-Type: text/html;charset=utf-8\r\nContent-Length: $body_len\r\n\r\n$response"; - } - - if (isset($connection->__header)) { - $response->withHeaders($connection->__header); - unset($connection->__header); - } - - if (isset($response->file)) { - $file = $response->file['file']; - $offset = $response->file['offset']; - $length = $response->file['length']; - $file_size = (int)\filesize($file); - $body_len = $length > 0 ? $length : $file_size - $offset; - $response->withHeaders(array( - 'Content-Length' => $body_len, - 'Accept-Ranges' => 'bytes', - )); - if ($offset || $length) { - $offset_end = $offset + $body_len - 1; - $response->header('Content-Range', "bytes $offset-$offset_end/$file_size"); - } - if ($body_len < 2 * 1024 * 1024) { - $connection->send((string)$response . file_get_contents($file, false, null, $offset, $body_len), true); - return ''; - } - $handler = \fopen($file, 'r'); - if (false === $handler) { - $connection->close(new Response(403, null, '403 Forbidden')); - return ''; - } - $connection->send((string)$response, true); - static::sendStream($connection, $handler, $offset, $length); - return ''; - } - - return (string)$response; - } - - /** - * Send remainder of a stream to client. - * - * @param TcpConnection $connection - * @param resource $handler - * @param int $offset - * @param int $length - */ - protected static function sendStream(TcpConnection $connection, $handler, $offset = 0, $length = 0) - { - $connection->bufferFull = false; - if ($offset !== 0) { - \fseek($handler, $offset); - } - $offset_end = $offset + $length; - // Read file content from disk piece by piece and send to client. - $do_write = function () use ($connection, $handler, $length, $offset_end) { - // Send buffer not full. - while ($connection->bufferFull === false) { - // Read from disk. - $size = 1024 * 1024; - if ($length !== 0) { - $tell = \ftell($handler); - $remain_size = $offset_end - $tell; - if ($remain_size <= 0) { - fclose($handler); - $connection->onBufferDrain = null; - return; - } - $size = $remain_size > $size ? $size : $remain_size; - } - - $buffer = \fread($handler, $size); - // Read eof. - if ($buffer === '' || $buffer === false) { - fclose($handler); - $connection->onBufferDrain = null; - return; - } - $connection->send($buffer, true); - } - }; - // Send buffer full. - $connection->onBufferFull = function ($connection) { - $connection->bufferFull = true; - }; - // Send buffer drain. - $connection->onBufferDrain = function ($connection) use ($do_write) { - $connection->bufferFull = false; - $do_write(); - }; - $do_write(); - } - - /** - * Set or get uploadTmpDir. - * - * @return bool|string - */ - public static function uploadTmpDir($dir = null) - { - if (null !== $dir) { - static::$_uploadTmpDir = $dir; - } - if (static::$_uploadTmpDir === '') { - if ($upload_tmp_dir = \ini_get('upload_tmp_dir')) { - static::$_uploadTmpDir = $upload_tmp_dir; - } else if ($upload_tmp_dir = \sys_get_temp_dir()) { - static::$_uploadTmpDir = $upload_tmp_dir; - } - } - return static::$_uploadTmpDir; - } -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Chunk.php b/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Chunk.php deleted file mode 100644 index ab06a9c2..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Chunk.php +++ /dev/null @@ -1,48 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Protocols\Http; - - -/** - * Class Chunk - * @package Workerman\Protocols\Http - */ -class Chunk -{ - /** - * Chunk buffer. - * - * @var string - */ - protected $_buffer = null; - - /** - * Chunk constructor. - * @param string $buffer - */ - public function __construct($buffer) - { - $this->_buffer = $buffer; - } - - /** - * __toString - * - * @return string - */ - public function __toString() - { - return \dechex(\strlen($this->_buffer))."\r\n$this->_buffer\r\n"; - } -} \ No newline at end of file diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Request.php b/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Request.php deleted file mode 100644 index 148e9206..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Request.php +++ /dev/null @@ -1,665 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Protocols\Http; - -use Workerman\Connection\TcpConnection; -use Workerman\Protocols\Http\Session; -use Workerman\Protocols\Http; -use Workerman\Worker; - -/** - * Class Request - * @package Workerman\Protocols\Http - */ -class Request -{ - /** - * Connection. - * - * @var TcpConnection - */ - public $connection = null; - - /** - * Session instance. - * - * @var Session - */ - public $session = null; - - /** - * Properties. - * - * @var array - */ - public $properties = array(); - - /** - * Http buffer. - * - * @var string - */ - protected $_buffer = null; - - /** - * Request data. - * - * @var array - */ - protected $_data = null; - - /** - * Header cache. - * - * @var array - */ - protected static $_headerCache = array(); - - /** - * Get cache. - * - * @var array - */ - protected static $_getCache = array(); - - /** - * Post cache. - * - * @var array - */ - protected static $_postCache = array(); - - /** - * Enable cache. - * - * @var bool - */ - protected static $_enableCache = true; - - - /** - * Request constructor. - * - * @param string $buffer - */ - public function __construct($buffer) - { - $this->_buffer = $buffer; - } - - /** - * $_GET. - * - * @param string|null $name - * @param mixed|null $default - * @return mixed|null - */ - public function get($name = null, $default = null) - { - if (!isset($this->_data['get'])) { - $this->parseGet(); - } - if (null === $name) { - return $this->_data['get']; - } - return isset($this->_data['get'][$name]) ? $this->_data['get'][$name] : $default; - } - - /** - * $_POST. - * - * @param string|null $name - * @param mixed|null $default - * @return mixed|null - */ - public function post($name = null, $default = null) - { - if (!isset($this->_data['post'])) { - $this->parsePost(); - } - if (null === $name) { - return $this->_data['post']; - } - return isset($this->_data['post'][$name]) ? $this->_data['post'][$name] : $default; - } - - /** - * Get header item by name. - * - * @param string|null $name - * @param mixed|null $default - * @return array|string|null - */ - public function header($name = null, $default = null) - { - if (!isset($this->_data['headers'])) { - $this->parseHeaders(); - } - if (null === $name) { - return $this->_data['headers']; - } - $name = \strtolower($name); - return isset($this->_data['headers'][$name]) ? $this->_data['headers'][$name] : $default; - } - - /** - * Get cookie item by name. - * - * @param string|null $name - * @param mixed|null $default - * @return array|string|null - */ - public function cookie($name = null, $default = null) - { - if (!isset($this->_data['cookie'])) { - $this->_data['cookie'] = array(); - \parse_str(\str_replace('; ', '&', $this->header('cookie', '')), $this->_data['cookie']); - } - if ($name === null) { - return $this->_data['cookie']; - } - return isset($this->_data['cookie'][$name]) ? $this->_data['cookie'][$name] : $default; - } - - /** - * Get upload files. - * - * @param string|null $name - * @return array|null - */ - public function file($name = null) - { - if (!isset($this->_data['files'])) { - $this->parsePost(); - } - if (null === $name) { - return $this->_data['files']; - } - return isset($this->_data['files'][$name]) ? $this->_data['files'][$name] : null; - } - - /** - * Get method. - * - * @return string - */ - public function method() - { - if (!isset($this->_data['method'])) { - $this->parseHeadFirstLine(); - } - return $this->_data['method']; - } - - /** - * Get http protocol version. - * - * @return string - */ - public function protocolVersion() - { - if (!isset($this->_data['protocolVersion'])) { - $this->parseProtocolVersion(); - } - return $this->_data['protocolVersion']; - } - - /** - * Get host. - * - * @param bool $without_port - * @return string - */ - public function host($without_port = false) - { - $host = $this->header('host'); - if ($without_port && $pos = \strpos($host, ':')) { - return \substr($host, 0, $pos); - } - return $host; - } - - /** - * Get uri. - * - * @return mixed - */ - public function uri() - { - if (!isset($this->_data['uri'])) { - $this->parseHeadFirstLine(); - } - return $this->_data['uri']; - } - - /** - * Get path. - * - * @return mixed - */ - public function path() - { - if (!isset($this->_data['path'])) { - $this->_data['path'] = (string)\parse_url($this->uri(), PHP_URL_PATH); - } - return $this->_data['path']; - } - - /** - * Get query string. - * - * @return mixed - */ - public function queryString() - { - if (!isset($this->_data['query_string'])) { - $this->_data['query_string'] = (string)\parse_url($this->uri(), PHP_URL_QUERY); - } - return $this->_data['query_string']; - } - - /** - * Get session. - * - * @return bool|\Workerman\Protocols\Http\Session - */ - public function session() - { - if ($this->session === null) { - $session_id = $this->sessionId(); - if ($session_id === false) { - return false; - } - $this->session = new Session($session_id); - } - return $this->session; - } - - /** - * Get session id. - * - * @return bool|mixed - */ - public function sessionId() - { - if (!isset($this->sid)) { - $session_name = Http::sessionName(); - $sid = $this->cookie($session_name); - if ($sid === '' || $sid === null) { - if ($this->connection === null) { - Worker::safeEcho('Request->session() fail, header already send'); - return false; - } - $sid = static::createSessionId(); - $cookie_params = \session_get_cookie_params(); - $this->connection->__header['Set-Cookie'] = array($session_name . '=' . $sid - . (empty($cookie_params['domain']) ? '' : '; Domain=' . $cookie_params['domain']) - . (empty($cookie_params['lifetime']) ? '' : '; Max-Age=' . ($cookie_params['lifetime'] + \time())) - . (empty($cookie_params['path']) ? '' : '; Path=' . $cookie_params['path']) - . (empty($cookie_params['samesite']) ? '' : '; SameSite=' . $cookie_params['samesite']) - . (!$cookie_params['secure'] ? '' : '; Secure') - . (!$cookie_params['httponly'] ? '' : '; HttpOnly')); - } - $this->sid = $sid; - } - return $this->sid; - } - - /** - * Get http raw head. - * - * @return string - */ - public function rawHead() - { - if (!isset($this->_data['head'])) { - $this->_data['head'] = \strstr($this->_buffer, "\r\n\r\n", true); - } - return $this->_data['head']; - } - - /** - * Get http raw body. - * - * @return string - */ - public function rawBody() - { - return \substr($this->_buffer, \strpos($this->_buffer, "\r\n\r\n") + 4); - } - - /** - * Get raw buffer. - * - * @return string - */ - public function rawBuffer() - { - return $this->_buffer; - } - - /** - * Enable or disable cache. - * - * @param mixed $value - */ - public static function enableCache($value) - { - static::$_enableCache = (bool)$value; - } - - /** - * Parse first line of http header buffer. - * - * @return void - */ - protected function parseHeadFirstLine() - { - $first_line = \strstr($this->_buffer, "\r\n", true); - $tmp = \explode(' ', $first_line, 3); - $this->_data['method'] = $tmp[0]; - $this->_data['uri'] = isset($tmp[1]) ? $tmp[1] : '/'; - } - - /** - * Parse protocol version. - * - * @return void - */ - protected function parseProtocolVersion() - { - $first_line = \strstr($this->_buffer, "\r\n", true); - $protoco_version = substr(\strstr($first_line, 'HTTP/'), 5); - $this->_data['protocolVersion'] = $protoco_version ? $protoco_version : '1.0'; - } - - /** - * Parse headers. - * - * @return void - */ - protected function parseHeaders() - { - $this->_data['headers'] = array(); - $raw_head = $this->rawHead(); - $end_line_position = \strpos($raw_head, "\r\n"); - if ($end_line_position === false) { - return; - } - $head_buffer = \substr($raw_head, $end_line_position + 2); - $cacheable = static::$_enableCache && !isset($head_buffer[2048]); - if ($cacheable && isset(static::$_headerCache[$head_buffer])) { - $this->_data['headers'] = static::$_headerCache[$head_buffer]; - return; - } - $head_data = \explode("\r\n", $head_buffer); - foreach ($head_data as $content) { - if (false !== \strpos($content, ':')) { - list($key, $value) = \explode(':', $content, 2); - $key = \strtolower($key); - $value = \ltrim($value); - } else { - $key = \strtolower($content); - $value = ''; - } - if (isset($this->_data['headers'][$key])) { - $this->_data['headers'][$key] = "{$this->_data['headers'][$key]},$value"; - } else { - $this->_data['headers'][$key] = $value; - } - } - if ($cacheable) { - static::$_headerCache[$head_buffer] = $this->_data['headers']; - if (\count(static::$_headerCache) > 128) { - unset(static::$_headerCache[key(static::$_headerCache)]); - } - } - } - - /** - * Parse head. - * - * @return void - */ - protected function parseGet() - { - $query_string = $this->queryString(); - $this->_data['get'] = array(); - if ($query_string === '') { - return; - } - $cacheable = static::$_enableCache && !isset($query_string[1024]); - if ($cacheable && isset(static::$_getCache[$query_string])) { - $this->_data['get'] = static::$_getCache[$query_string]; - return; - } - \parse_str($query_string, $this->_data['get']); - if ($cacheable) { - static::$_getCache[$query_string] = $this->_data['get']; - if (\count(static::$_getCache) > 256) { - unset(static::$_getCache[key(static::$_getCache)]); - } - } - } - - /** - * Parse post. - * - * @return void - */ - protected function parsePost() - { - $body_buffer = $this->rawBody(); - $this->_data['post'] = $this->_data['files'] = array(); - if ($body_buffer === '') { - return; - } - $cacheable = static::$_enableCache && !isset($body_buffer[1024]); - if ($cacheable && isset(static::$_postCache[$body_buffer])) { - $this->_data['post'] = static::$_postCache[$body_buffer]; - return; - } - $content_type = $this->header('content-type', ''); - if (\preg_match('/boundary="?(\S+)"?/', $content_type, $match)) { - $http_post_boundary = '--' . $match[1]; - $this->parseUploadFiles($http_post_boundary); - return; - } - if (\preg_match('/\bjson\b/i', $content_type)) { - $this->_data['post'] = (array) json_decode($body_buffer, true); - } else { - \parse_str($body_buffer, $this->_data['post']); - } - if ($cacheable) { - static::$_postCache[$body_buffer] = $this->_data['post']; - if (\count(static::$_postCache) > 256) { - unset(static::$_postCache[key(static::$_postCache)]); - } - } - } - - /** - * Parse upload files. - * - * @param string $http_post_boundary - * @return void - */ - protected function parseUploadFiles($http_post_boundary) - { - $http_post_boundary = \trim($http_post_boundary, '"'); - $http_body = $this->rawBody(); - $http_body = \substr($http_body, 0, \strlen($http_body) - (\strlen($http_post_boundary) + 4)); - $boundary_data_array = \explode($http_post_boundary . "\r\n", $http_body); - if ($boundary_data_array[0] === '' || $boundary_data_array[0] === "\r\n") { - unset($boundary_data_array[0]); - } - $key = -1; - $files = array(); - $post_str = ''; - foreach ($boundary_data_array as $boundary_data_buffer) { - list($boundary_header_buffer, $boundary_value) = \explode("\r\n\r\n", $boundary_data_buffer, 2); - // Remove \r\n from the end of buffer. - $boundary_value = \substr($boundary_value, 0, -2); - $key++; - foreach (\explode("\r\n", $boundary_header_buffer) as $item) { - list($header_key, $header_value) = \explode(": ", $item); - $header_key = \strtolower($header_key); - switch ($header_key) { - case "content-disposition": - // Is file data. - if (\preg_match('/name="(.*?)"; filename="(.*?)"/i', $header_value, $match)) { - $error = 0; - $tmp_file = ''; - $size = \strlen($boundary_value); - $tmp_upload_dir = HTTP::uploadTmpDir(); - if (!$tmp_upload_dir) { - $error = UPLOAD_ERR_NO_TMP_DIR; - } else if ($boundary_value === '') { - $error = UPLOAD_ERR_NO_FILE; - } else { - $tmp_file = \tempnam($tmp_upload_dir, 'workerman.upload.'); - if ($tmp_file === false || false == \file_put_contents($tmp_file, $boundary_value)) { - $error = UPLOAD_ERR_CANT_WRITE; - } - } - if (!isset($files[$key])) { - $files[$key] = array(); - } - // Parse upload files. - $files[$key] += array( - 'key' => $match[1], - 'name' => $match[2], - 'tmp_name' => $tmp_file, - 'size' => $size, - 'error' => $error, - 'type' => null, - ); - break; - } // Is post field. - else { - // Parse $_POST. - if (\preg_match('/name="(.*?)"$/', $header_value, $match)) { - $key = $match[1]; - $post_str .= \urlencode($key)."=".\urlencode($boundary_value).'&'; - } - } - break; - case "content-type": - // add file_type - if (!isset($files[$key])) { - $files[$key] = array(); - } - $files[$key]['type'] = \trim($header_value); - break; - } - } - } - foreach ($files as $file) { - $key = $file['key']; - unset($file['key']); - $str = \urlencode($key)."=1"; - $result = []; - \parse_str($str, $result); - \array_walk_recursive($result, function(&$value) use ($file) { - $value = $file; - }); - $this->_data['files'] = \array_merge($this->_data['files'], $result); - } - if ($post_str) { - parse_str($post_str, $this->_data['post']); - } - } - - /** - * Create session id. - * - * @return string - */ - protected static function createSessionId() - { - return \bin2hex(\pack('d', \microtime(true)) . \pack('N', \mt_rand())); - } - - /** - * Setter. - * - * @param string $name - * @param mixed $value - * @return void - */ - public function __set($name, $value) - { - $this->properties[$name] = $value; - } - - /** - * Getter. - * - * @param string $name - * @return mixed|null - */ - public function __get($name) - { - return isset($this->properties[$name]) ? $this->properties[$name] : null; - } - - /** - * Isset. - * - * @param string $name - * @return bool - */ - public function __isset($name) - { - return isset($this->properties[$name]); - } - - /** - * Unset. - * - * @param string $name - * @return void - */ - public function __unset($name) - { - unset($this->properties[$name]); - } - - /** - * __toString. - */ - public function __toString() - { - return $this->_buffer; - } - - /** - * __destruct. - * - * @return void - */ - public function __destruct() - { - if (isset($this->_data['files'])) { - \clearstatcache(); - \array_walk_recursive($this->_data['files'], function($value, $key){ - if ($key === 'tmp_name') { - if (\is_file($value)) { - \unlink($value); - } - } - }); - } - } -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Response.php b/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Response.php deleted file mode 100644 index 06b013ac..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Response.php +++ /dev/null @@ -1,458 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Protocols\Http; - -/** - * Class Response - * @package Workerman\Protocols\Http - */ -class Response -{ - /** - * Header data. - * - * @var array - */ - protected $_header = null; - - /** - * Http status. - * - * @var int - */ - protected $_status = null; - - /** - * Http reason. - * - * @var string - */ - protected $_reason = null; - - /** - * Http version. - * - * @var string - */ - protected $_version = '1.1'; - - /** - * Http body. - * - * @var string - */ - protected $_body = null; - - /** - * Send file info - * - * @var array - */ - public $file = null; - - /** - * Mine type map. - * @var array - */ - protected static $_mimeTypeMap = null; - - /** - * Phrases. - * - * @var array - */ - protected static $_phrases = array( - 100 => 'Continue', - 101 => 'Switching Protocols', - 102 => 'Processing', - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authoritative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - 207 => 'Multi-status', - 208 => 'Already Reported', - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', - 303 => 'See Other', - 304 => 'Not Modified', - 305 => 'Use Proxy', - 306 => 'Switch Proxy', - 307 => 'Temporary Redirect', - 400 => 'Bad Request', - 401 => 'Unauthorized', - 402 => 'Payment Required', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', - 408 => 'Request Time-out', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition Failed', - 413 => 'Request Entity Too Large', - 414 => 'Request-URI Too Large', - 415 => 'Unsupported Media Type', - 416 => 'Requested range not satisfiable', - 417 => 'Expectation Failed', - 418 => 'I\'m a teapot', - 422 => 'Unprocessable Entity', - 423 => 'Locked', - 424 => 'Failed Dependency', - 425 => 'Unordered Collection', - 426 => 'Upgrade Required', - 428 => 'Precondition Required', - 429 => 'Too Many Requests', - 431 => 'Request Header Fields Too Large', - 451 => 'Unavailable For Legal Reasons', - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Time-out', - 505 => 'HTTP Version not supported', - 506 => 'Variant Also Negotiates', - 507 => 'Insufficient Storage', - 508 => 'Loop Detected', - 511 => 'Network Authentication Required', - ); - - /** - * Init. - * - * @return void - */ - public static function init() { - static::initMimeTypeMap(); - } - - /** - * Response constructor. - * - * @param int $status - * @param array $headers - * @param string $body - */ - public function __construct( - $status = 200, - $headers = array(), - $body = '' - ) { - $this->_status = $status; - $this->_header = $headers; - $this->_body = (string)$body; - } - - /** - * Set header. - * - * @param string $name - * @param string $value - * @return $this - */ - public function header($name, $value) { - $this->_header[$name] = $value; - return $this; - } - - /** - * Set header. - * - * @param string $name - * @param string $value - * @return Response - */ - public function withHeader($name, $value) { - return $this->header($name, $value); - } - - /** - * Set headers. - * - * @param array $headers - * @return $this - */ - public function withHeaders($headers) { - $this->_header = \array_merge_recursive($this->_header, $headers); - return $this; - } - - /** - * Remove header. - * - * @param string $name - * @return $this - */ - public function withoutHeader($name) { - unset($this->_header[$name]); - return $this; - } - - /** - * Get header. - * - * @param string $name - * @return null|array|string - */ - public function getHeader($name) { - if (!isset($this->_header[$name])) { - return null; - } - return $this->_header[$name]; - } - - /** - * Get headers. - * - * @return array - */ - public function getHeaders() { - return $this->_header; - } - - /** - * Set status. - * - * @param int $code - * @param string|null $reason_phrase - * @return $this - */ - public function withStatus($code, $reason_phrase = null) { - $this->_status = $code; - $this->_reason = $reason_phrase; - return $this; - } - - /** - * Get status code. - * - * @return int - */ - public function getStatusCode() { - return $this->_status; - } - - /** - * Get reason phrase. - * - * @return string - */ - public function getReasonPhrase() { - return $this->_reason; - } - - /** - * Set protocol version. - * - * @param int $version - * @return $this - */ - public function withProtocolVersion($version) { - $this->_version = $version; - return $this; - } - - /** - * Set http body. - * - * @param string $body - * @return $this - */ - public function withBody($body) { - $this->_body = $body; - return $this; - } - - /** - * Get http raw body. - * - * @return string - */ - public function rawBody() { - return $this->_body; - } - - /** - * Send file. - * - * @param string $file - * @param int $offset - * @param int $length - * @return $this - */ - public function withFile($file, $offset = 0, $length = 0) { - if (!\is_file($file)) { - return $this->withStatus(404)->withBody('

404 Not Found

'); - } - $this->file = array('file' => $file, 'offset' => $offset, 'length' => $length); - return $this; - } - - /** - * Set cookie. - * - * @param $name - * @param string $value - * @param int $max_age - * @param string $path - * @param string $domain - * @param bool $secure - * @param bool $http_only - * @param bool $same_site - * @return $this - */ - public function cookie($name, $value = '', $max_age = 0, $path = '', $domain = '', $secure = false, $http_only = false, $same_site = false) - { - $this->_header['Set-Cookie'][] = $name . '=' . \rawurlencode($value) - . (empty($domain) ? '' : '; Domain=' . $domain) - . (empty($max_age) ? '' : '; Max-Age=' . $max_age) - . (empty($path) ? '' : '; Path=' . $path) - . (!$secure ? '' : '; Secure') - . (!$http_only ? '' : '; HttpOnly') - . (empty($same_site ) ? '' : '; SameSite=' . $same_site); - return $this; - } - - /** - * Create header for file. - * - * @param array $file_info - * @return string - */ - protected function createHeadForFile($file_info) - { - $file = $file_info['file']; - $reason = $this->_reason ? $this->_reason : static::$_phrases[$this->_status]; - $head = "HTTP/{$this->_version} {$this->_status} $reason\r\n"; - $headers = $this->_header; - if (!isset($headers['Server'])) { - $head .= "Server: workerman\r\n"; - } - foreach ($headers as $name => $value) { - if (\is_array($value)) { - foreach ($value as $item) { - $head .= "$name: $item\r\n"; - } - continue; - } - $head .= "$name: $value\r\n"; - } - - if (!isset($headers['Connection'])) { - $head .= "Connection: keep-alive\r\n"; - } - - $file_info = \pathinfo($file); - $extension = isset($file_info['extension']) ? $file_info['extension'] : ''; - $base_name = isset($file_info['basename']) ? $file_info['basename'] : 'unknown'; - if (!isset($headers['Content-Type'])) { - if (isset(self::$_mimeTypeMap[$extension])) { - $head .= "Content-Type: " . self::$_mimeTypeMap[$extension] . "\r\n"; - } else { - $head .= "Content-Type: application/octet-stream\r\n"; - } - } - - if (!isset($headers['Content-Disposition']) && !isset(self::$_mimeTypeMap[$extension])) { - $head .= "Content-Disposition: attachment; filename=\"$base_name\"\r\n"; - } - - if (!isset($headers['Last-Modified'])) { - if ($mtime = \filemtime($file)) { - $head .= 'Last-Modified: '. \gmdate('D, d M Y H:i:s', $mtime) . ' GMT' . "\r\n"; - } - } - - return "{$head}\r\n"; - } - - /** - * __toString. - * - * @return string - */ - public function __toString() - { - if (isset($this->file)) { - return $this->createHeadForFile($this->file); - } - - $reason = $this->_reason ? $this->_reason : static::$_phrases[$this->_status]; - $body_len = \strlen($this->_body); - if (empty($this->_header)) { - return "HTTP/{$this->_version} {$this->_status} $reason\r\nServer: workerman\r\nContent-Type: text/html;charset=utf-8\r\nContent-Length: $body_len\r\nConnection: keep-alive\r\n\r\n{$this->_body}"; - } - - $head = "HTTP/{$this->_version} {$this->_status} $reason\r\n"; - $headers = $this->_header; - if (!isset($headers['Server'])) { - $head .= "Server: workerman\r\n"; - } - foreach ($headers as $name => $value) { - if (\is_array($value)) { - foreach ($value as $item) { - $head .= "$name: $item\r\n"; - } - continue; - } - $head .= "$name: $value\r\n"; - } - - if (!isset($headers['Connection'])) { - $head .= "Connection: keep-alive\r\n"; - } - - if (!isset($headers['Content-Type'])) { - $head .= "Content-Type: text/html;charset=utf-8\r\n"; - } else if ($headers['Content-Type'] === 'text/event-stream') { - return $head . $this->_body; - } - - if (!isset($headers['Transfer-Encoding'])) { - $head .= "Content-Length: $body_len\r\n\r\n"; - } else { - return "$head\r\n".dechex($body_len)."\r\n{$this->_body}\r\n"; - } - - // The whole http package - return $head . $this->_body; - } - - /** - * Init mime map. - * - * @return void - */ - public static function initMimeTypeMap() - { - $mime_file = __DIR__ . '/mime.types'; - $items = \file($mime_file, \FILE_IGNORE_NEW_LINES | \FILE_SKIP_EMPTY_LINES); - foreach ($items as $content) { - if (\preg_match("/\s*(\S+)\s+(\S.+)/", $content, $match)) { - $mime_type = $match[1]; - $extension_var = $match[2]; - $extension_array = \explode(' ', \substr($extension_var, 0, -1)); - foreach ($extension_array as $file_extension) { - static::$_mimeTypeMap[$file_extension] = $mime_type; - } - } - } - } -} -Response::init(); diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/ServerSentEvents.php b/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/ServerSentEvents.php deleted file mode 100644 index 7aeafc70..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/ServerSentEvents.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Protocols\Http; - -/** - * Class ServerSentEvents - * @package Workerman\Protocols\Http - */ -class ServerSentEvents -{ - /** - * Data. - * @var array - */ - protected $_data = null; - - /** - * ServerSentEvents constructor. - * $data for example ['event'=>'ping', 'data' => 'some thing', 'id' => 1000, 'retry' => 5000] - * @param array $data - */ - public function __construct(array $data) - { - $this->_data = $data; - } - - /** - * __toString. - * - * @return string - */ - public function __toString() - { - $buffer = ''; - $data = $this->_data; - if (isset($data[''])) { - $buffer = ": {$data['']}\n"; - } - if (isset($data['event'])) { - $buffer .= "event: {$data['event']}\n"; - } - if (isset($data['data'])) { - $buffer .= 'data: ' . \str_replace("\n", "\ndata: ", $data['data']) . "\n\n"; - } - if (isset($data['id'])) { - $buffer .= "id: {$data['id']}\n"; - } - if (isset($data['retry'])) { - $buffer .= "retry: {$data['retry']}\n"; - } - return $buffer; - } -} \ No newline at end of file diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Session.php b/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Session.php deleted file mode 100644 index e1782e19..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Session.php +++ /dev/null @@ -1,370 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Protocols\Http; - -use Workerman\Protocols\Http\Session\SessionHandlerInterface; - -/** - * Class Session - * @package Workerman\Protocols\Http - */ -class Session -{ - /** - * Session andler class which implements SessionHandlerInterface. - * - * @var string - */ - protected static $_handlerClass = 'Workerman\Protocols\Http\Session\FileSessionHandler'; - - /** - * Parameters of __constructor for session handler class. - * - * @var null - */ - protected static $_handlerConfig = null; - - /** - * Session.gc_probability - * - * @var int - */ - protected static $_sessionGcProbability = 1; - - /** - * Session.gc_divisor - * - * @var int - */ - protected static $_sessionGcDivisor = 1000; - - /** - * Session.gc_maxlifetime - * - * @var int - */ - protected static $_sessionGcMaxLifeTime = 1440; - - /** - * Session handler instance. - * - * @var SessionHandlerInterface - */ - protected static $_handler = null; - - /** - * Session data. - * - * @var array - */ - protected $_data = array(); - - /** - * Session changed and need to save. - * - * @var bool - */ - protected $_needSave = false; - - /** - * Session id. - * - * @var null - */ - protected $_sessionId = null; - - /** - * Session constructor. - * - * @param string $session_id - */ - public function __construct($session_id) - { - static::checkSessionId($session_id); - if (static::$_handler === null) { - static::initHandler(); - } - $this->_sessionId = $session_id; - if ($data = static::$_handler->read($session_id)) { - $this->_data = \unserialize($data); - } - } - - /** - * Get session id. - * - * @return string - */ - public function getId() - { - return $this->_sessionId; - } - - /** - * Get session. - * - * @param string $name - * @param mixed|null $default - * @return mixed|null - */ - public function get($name, $default = null) - { - return isset($this->_data[$name]) ? $this->_data[$name] : $default; - } - - /** - * Store data in the session. - * - * @param string $name - * @param mixed $value - */ - public function set($name, $value) - { - $this->_data[$name] = $value; - $this->_needSave = true; - } - - /** - * Delete an item from the session. - * - * @param string $name - */ - public function delete($name) - { - unset($this->_data[$name]); - $this->_needSave = true; - } - - /** - * Retrieve and delete an item from the session. - * - * @param string $name - * @param mixed|null $default - * @return mixed|null - */ - public function pull($name, $default = null) - { - $value = $this->get($name, $default); - $this->delete($name); - return $value; - } - - /** - * Store data in the session. - * - * @param string $key - * @param mixed|null $value - */ - public function put($key, $value = null) - { - if (!\is_array($key)) { - $this->set($key, $value); - return; - } - - foreach ($key as $k => $v) { - $this->_data[$k] = $v; - } - $this->_needSave = true; - } - - /** - * Remove a piece of data from the session. - * - * @param string $name - */ - public function forget($name) - { - if (\is_scalar($name)) { - $this->delete($name); - return; - } - if (\is_array($name)) { - foreach ($name as $key) { - unset($this->_data[$key]); - } - } - $this->_needSave = true; - } - - /** - * Retrieve all the data in the session. - * - * @return array - */ - public function all() - { - return $this->_data; - } - - /** - * Remove all data from the session. - * - * @return void - */ - public function flush() - { - $this->_needSave = true; - $this->_data = array(); - } - - /** - * Determining If An Item Exists In The Session. - * - * @param string $name - * @return bool - */ - public function has($name) - { - return isset($this->_data[$name]); - } - - /** - * To determine if an item is present in the session, even if its value is null. - * - * @param string $name - * @return bool - */ - public function exists($name) - { - return \array_key_exists($name, $this->_data); - } - - /** - * Save session to store. - * - * @return void - */ - public function save() - { - if ($this->_needSave) { - if (empty($this->_data)) { - static::$_handler->destroy($this->_sessionId); - } else { - static::$_handler->write($this->_sessionId, \serialize($this->_data)); - } - } - $this->_needSave = false; - } - - /** - * Refresh session expire time. - * - * @return bool - */ - public function refresh() - { - static::$_handler->updateTimestamp($this->getId()); - } - - /** - * Init. - * - * @return void - */ - public static function init() - { - if ($gc_probability = \ini_get('session.gc_probability')) { - self::$_sessionGcProbability = (int)$gc_probability; - } - - if ($gc_divisor = \ini_get('session.gc_divisor')) { - self::$_sessionGcDivisor = (int)$gc_divisor; - } - - if ($gc_max_life_time = \ini_get('session.gc_maxlifetime')) { - self::$_sessionGcMaxLifeTime = (int)$gc_max_life_time; - } - } - - /** - * Set session handler class. - * - * @param mixed|null $class_name - * @param mixed|null $config - * @return string - */ - public static function handlerClass($class_name = null, $config = null) - { - if ($class_name) { - static::$_handlerClass = $class_name; - } - if ($config) { - static::$_handlerConfig = $config; - } - return static::$_handlerClass; - } - - /** - * Init handler. - * - * @return void - */ - protected static function initHandler() - { - if (static::$_handlerConfig === null) { - static::$_handler = new static::$_handlerClass(); - } else { - static::$_handler = new static::$_handlerClass(static::$_handlerConfig); - } - } - - /** - * Try GC sessions. - * - * @return void - */ - public function tryGcSessions() - { - if (\rand(1, static::$_sessionGcDivisor) > static::$_sessionGcProbability) { - return; - } - static::$_handler->gc(static::$_sessionGcMaxLifeTime); - } - - /** - * __destruct. - * - * @return void - */ - public function __destruct() - { - $this->save(); - $this->tryGcSessions(); - } - - /** - * Check session id. - * - * @param string $session_id - */ - protected static function checkSessionId($session_id) - { - if (!\preg_match('/^[a-zA-Z0-9]+$/', $session_id)) { - throw new SessionException("session_id $session_id is invalid"); - } - } -} - -/** - * Class SessionException - * @package Workerman\Protocols\Http - */ -class SessionException extends \RuntimeException -{ - -} - -// Init session. -Session::init(); \ No newline at end of file diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Session/FileSessionHandler.php b/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Session/FileSessionHandler.php deleted file mode 100644 index 5c862a5e..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Session/FileSessionHandler.php +++ /dev/null @@ -1,177 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Protocols\Http\Session; - -/** - * Class FileSessionHandler - * @package Workerman\Protocols\Http\Session - */ -class FileSessionHandler implements SessionHandlerInterface -{ - /** - * Session save path. - * - * @var string - */ - protected static $_sessionSavePath = null; - - /** - * Session file prefix. - * - * @var string - */ - protected static $_sessionFilePrefix = 'session_'; - - /** - * Init. - */ - public static function init() { - $save_path = @\session_save_path(); - if (!$save_path || \strpos($save_path, 'tcp://') === 0) { - $save_path = \sys_get_temp_dir(); - } - static::sessionSavePath($save_path); - } - - /** - * FileSessionHandler constructor. - * @param array $config - */ - public function __construct($config = array()) { - if (isset($config['save_path'])) { - static::sessionSavePath($config['save_path']); - } - } - - /** - * {@inheritdoc} - */ - public function open($save_path, $name) - { - return true; - } - - /** - * {@inheritdoc} - */ - public function read($session_id) - { - $session_file = static::sessionFile($session_id); - \clearstatcache(); - if (\is_file($session_file)) { - $data = \file_get_contents($session_file); - return $data ? $data : ''; - } - return ''; - } - - /** - * {@inheritdoc} - */ - public function write($session_id, $session_data) - { - $temp_file = static::$_sessionSavePath.uniqid(mt_rand(), true); - if (!\file_put_contents($temp_file, $session_data)) { - return false; - } - return \rename($temp_file, static::sessionFile($session_id)); - } - - /** - * Update sesstion modify time. - * - * @see https://www.php.net/manual/en/class.sessionupdatetimestamphandlerinterface.php - * @see https://www.php.net/manual/zh/function.touch.php - * - * @param string $id Session id. - * @param string $data Session Data. - * - * @return bool - */ - public function updateTimestamp($id, $data = "") - { - $session_file = static::sessionFile($id); - if (!file_exists($session_file)) { - return false; - } - // set file modify time to current time - $set_modify_time = \touch($session_file); - // clear file stat cache - \clearstatcache(); - return $set_modify_time; - } - - /** - * {@inheritdoc} - */ - public function close() - { - return true; - } - - /** - * {@inheritdoc} - */ - public function destroy($session_id) - { - $session_file = static::sessionFile($session_id); - if (\is_file($session_file)) { - \unlink($session_file); - } - return true; - } - - /** - * {@inheritdoc} - */ - public function gc($maxlifetime) { - $time_now = \time(); - foreach (\glob(static::$_sessionSavePath . static::$_sessionFilePrefix . '*') as $file) { - if(\is_file($file) && $time_now - \filemtime($file) > $maxlifetime) { - \unlink($file); - } - } - } - - /** - * Get session file path. - * - * @param string $session_id - * @return string - */ - protected static function sessionFile($session_id) { - return static::$_sessionSavePath.static::$_sessionFilePrefix.$session_id; - } - - /** - * Get or set session file path. - * - * @param string $path - * @return string - */ - public static function sessionSavePath($path) { - if ($path) { - if ($path[\strlen($path)-1] !== DIRECTORY_SEPARATOR) { - $path .= DIRECTORY_SEPARATOR; - } - static::$_sessionSavePath = $path; - if (!\is_dir($path)) { - \mkdir($path, 0777, true); - } - } - return $path; - } -} - -FileSessionHandler::init(); \ No newline at end of file diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Session/RedisSessionHandler.php b/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Session/RedisSessionHandler.php deleted file mode 100644 index 8cfe2cbb..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Session/RedisSessionHandler.php +++ /dev/null @@ -1,127 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Protocols\Http\Session; - -/** - * Class RedisSessionHandler - * @package Workerman\Protocols\Http\Session - */ -class RedisSessionHandler implements SessionHandlerInterface -{ - - /** - * @var \Redis - */ - protected $_redis; - - /** - * @var int - */ - protected $_maxLifeTime; - - /** - * RedisSessionHandler constructor. - * @param array $config = [ - * 'host' => '127.0.0.1', - * 'port' => 6379, - * 'timeout' => 2, - * 'auth' => '******', - * 'database' => 2, - * 'prefix' => 'redis_session_', - * ] - */ - public function __construct($config) - { - if (false === extension_loaded('redis')) { - throw new \RuntimeException('Please install redis extension.'); - } - $this->_maxLifeTime = (int)ini_get('session.gc_maxlifetime'); - - if (!isset($config['timeout'])) { - $config['timeout'] = 2; - } - - $this->_redis = new \Redis(); - if (false === $this->_redis->connect($config['host'], $config['port'], $config['timeout'])) { - throw new \RuntimeException("Redis connect {$config['host']}:{$config['port']} fail."); - } - if (!empty($config['auth'])) { - $this->_redis->auth($config['auth']); - } - if (!empty($config['database'])) { - $this->_redis->select($config['database']); - } - if (empty($config['prefix'])) { - $config['prefix'] = 'redis_session_'; - } - $this->_redis->setOption(\Redis::OPT_PREFIX, $config['prefix']); - } - - /** - * {@inheritdoc} - */ - public function open($save_path, $name) - { - return true; - } - - /** - * {@inheritdoc} - */ - public function read($session_id) - { - return $this->_redis->get($session_id); - } - - /** - * {@inheritdoc} - */ - public function write($session_id, $session_data) - { - return true === $this->_redis->setex($session_id, $this->_maxLifeTime, $session_data); - } - - /** - * {@inheritdoc} - */ - public function updateTimestamp($id, $data = "") - { - return true === $this->_redis->expire($id, $this->_maxLifeTime); - } - - /** - * {@inheritdoc} - */ - public function destroy($session_id) - { - $this->_redis->del($session_id); - return true; - } - - /** - * {@inheritdoc} - */ - public function close() - { - return true; - } - - /** - * {@inheritdoc} - */ - public function gc($maxlifetime) - { - return true; - } -} \ No newline at end of file diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Session/SessionHandlerInterface.php b/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Session/SessionHandlerInterface.php deleted file mode 100644 index 23a47f2b..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/Session/SessionHandlerInterface.php +++ /dev/null @@ -1,114 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Protocols\Http\Session; - -interface SessionHandlerInterface -{ - /** - * Close the session - * @link http://php.net/manual/en/sessionhandlerinterface.close.php - * @return bool

- * The return value (usually TRUE on success, FALSE on failure). - * Note this value is returned internally to PHP for processing. - *

- * @since 5.4.0 - */ - public function close(); - - /** - * Destroy a session - * @link http://php.net/manual/en/sessionhandlerinterface.destroy.php - * @param string $session_id The session ID being destroyed. - * @return bool

- * The return value (usually TRUE on success, FALSE on failure). - * Note this value is returned internally to PHP for processing. - *

- * @since 5.4.0 - */ - public function destroy($session_id); - - /** - * Cleanup old sessions - * @link http://php.net/manual/en/sessionhandlerinterface.gc.php - * @param int $maxlifetime

- * Sessions that have not updated for - * the last maxlifetime seconds will be removed. - *

- * @return bool

- * The return value (usually TRUE on success, FALSE on failure). - * Note this value is returned internally to PHP for processing. - *

- * @since 5.4.0 - */ - public function gc($maxlifetime); - - /** - * Initialize session - * @link http://php.net/manual/en/sessionhandlerinterface.open.php - * @param string $save_path The path where to store/retrieve the session. - * @param string $name The session name. - * @return bool

- * The return value (usually TRUE on success, FALSE on failure). - * Note this value is returned internally to PHP for processing. - *

- * @since 5.4.0 - */ - public function open($save_path, $name); - - - /** - * Read session data - * @link http://php.net/manual/en/sessionhandlerinterface.read.php - * @param string $session_id The session id to read data for. - * @return string

- * Returns an encoded string of the read data. - * If nothing was read, it must return an empty string. - * Note this value is returned internally to PHP for processing. - *

- * @since 5.4.0 - */ - public function read($session_id); - - /** - * Write session data - * @link http://php.net/manual/en/sessionhandlerinterface.write.php - * @param string $session_id The session id. - * @param string $session_data

- * The encoded session data. This data is the - * result of the PHP internally encoding - * the $_SESSION superglobal to a serialized - * string and passing it as this parameter. - * Please note sessions use an alternative serialization method. - *

- * @return bool

- * The return value (usually TRUE on success, FALSE on failure). - * Note this value is returned internally to PHP for processing. - *

- * @since 5.4.0 - */ - public function write($session_id, $session_data); - - /** - * Update sesstion modify time. - * - * @see https://www.php.net/manual/en/class.sessionupdatetimestamphandlerinterface.php - * - * @param string $id Session id. - * @param string $data Session Data. - * - * @return bool - */ - public function updateTimestamp($id, $data = ""); - -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/mime.types b/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/mime.types deleted file mode 100644 index e6ccf0ab..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Http/mime.types +++ /dev/null @@ -1,90 +0,0 @@ - -types { - text/html html htm shtml; - text/css css; - text/xml xml; - image/gif gif; - image/jpeg jpeg jpg; - application/javascript js; - application/atom+xml atom; - application/rss+xml rss; - - text/mathml mml; - text/plain txt; - text/vnd.sun.j2me.app-descriptor jad; - text/vnd.wap.wml wml; - text/x-component htc; - - image/png png; - image/tiff tif tiff; - image/vnd.wap.wbmp wbmp; - image/x-icon ico; - image/x-jng jng; - image/x-ms-bmp bmp; - image/svg+xml svg svgz; - image/webp webp; - - application/font-woff woff; - application/java-archive jar war ear; - application/json json; - application/mac-binhex40 hqx; - application/msword doc; - application/pdf pdf; - application/postscript ps eps ai; - application/rtf rtf; - application/vnd.apple.mpegurl m3u8; - application/vnd.ms-excel xls; - application/vnd.ms-fontobject eot; - application/vnd.ms-powerpoint ppt; - application/vnd.wap.wmlc wmlc; - application/vnd.google-earth.kml+xml kml; - application/vnd.google-earth.kmz kmz; - application/x-7z-compressed 7z; - application/x-cocoa cco; - application/x-java-archive-diff jardiff; - application/x-java-jnlp-file jnlp; - application/x-makeself run; - application/x-perl pl pm; - application/x-pilot prc pdb; - application/x-rar-compressed rar; - application/x-redhat-package-manager rpm; - application/x-sea sea; - application/x-shockwave-flash swf; - application/x-stuffit sit; - application/x-tcl tcl tk; - application/x-x509-ca-cert der pem crt; - application/x-xpinstall xpi; - application/xhtml+xml xhtml; - application/xspf+xml xspf; - application/zip zip; - - application/octet-stream bin exe dll; - application/octet-stream deb; - application/octet-stream dmg; - application/octet-stream iso img; - application/octet-stream msi msp msm; - - application/vnd.openxmlformats-officedocument.wordprocessingml.document docx; - application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx; - application/vnd.openxmlformats-officedocument.presentationml.presentation pptx; - - audio/midi mid midi kar; - audio/mpeg mp3; - audio/ogg ogg; - audio/x-m4a m4a; - audio/x-realaudio ra; - - video/3gpp 3gpp 3gp; - video/mp2t ts; - video/mp4 mp4; - video/mpeg mpeg mpg; - video/quicktime mov; - video/webm webm; - video/x-flv flv; - video/x-m4v m4v; - video/x-mng mng; - video/x-ms-asf asx asf; - video/x-ms-wmv wmv; - video/x-msvideo avi; - font/ttf ttf; -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/ProtocolInterface.php b/GatewayWorker_linux/vendor/workerman/workerman/Protocols/ProtocolInterface.php deleted file mode 100644 index 4fea87d4..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/ProtocolInterface.php +++ /dev/null @@ -1,52 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Protocols; - -use Workerman\Connection\ConnectionInterface; - -/** - * Protocol interface - */ -interface ProtocolInterface -{ - /** - * Check the integrity of the package. - * Please return the length of package. - * If length is unknow please return 0 that mean wating more data. - * If the package has something wrong please return false the connection will be closed. - * - * @param string $recv_buffer - * @param ConnectionInterface $connection - * @return int|false - */ - public static function input($recv_buffer, ConnectionInterface $connection); - - /** - * Decode package and emit onMessage($message) callback, $message is the result that decode returned. - * - * @param string $recv_buffer - * @param ConnectionInterface $connection - * @return mixed - */ - public static function decode($recv_buffer, ConnectionInterface $connection); - - /** - * Encode package brefore sending to client. - * - * @param mixed $data - * @param ConnectionInterface $connection - * @return string - */ - public static function encode($data, ConnectionInterface $connection); -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Text.php b/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Text.php deleted file mode 100644 index 407ea2d1..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Text.php +++ /dev/null @@ -1,70 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Protocols; - -use Workerman\Connection\ConnectionInterface; - -/** - * Text Protocol. - */ -class Text -{ - /** - * Check the integrity of the package. - * - * @param string $buffer - * @param ConnectionInterface $connection - * @return int - */ - public static function input($buffer, ConnectionInterface $connection) - { - // Judge whether the package length exceeds the limit. - if (isset($connection->maxPackageSize) && \strlen($buffer) >= $connection->maxPackageSize) { - $connection->close(); - return 0; - } - // Find the position of "\n". - $pos = \strpos($buffer, "\n"); - // No "\n", packet length is unknown, continue to wait for the data so return 0. - if ($pos === false) { - return 0; - } - // Return the current package length. - return $pos + 1; - } - - /** - * Encode. - * - * @param string $buffer - * @return string - */ - public static function encode($buffer) - { - // Add "\n" - return $buffer . "\n"; - } - - /** - * Decode. - * - * @param string $buffer - * @return string - */ - public static function decode($buffer) - { - // Remove "\n" - return \rtrim($buffer, "\r\n"); - } -} \ No newline at end of file diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Websocket.php b/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Websocket.php deleted file mode 100644 index 2cc2fb7e..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Websocket.php +++ /dev/null @@ -1,492 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Protocols; - -use Workerman\Connection\ConnectionInterface; -use Workerman\Connection\TcpConnection; -use Workerman\Worker; - -/** - * WebSocket protocol. - */ -class Websocket implements \Workerman\Protocols\ProtocolInterface -{ - /** - * Websocket blob type. - * - * @var string - */ - const BINARY_TYPE_BLOB = "\x81"; - - /** - * Websocket arraybuffer type. - * - * @var string - */ - const BINARY_TYPE_ARRAYBUFFER = "\x82"; - - /** - * Check the integrity of the package. - * - * @param string $buffer - * @param ConnectionInterface $connection - * @return int - */ - public static function input($buffer, ConnectionInterface $connection) - { - // Receive length. - $recv_len = \strlen($buffer); - // We need more data. - if ($recv_len < 6) { - return 0; - } - - // Has not yet completed the handshake. - if (empty($connection->websocketHandshake)) { - return static::dealHandshake($buffer, $connection); - } - - // Buffer websocket frame data. - if ($connection->websocketCurrentFrameLength) { - // We need more frame data. - if ($connection->websocketCurrentFrameLength > $recv_len) { - // Return 0, because it is not clear the full packet length, waiting for the frame of fin=1. - return 0; - } - } else { - $firstbyte = \ord($buffer[0]); - $secondbyte = \ord($buffer[1]); - $data_len = $secondbyte & 127; - $is_fin_frame = $firstbyte >> 7; - $masked = $secondbyte >> 7; - - if (!$masked) { - Worker::safeEcho("frame not masked so close the connection\n"); - $connection->close(); - return 0; - } - - $opcode = $firstbyte & 0xf; - switch ($opcode) { - case 0x0: - break; - // Blob type. - case 0x1: - break; - // Arraybuffer type. - case 0x2: - break; - // Close package. - case 0x8: - // Try to emit onWebSocketClose callback. - if (isset($connection->onWebSocketClose) || isset($connection->worker->onWebSocketClose)) { - try { - \call_user_func(isset($connection->onWebSocketClose)?$connection->onWebSocketClose:$connection->worker->onWebSocketClose, $connection); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } // Close connection. - else { - $connection->close("\x88\x02\x03\xe8", true); - } - return 0; - // Ping package. - case 0x9: - break; - // Pong package. - case 0xa: - break; - // Wrong opcode. - default : - Worker::safeEcho("error opcode $opcode and close websocket connection. Buffer:" . bin2hex($buffer) . "\n"); - $connection->close(); - return 0; - } - - // Calculate packet length. - $head_len = 6; - if ($data_len === 126) { - $head_len = 8; - if ($head_len > $recv_len) { - return 0; - } - $pack = \unpack('nn/ntotal_len', $buffer); - $data_len = $pack['total_len']; - } else { - if ($data_len === 127) { - $head_len = 14; - if ($head_len > $recv_len) { - return 0; - } - $arr = \unpack('n/N2c', $buffer); - $data_len = $arr['c1']*4294967296 + $arr['c2']; - } - } - $current_frame_length = $head_len + $data_len; - - $total_package_size = \strlen($connection->websocketDataBuffer) + $current_frame_length; - if ($total_package_size > $connection->maxPackageSize) { - Worker::safeEcho("error package. package_length=$total_package_size\n"); - $connection->close(); - return 0; - } - - if ($is_fin_frame) { - if ($opcode === 0x9) { - if ($recv_len >= $current_frame_length) { - $ping_data = static::decode(\substr($buffer, 0, $current_frame_length), $connection); - $connection->consumeRecvBuffer($current_frame_length); - $tmp_connection_type = isset($connection->websocketType) ? $connection->websocketType : static::BINARY_TYPE_BLOB; - $connection->websocketType = "\x8a"; - if (isset($connection->onWebSocketPing) || isset($connection->worker->onWebSocketPing)) { - try { - \call_user_func(isset($connection->onWebSocketPing)?$connection->onWebSocketPing:$connection->worker->onWebSocketPing, $connection, $ping_data); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } else { - $connection->send($ping_data); - } - $connection->websocketType = $tmp_connection_type; - if ($recv_len > $current_frame_length) { - return static::input(\substr($buffer, $current_frame_length), $connection); - } - } - return 0; - } else if ($opcode === 0xa) { - if ($recv_len >= $current_frame_length) { - $pong_data = static::decode(\substr($buffer, 0, $current_frame_length), $connection); - $connection->consumeRecvBuffer($current_frame_length); - $tmp_connection_type = isset($connection->websocketType) ? $connection->websocketType : static::BINARY_TYPE_BLOB; - $connection->websocketType = "\x8a"; - // Try to emit onWebSocketPong callback. - if (isset($connection->onWebSocketPong) || isset($connection->worker->onWebSocketPong)) { - try { - \call_user_func(isset($connection->onWebSocketPong)?$connection->onWebSocketPong:$connection->worker->onWebSocketPong, $connection, $pong_data); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - $connection->websocketType = $tmp_connection_type; - if ($recv_len > $current_frame_length) { - return static::input(\substr($buffer, $current_frame_length), $connection); - } - } - return 0; - } - return $current_frame_length; - } else { - $connection->websocketCurrentFrameLength = $current_frame_length; - } - } - - // Received just a frame length data. - if ($connection->websocketCurrentFrameLength === $recv_len) { - static::decode($buffer, $connection); - $connection->consumeRecvBuffer($connection->websocketCurrentFrameLength); - $connection->websocketCurrentFrameLength = 0; - return 0; - } // The length of the received data is greater than the length of a frame. - elseif ($connection->websocketCurrentFrameLength < $recv_len) { - static::decode(\substr($buffer, 0, $connection->websocketCurrentFrameLength), $connection); - $connection->consumeRecvBuffer($connection->websocketCurrentFrameLength); - $current_frame_length = $connection->websocketCurrentFrameLength; - $connection->websocketCurrentFrameLength = 0; - // Continue to read next frame. - return static::input(\substr($buffer, $current_frame_length), $connection); - } // The length of the received data is less than the length of a frame. - else { - return 0; - } - } - - /** - * Websocket encode. - * - * @param string $buffer - * @param ConnectionInterface $connection - * @return string - */ - public static function encode($buffer, ConnectionInterface $connection) - { - if (!is_scalar($buffer)) { - throw new \Exception("You can't send(" . \gettype($buffer) . ") to client, you need to convert it to a string. "); - } - $len = \strlen($buffer); - if (empty($connection->websocketType)) { - $connection->websocketType = static::BINARY_TYPE_BLOB; - } - - $first_byte = $connection->websocketType; - - if ($len <= 125) { - $encode_buffer = $first_byte . \chr($len) . $buffer; - } else { - if ($len <= 65535) { - $encode_buffer = $first_byte . \chr(126) . \pack("n", $len) . $buffer; - } else { - $encode_buffer = $first_byte . \chr(127) . \pack("xxxxN", $len) . $buffer; - } - } - - // Handshake not completed so temporary buffer websocket data waiting for send. - if (empty($connection->websocketHandshake)) { - if (empty($connection->tmpWebsocketData)) { - $connection->tmpWebsocketData = ''; - } - // If buffer has already full then discard the current package. - if (\strlen($connection->tmpWebsocketData) > $connection->maxSendBufferSize) { - if ($connection->onError) { - try { - \call_user_func($connection->onError, $connection, \WORKERMAN_SEND_FAIL, 'send buffer full and drop package'); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - return ''; - } - $connection->tmpWebsocketData .= $encode_buffer; - // Check buffer is full. - if ($connection->maxSendBufferSize <= \strlen($connection->tmpWebsocketData)) { - if ($connection->onBufferFull) { - try { - \call_user_func($connection->onBufferFull, $connection); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - } - - // Return empty string. - return ''; - } - - return $encode_buffer; - } - - /** - * Websocket decode. - * - * @param string $buffer - * @param ConnectionInterface $connection - * @return string - */ - public static function decode($buffer, ConnectionInterface $connection) - { - $len = \ord($buffer[1]) & 127; - if ($len === 126) { - $masks = \substr($buffer, 4, 4); - $data = \substr($buffer, 8); - } else { - if ($len === 127) { - $masks = \substr($buffer, 10, 4); - $data = \substr($buffer, 14); - } else { - $masks = \substr($buffer, 2, 4); - $data = \substr($buffer, 6); - } - } - $dataLength = \strlen($data); - $masks = \str_repeat($masks, \floor($dataLength / 4)) . \substr($masks, 0, $dataLength % 4); - $decoded = $data ^ $masks; - if ($connection->websocketCurrentFrameLength) { - $connection->websocketDataBuffer .= $decoded; - return $connection->websocketDataBuffer; - } else { - if ($connection->websocketDataBuffer !== '') { - $decoded = $connection->websocketDataBuffer . $decoded; - $connection->websocketDataBuffer = ''; - } - return $decoded; - } - } - - /** - * Websocket handshake. - * - * @param string $buffer - * @param TcpConnection $connection - * @return int - */ - public static function dealHandshake($buffer, TcpConnection $connection) - { - // HTTP protocol. - if (0 === \strpos($buffer, 'GET')) { - // Find \r\n\r\n. - $heder_end_pos = \strpos($buffer, "\r\n\r\n"); - if (!$heder_end_pos) { - return 0; - } - $header_length = $heder_end_pos + 4; - - // Get Sec-WebSocket-Key. - $Sec_WebSocket_Key = ''; - if (\preg_match("/Sec-WebSocket-Key: *(.*?)\r\n/i", $buffer, $match)) { - $Sec_WebSocket_Key = $match[1]; - } else { - $connection->close("HTTP/1.1 200 WebSocket\r\nServer: workerman/".Worker::VERSION."\r\n\r\n

WebSocket


workerman/".Worker::VERSION."
", - true); - return 0; - } - // Calculation websocket key. - $new_key = \base64_encode(\sha1($Sec_WebSocket_Key . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true)); - // Handshake response data. - $handshake_message = "HTTP/1.1 101 Switching Protocols\r\n" - ."Upgrade: websocket\r\n" - ."Sec-WebSocket-Version: 13\r\n" - ."Connection: Upgrade\r\n" - ."Sec-WebSocket-Accept: " . $new_key . "\r\n"; - - // Websocket data buffer. - $connection->websocketDataBuffer = ''; - // Current websocket frame length. - $connection->websocketCurrentFrameLength = 0; - // Current websocket frame data. - $connection->websocketCurrentFrameBuffer = ''; - // Consume handshake data. - $connection->consumeRecvBuffer($header_length); - - // blob or arraybuffer - if (empty($connection->websocketType)) { - $connection->websocketType = static::BINARY_TYPE_BLOB; - } - - $has_server_header = false; - - if (isset($connection->headers)) { - if (\is_array($connection->headers)) { - foreach ($connection->headers as $header) { - if (\strpos($header, 'Server:') === 0) { - $has_server_header = true; - } - $handshake_message .= "$header\r\n"; - } - } else { - $handshake_message .= "$connection->headers\r\n"; - } - } - if (!$has_server_header) { - $handshake_message .= "Server: workerman/".Worker::VERSION."\r\n"; - } - $handshake_message .= "\r\n"; - // Send handshake response. - $connection->send($handshake_message, true); - // Mark handshake complete.. - $connection->websocketHandshake = true; - - // Try to emit onWebSocketConnect callback. - $on_websocket_connect = isset($connection->onWebSocketConnect) ? $connection->onWebSocketConnect : - (isset($connection->worker->onWebSocketConnect) ? $connection->worker->onWebSocketConnect : false); - if ($on_websocket_connect) { - static::parseHttpHeader($buffer); - try { - \call_user_func($on_websocket_connect, $connection, $buffer); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - if (!empty($_SESSION) && \class_exists('\GatewayWorker\Lib\Context')) { - $connection->session = \GatewayWorker\Lib\Context::sessionEncode($_SESSION); - } - $_GET = $_SERVER = $_SESSION = $_COOKIE = array(); - } - - // There are data waiting to be sent. - if (!empty($connection->tmpWebsocketData)) { - $connection->send($connection->tmpWebsocketData, true); - $connection->tmpWebsocketData = ''; - } - if (\strlen($buffer) > $header_length) { - return static::input(\substr($buffer, $header_length), $connection); - } - return 0; - } // Is flash policy-file-request. - elseif (0 === \strpos($buffer, 'send($policy_xml, true); - $connection->consumeRecvBuffer(\strlen($buffer)); - return 0; - } - // Bad websocket handshake request. - $connection->close("HTTP/1.1 200 WebSocket\r\nServer: workerman/".Worker::VERSION."\r\n\r\n

WebSocket


workerman/".Worker::VERSION."
", - true); - return 0; - } - - /** - * Parse http header. - * - * @param string $buffer - * @return void - */ - protected static function parseHttpHeader($buffer) - { - // Parse headers. - list($http_header, ) = \explode("\r\n\r\n", $buffer, 2); - $header_data = \explode("\r\n", $http_header); - - if ($_SERVER) { - $_SERVER = array(); - } - - list($_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI'], $_SERVER['SERVER_PROTOCOL']) = \explode(' ', - $header_data[0]); - - unset($header_data[0]); - foreach ($header_data as $content) { - // \r\n\r\n - if (empty($content)) { - continue; - } - list($key, $value) = \explode(':', $content, 2); - $key = \str_replace('-', '_', \strtoupper($key)); - $value = \trim($value); - $_SERVER['HTTP_' . $key] = $value; - switch ($key) { - // HTTP_HOST - case 'HOST': - $tmp = \explode(':', $value); - $_SERVER['SERVER_NAME'] = $tmp[0]; - if (isset($tmp[1])) { - $_SERVER['SERVER_PORT'] = $tmp[1]; - } - break; - // cookie - case 'COOKIE': - \parse_str(\str_replace('; ', '&', $_SERVER['HTTP_COOKIE']), $_COOKIE); - break; - } - } - - // QUERY_STRING - $_SERVER['QUERY_STRING'] = \parse_url($_SERVER['REQUEST_URI'], \PHP_URL_QUERY); - if ($_SERVER['QUERY_STRING']) { - // $GET - \parse_str($_SERVER['QUERY_STRING'], $_GET); - } else { - $_SERVER['QUERY_STRING'] = ''; - } - } -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Ws.php b/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Ws.php deleted file mode 100644 index 449a419d..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Protocols/Ws.php +++ /dev/null @@ -1,460 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman\Protocols; - -use Workerman\Worker; -use Workerman\Lib\Timer; -use Workerman\Connection\TcpConnection; -use Workerman\Connection\ConnectionInterface; - -/** - * Websocket protocol for client. - */ -class Ws -{ - /** - * Websocket blob type. - * - * @var string - */ - const BINARY_TYPE_BLOB = "\x81"; - - /** - * Websocket arraybuffer type. - * - * @var string - */ - const BINARY_TYPE_ARRAYBUFFER = "\x82"; - - /** - * Check the integrity of the package. - * - * @param string $buffer - * @param ConnectionInterface $connection - * @return int - */ - public static function input($buffer, ConnectionInterface $connection) - { - if (empty($connection->handshakeStep)) { - Worker::safeEcho("recv data before handshake. Buffer:" . \bin2hex($buffer) . "\n"); - return false; - } - // Recv handshake response - if ($connection->handshakeStep === 1) { - return self::dealHandshake($buffer, $connection); - } - $recv_len = \strlen($buffer); - if ($recv_len < 2) { - return 0; - } - // Buffer websocket frame data. - if ($connection->websocketCurrentFrameLength) { - // We need more frame data. - if ($connection->websocketCurrentFrameLength > $recv_len) { - // Return 0, because it is not clear the full packet length, waiting for the frame of fin=1. - return 0; - } - } else { - - $firstbyte = \ord($buffer[0]); - $secondbyte = \ord($buffer[1]); - $data_len = $secondbyte & 127; - $is_fin_frame = $firstbyte >> 7; - $masked = $secondbyte >> 7; - - if ($masked) { - Worker::safeEcho("frame masked so close the connection\n"); - $connection->close(); - return 0; - } - - $opcode = $firstbyte & 0xf; - - switch ($opcode) { - case 0x0: - break; - // Blob type. - case 0x1: - break; - // Arraybuffer type. - case 0x2: - break; - // Close package. - case 0x8: - // Try to emit onWebSocketClose callback. - if (isset($connection->onWebSocketClose)) { - try { - \call_user_func($connection->onWebSocketClose, $connection); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } // Close connection. - else { - $connection->close(); - } - return 0; - // Ping package. - case 0x9: - break; - // Pong package. - case 0xa: - break; - // Wrong opcode. - default : - Worker::safeEcho("error opcode $opcode and close websocket connection. Buffer:" . $buffer . "\n"); - $connection->close(); - return 0; - } - // Calculate packet length. - if ($data_len === 126) { - if (\strlen($buffer) < 4) { - return 0; - } - $pack = \unpack('nn/ntotal_len', $buffer); - $current_frame_length = $pack['total_len'] + 4; - } else if ($data_len === 127) { - if (\strlen($buffer) < 10) { - return 0; - } - $arr = \unpack('n/N2c', $buffer); - $current_frame_length = $arr['c1']*4294967296 + $arr['c2'] + 10; - } else { - $current_frame_length = $data_len + 2; - } - - $total_package_size = \strlen($connection->websocketDataBuffer) + $current_frame_length; - if ($total_package_size > $connection->maxPackageSize) { - Worker::safeEcho("error package. package_length=$total_package_size\n"); - $connection->close(); - return 0; - } - - if ($is_fin_frame) { - if ($opcode === 0x9) { - if ($recv_len >= $current_frame_length) { - $ping_data = static::decode(\substr($buffer, 0, $current_frame_length), $connection); - $connection->consumeRecvBuffer($current_frame_length); - $tmp_connection_type = isset($connection->websocketType) ? $connection->websocketType : static::BINARY_TYPE_BLOB; - $connection->websocketType = "\x8a"; - if (isset($connection->onWebSocketPing)) { - try { - \call_user_func($connection->onWebSocketPing, $connection, $ping_data); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } else { - $connection->send($ping_data); - } - $connection->websocketType = $tmp_connection_type; - if ($recv_len > $current_frame_length) { - return static::input(\substr($buffer, $current_frame_length), $connection); - } - } - return 0; - - } else if ($opcode === 0xa) { - if ($recv_len >= $current_frame_length) { - $pong_data = static::decode(\substr($buffer, 0, $current_frame_length), $connection); - $connection->consumeRecvBuffer($current_frame_length); - $tmp_connection_type = isset($connection->websocketType) ? $connection->websocketType : static::BINARY_TYPE_BLOB; - $connection->websocketType = "\x8a"; - // Try to emit onWebSocketPong callback. - if (isset($connection->onWebSocketPong)) { - try { - \call_user_func($connection->onWebSocketPong, $connection, $pong_data); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - $connection->websocketType = $tmp_connection_type; - if ($recv_len > $current_frame_length) { - return static::input(\substr($buffer, $current_frame_length), $connection); - } - } - return 0; - } - return $current_frame_length; - } else { - $connection->websocketCurrentFrameLength = $current_frame_length; - } - } - // Received just a frame length data. - if ($connection->websocketCurrentFrameLength === $recv_len) { - self::decode($buffer, $connection); - $connection->consumeRecvBuffer($connection->websocketCurrentFrameLength); - $connection->websocketCurrentFrameLength = 0; - return 0; - } // The length of the received data is greater than the length of a frame. - elseif ($connection->websocketCurrentFrameLength < $recv_len) { - self::decode(\substr($buffer, 0, $connection->websocketCurrentFrameLength), $connection); - $connection->consumeRecvBuffer($connection->websocketCurrentFrameLength); - $current_frame_length = $connection->websocketCurrentFrameLength; - $connection->websocketCurrentFrameLength = 0; - // Continue to read next frame. - return self::input(\substr($buffer, $current_frame_length), $connection); - } // The length of the received data is less than the length of a frame. - else { - return 0; - } - } - - /** - * Websocket encode. - * - * @param string $buffer - * @param ConnectionInterface $connection - * @return string - */ - public static function encode($payload, ConnectionInterface $connection) - { - if (empty($connection->websocketType)) { - $connection->websocketType = self::BINARY_TYPE_BLOB; - } - $payload = (string)$payload; - if (empty($connection->handshakeStep)) { - static::sendHandshake($connection); - } - $mask = 1; - $mask_key = "\x00\x00\x00\x00"; - - $pack = ''; - $length = $length_flag = \strlen($payload); - if (65535 < $length) { - $pack = \pack('NN', ($length & 0xFFFFFFFF00000000) >> 32, $length & 0x00000000FFFFFFFF); - $length_flag = 127; - } else if (125 < $length) { - $pack = \pack('n*', $length); - $length_flag = 126; - } - - $head = ($mask << 7) | $length_flag; - $head = $connection->websocketType . \chr($head) . $pack; - - $frame = $head . $mask_key; - // append payload to frame: - $mask_key = \str_repeat($mask_key, \floor($length / 4)) . \substr($mask_key, 0, $length % 4); - $frame .= $payload ^ $mask_key; - if ($connection->handshakeStep === 1) { - // If buffer has already full then discard the current package. - if (\strlen($connection->tmpWebsocketData) > $connection->maxSendBufferSize) { - if ($connection->onError) { - try { - \call_user_func($connection->onError, $connection, \WORKERMAN_SEND_FAIL, 'send buffer full and drop package'); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - return ''; - } - $connection->tmpWebsocketData = $connection->tmpWebsocketData . $frame; - // Check buffer is full. - if ($connection->maxSendBufferSize <= \strlen($connection->tmpWebsocketData)) { - if ($connection->onBufferFull) { - try { - \call_user_func($connection->onBufferFull, $connection); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - } - return ''; - } - return $frame; - } - - /** - * Websocket decode. - * - * @param string $buffer - * @param ConnectionInterface $connection - * @return string - */ - public static function decode($bytes, ConnectionInterface $connection) - { - $data_length = \ord($bytes[1]); - - if ($data_length === 126) { - $decoded_data = \substr($bytes, 4); - } else if ($data_length === 127) { - $decoded_data = \substr($bytes, 10); - } else { - $decoded_data = \substr($bytes, 2); - } - if ($connection->websocketCurrentFrameLength) { - $connection->websocketDataBuffer .= $decoded_data; - return $connection->websocketDataBuffer; - } else { - if ($connection->websocketDataBuffer !== '') { - $decoded_data = $connection->websocketDataBuffer . $decoded_data; - $connection->websocketDataBuffer = ''; - } - return $decoded_data; - } - } - - /** - * Send websocket handshake data. - * - * @return void - */ - public static function onConnect($connection) - { - static::sendHandshake($connection); - } - - /** - * Clean - * - * @param TcpConnection $connection - */ - public static function onClose($connection) - { - $connection->handshakeStep = null; - $connection->websocketCurrentFrameLength = 0; - $connection->tmpWebsocketData = ''; - $connection->websocketDataBuffer = ''; - if (!empty($connection->websocketPingTimer)) { - Timer::del($connection->websocketPingTimer); - $connection->websocketPingTimer = null; - } - } - - /** - * Send websocket handshake. - * - * @param TcpConnection $connection - * @return void - */ - public static function sendHandshake(TcpConnection $connection) - { - if (!empty($connection->handshakeStep)) { - return; - } - // Get Host. - $port = $connection->getRemotePort(); - $host = $port === 80 ? $connection->getRemoteHost() : $connection->getRemoteHost() . ':' . $port; - // Handshake header. - $connection->websocketSecKey = \base64_encode(\md5(\mt_rand(), true)); - $user_header = isset($connection->headers) ? $connection->headers : - (isset($connection->wsHttpHeader) ? $connection->wsHttpHeader : null); - $user_header_str = ''; - if (!empty($user_header)) { - if (\is_array($user_header)){ - foreach($user_header as $k=>$v){ - $user_header_str .= "$k: $v\r\n"; - } - } else { - $user_header_str .= $user_header; - } - $user_header_str = "\r\n".\trim($user_header_str); - } - $header = 'GET ' . $connection->getRemoteURI() . " HTTP/1.1\r\n". - (!\preg_match("/\nHost:/i", $user_header_str) ? "Host: $host\r\n" : ''). - "Connection: Upgrade\r\n". - "Upgrade: websocket\r\n". - (isset($connection->websocketOrigin) ? "Origin: ".$connection->websocketOrigin."\r\n":''). - (isset($connection->WSClientProtocol)?"Sec-WebSocket-Protocol: ".$connection->WSClientProtocol."\r\n":''). - "Sec-WebSocket-Version: 13\r\n". - "Sec-WebSocket-Key: " . $connection->websocketSecKey . $user_header_str . "\r\n\r\n"; - $connection->send($header, true); - $connection->handshakeStep = 1; - $connection->websocketCurrentFrameLength = 0; - $connection->websocketDataBuffer = ''; - $connection->tmpWebsocketData = ''; - } - - /** - * Websocket handshake. - * - * @param string $buffer - * @param TcpConnection $connection - * @return int - */ - public static function dealHandshake($buffer, TcpConnection $connection) - { - $pos = \strpos($buffer, "\r\n\r\n"); - if ($pos) { - //checking Sec-WebSocket-Accept - if (\preg_match("/Sec-WebSocket-Accept: *(.*?)\r\n/i", $buffer, $match)) { - if ($match[1] !== \base64_encode(\sha1($connection->websocketSecKey . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true))) { - Worker::safeEcho("Sec-WebSocket-Accept not match. Header:\n" . \substr($buffer, 0, $pos) . "\n"); - $connection->close(); - return 0; - } - } else { - Worker::safeEcho("Sec-WebSocket-Accept not found. Header:\n" . \substr($buffer, 0, $pos) . "\n"); - $connection->close(); - return 0; - } - - // handshake complete - - // Get WebSocket subprotocol (if specified by server) - if (\preg_match("/Sec-WebSocket-Protocol: *(.*?)\r\n/i", $buffer, $match)) { - $connection->WSServerProtocol = \trim($match[1]); - } - - $connection->handshakeStep = 2; - $handshake_response_length = $pos + 4; - // Try to emit onWebSocketConnect callback. - if (isset($connection->onWebSocketConnect)) { - try { - \call_user_func($connection->onWebSocketConnect, $connection, \substr($buffer, 0, $handshake_response_length)); - } catch (\Exception $e) { - Worker::stopAll(250, $e); - } catch (\Error $e) { - Worker::stopAll(250, $e); - } - } - // Headbeat. - if (!empty($connection->websocketPingInterval)) { - $connection->websocketPingTimer = Timer::add($connection->websocketPingInterval, function() use ($connection){ - if (false === $connection->send(\pack('H*', '898000000000'), true)) { - Timer::del($connection->websocketPingTimer); - $connection->websocketPingTimer = null; - } - }); - } - - $connection->consumeRecvBuffer($handshake_response_length); - if (!empty($connection->tmpWebsocketData)) { - $connection->send($connection->tmpWebsocketData, true); - $connection->tmpWebsocketData = ''; - } - if (\strlen($buffer) > $handshake_response_length) { - return self::input(\substr($buffer, $handshake_response_length), $connection); - } - } - return 0; - } - - public static function WSSetProtocol($connection, $params) { - $connection->WSClientProtocol = $params[0]; - } - - public static function WSGetServerProtocol($connection) { - return (\property_exists($connection, 'WSServerProtocol') ? $connection->WSServerProtocol : null); - } - -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/README.md b/GatewayWorker_linux/vendor/workerman/workerman/README.md deleted file mode 100644 index 856e0204..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/README.md +++ /dev/null @@ -1,310 +0,0 @@ -# Workerman -[![Gitter](https://badges.gitter.im/walkor/Workerman.svg)](https://gitter.im/walkor/Workerman?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=body_badge) -[![Latest Stable Version](https://poser.pugx.org/workerman/workerman/v/stable)](https://packagist.org/packages/workerman/workerman) -[![Total Downloads](https://poser.pugx.org/workerman/workerman/downloads)](https://packagist.org/packages/workerman/workerman) -[![Monthly Downloads](https://poser.pugx.org/workerman/workerman/d/monthly)](https://packagist.org/packages/workerman/workerman) -[![Daily Downloads](https://poser.pugx.org/workerman/workerman/d/daily)](https://packagist.org/packages/workerman/workerman) -[![License](https://poser.pugx.org/workerman/workerman/license)](https://packagist.org/packages/workerman/workerman) - -## What is it -Workerman is an asynchronous event-driven PHP framework with high performance to build fast and scalable network applications. -Workerman supports HTTP, Websocket, SSL and other custom protocols. -Workerman supports event extension. - -## Requires -PHP 5.3 or Higher -A POSIX compatible operating system (Linux, OSX, BSD) -POSIX and PCNTL extensions required -Event extension recommended for better performance - -## Installation - -``` -composer require workerman/workerman -``` - -## Basic Usage - -### A websocket server -```php -onConnect = function ($connection) { - echo "New connection\n"; -}; - -// Emitted when data received -$ws_worker->onMessage = function ($connection, $data) { - // Send hello $data - $connection->send('Hello ' . $data); -}; - -// Emitted when connection closed -$ws_worker->onClose = function ($connection) { - echo "Connection closed\n"; -}; - -// Run worker -Worker::runAll(); -``` - -### An http server -```php -use Workerman\Worker; - -require_once __DIR__ . '/vendor/autoload.php'; - -// #### http worker #### -$http_worker = new Worker('http://0.0.0.0:2345'); - -// 4 processes -$http_worker->count = 4; - -// Emitted when data received -$http_worker->onMessage = function ($connection, $request) { - //$request->get(); - //$request->post(); - //$request->header(); - //$request->cookie(); - //$request->session(); - //$request->uri(); - //$request->path(); - //$request->method(); - - // Send data to client - $connection->send("Hello World"); -}; - -// Run all workers -Worker::runAll(); -``` - -### A tcp server -```php -use Workerman\Worker; - -require_once __DIR__ . '/vendor/autoload.php'; - -// #### create socket and listen 1234 port #### -$tcp_worker = new Worker('tcp://0.0.0.0:1234'); - -// 4 processes -$tcp_worker->count = 4; - -// Emitted when new connection come -$tcp_worker->onConnect = function ($connection) { - echo "New Connection\n"; -}; - -// Emitted when data received -$tcp_worker->onMessage = function ($connection, $data) { - // Send data to client - $connection->send("Hello $data \n"); -}; - -// Emitted when connection is closed -$tcp_worker->onClose = function ($connection) { - echo "Connection closed\n"; -}; - -Worker::runAll(); -``` - -### Enable SSL -```php - array( - 'local_cert' => '/your/path/of/server.pem', - 'local_pk' => '/your/path/of/server.key', - 'verify_peer' => false, - ) -); - -// Create a Websocket server with ssl context. -$ws_worker = new Worker('websocket://0.0.0.0:2346', $context); - -// Enable SSL. WebSocket+SSL means that Secure WebSocket (wss://). -// The similar approaches for Https etc. -$ws_worker->transport = 'ssl'; - -$ws_worker->onMessage = function ($connection, $data) { - // Send hello $data - $connection->send('Hello ' . $data); -}; - -Worker::runAll(); -``` - -### Custom protocol -Protocols/MyTextProtocol.php -```php - -namespace Protocols; - -/** - * User defined protocol - * Format Text+"\n" - */ -class MyTextProtocol -{ - public static function input($recv_buffer) - { - // Find the position of the first occurrence of "\n" - $pos = strpos($recv_buffer, "\n"); - - // Not a complete package. Return 0 because the length of package can not be calculated - if ($pos === false) { - return 0; - } - - // Return length of the package - return $pos+1; - } - - public static function decode($recv_buffer) - { - return trim($recv_buffer); - } - - public static function encode($data) - { - return $data . "\n"; - } -} -``` - -```php -use Workerman\Worker; - -require_once __DIR__ . '/vendor/autoload.php'; - -// #### MyTextProtocol worker #### -$text_worker = new Worker('MyTextProtocol://0.0.0.0:5678'); - -$text_worker->onConnect = function ($connection) { - echo "New connection\n"; -}; - -$text_worker->onMessage = function ($connection, $data) { - // Send data to client - $connection->send("Hello world\n"); -}; - -$text_worker->onClose = function ($connection) { - echo "Connection closed\n"; -}; - -// Run all workers -Worker::runAll(); -``` - -### Timer -```php - -use Workerman\Worker; -use Workerman\Timer; - -require_once __DIR__ . '/vendor/autoload.php'; - -$task = new Worker(); -$task->onWorkerStart = function ($task) { - // 2.5 seconds - $time_interval = 2.5; - $timer_id = Timer::add($time_interval, function () { - echo "Timer run\n"; - }); -}; - -// Run all workers -Worker::runAll(); -``` - -### AsyncTcpConnection (tcp/ws/text/frame etc...) -```php - -use Workerman\Worker; -use Workerman\Connection\AsyncTcpConnection; - -require_once __DIR__ . '/vendor/autoload.php'; - -$worker = new Worker(); -$worker->onWorkerStart = function () { - // Websocket protocol for client. - $ws_connection = new AsyncTcpConnection('ws://echo.websocket.org:80'); - $ws_connection->onConnect = function ($connection) { - $connection->send('Hello'); - }; - $ws_connection->onMessage = function ($connection, $data) { - echo "Recv: $data\n"; - }; - $ws_connection->onError = function ($connection, $code, $msg) { - echo "Error: $msg\n"; - }; - $ws_connection->onClose = function ($connection) { - echo "Connection closed\n"; - }; - $ws_connection->connect(); -}; - -Worker::runAll(); -``` - - - -## Available commands -```php start.php start ``` -```php start.php start -d ``` -![workerman start](http://www.workerman.net/img/workerman-start.png) -```php start.php status ``` -![workerman satus](http://www.workerman.net/img/workerman-status.png?a=123) -```php start.php connections``` -```php start.php stop ``` -```php start.php restart ``` -```php start.php reload ``` - -## Documentation - -中文主页:[http://www.workerman.net](https://www.workerman.net) - -中文文档: [https://www.workerman.net/doc/workerman](https://www.workerman.net/doc/workerman) - -Documentation:[https://github.com/walkor/workerman-manual](https://github.com/walkor/workerman-manual/blob/master/english/SUMMARY.md) - -# Benchmarks -https://www.techempower.com/benchmarks/#section=data-r20&hw=ph&test=db&l=yyku7z-e7&a=2 -![image](https://user-images.githubusercontent.com/6073368/146704320-1559fe97-aa67-4ee3-95d6-61e341b3c93b.png) - -## Sponsors -[opencollective.com/walkor](https://opencollective.com/walkor) - -[patreon.com/walkor](https://patreon.com/walkor) - -## Donate - - - -## Other links with workerman - -[webman](https://github.com/walkor/webman) -[PHPSocket.IO](https://github.com/walkor/phpsocket.io) -[php-socks5](https://github.com/walkor/php-socks5) -[php-http-proxy](https://github.com/walkor/php-http-proxy) - -## LICENSE - -Workerman is released under the [MIT license](https://github.com/walkor/workerman/blob/master/MIT-LICENSE.txt). diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Timer.php b/GatewayWorker_linux/vendor/workerman/workerman/Timer.php deleted file mode 100644 index 348bb3a4..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Timer.php +++ /dev/null @@ -1,213 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman; - -use Workerman\Events\EventInterface; -use Workerman\Worker; -use \Exception; - -/** - * Timer. - * - * example: - * Workerman\Timer::add($time_interval, callback, array($arg1, $arg2..)); - */ -class Timer -{ - /** - * Tasks that based on ALARM signal. - * [ - * run_time => [[$func, $args, $persistent, time_interval],[$func, $args, $persistent, time_interval],..]], - * run_time => [[$func, $args, $persistent, time_interval],[$func, $args, $persistent, time_interval],..]], - * .. - * ] - * - * @var array - */ - protected static $_tasks = array(); - - /** - * event - * - * @var EventInterface - */ - protected static $_event = null; - - /** - * timer id - * - * @var int - */ - protected static $_timerId = 0; - - /** - * timer status - * [ - * timer_id1 => bool, - * timer_id2 => bool, - * ...................., - * ] - * - * @var array - */ - protected static $_status = array(); - - /** - * Init. - * - * @param EventInterface $event - * @return void - */ - public static function init($event = null) - { - if ($event) { - self::$_event = $event; - return; - } - if (\function_exists('pcntl_signal')) { - \pcntl_signal(\SIGALRM, array('\Workerman\Lib\Timer', 'signalHandle'), false); - } - } - - /** - * ALARM signal handler. - * - * @return void - */ - public static function signalHandle() - { - if (!self::$_event) { - \pcntl_alarm(1); - self::tick(); - } - } - - /** - * Add a timer. - * - * @param float $time_interval - * @param callable $func - * @param mixed $args - * @param bool $persistent - * @return int|bool - */ - public static function add($time_interval, $func, $args = array(), $persistent = true) - { - if ($time_interval <= 0) { - Worker::safeEcho(new Exception("bad time_interval")); - return false; - } - - if ($args === null) { - $args = array(); - } - - if (self::$_event) { - return self::$_event->add($time_interval, - $persistent ? EventInterface::EV_TIMER : EventInterface::EV_TIMER_ONCE, $func, $args); - } - - if (!\is_callable($func)) { - Worker::safeEcho(new Exception("not callable")); - return false; - } - - if (empty(self::$_tasks)) { - \pcntl_alarm(1); - } - - $run_time = \time() + $time_interval; - if (!isset(self::$_tasks[$run_time])) { - self::$_tasks[$run_time] = array(); - } - - self::$_timerId = self::$_timerId == \PHP_INT_MAX ? 1 : ++self::$_timerId; - self::$_status[self::$_timerId] = true; - self::$_tasks[$run_time][self::$_timerId] = array($func, (array)$args, $persistent, $time_interval); - - return self::$_timerId; - } - - - /** - * Tick. - * - * @return void - */ - public static function tick() - { - if (empty(self::$_tasks)) { - \pcntl_alarm(0); - return; - } - $time_now = \time(); - foreach (self::$_tasks as $run_time => $task_data) { - if ($time_now >= $run_time) { - foreach ($task_data as $index => $one_task) { - $task_func = $one_task[0]; - $task_args = $one_task[1]; - $persistent = $one_task[2]; - $time_interval = $one_task[3]; - try { - \call_user_func_array($task_func, $task_args); - } catch (\Exception $e) { - Worker::safeEcho($e); - } - if($persistent && !empty(self::$_status[$index])) { - $new_run_time = \time() + $time_interval; - if(!isset(self::$_tasks[$new_run_time])) self::$_tasks[$new_run_time] = array(); - self::$_tasks[$new_run_time][$index] = array($task_func, (array)$task_args, $persistent, $time_interval); - } - } - unset(self::$_tasks[$run_time]); - } - } - } - - /** - * Remove a timer. - * - * @param mixed $timer_id - * @return bool - */ - public static function del($timer_id) - { - if (self::$_event) { - return self::$_event->del($timer_id, EventInterface::EV_TIMER); - } - - foreach(self::$_tasks as $run_time => $task_data) - { - if(array_key_exists($timer_id, $task_data)) unset(self::$_tasks[$run_time][$timer_id]); - } - - if(array_key_exists($timer_id, self::$_status)) unset(self::$_status[$timer_id]); - - return true; - } - - /** - * Remove all timers. - * - * @return void - */ - public static function delAll() - { - self::$_tasks = self::$_status = array(); - \pcntl_alarm(0); - if (self::$_event) { - self::$_event->clearAllTimer(); - } - } -} diff --git a/GatewayWorker_linux/vendor/workerman/workerman/Worker.php b/GatewayWorker_linux/vendor/workerman/workerman/Worker.php deleted file mode 100644 index f6e2b6cc..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/Worker.php +++ /dev/null @@ -1,2575 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -namespace Workerman; -require_once __DIR__ . '/Lib/Constants.php'; - -use Workerman\Events\EventInterface; -use Workerman\Connection\ConnectionInterface; -use Workerman\Connection\TcpConnection; -use Workerman\Connection\UdpConnection; -use Workerman\Lib\Timer; -use Workerman\Events\Select; -use \Exception; - -/** - * Worker class - * A container for listening ports - */ -class Worker -{ - /** - * Version. - * - * @var string - */ - const VERSION = '4.0.27'; - - /** - * Status starting. - * - * @var int - */ - const STATUS_STARTING = 1; - - /** - * Status running. - * - * @var int - */ - const STATUS_RUNNING = 2; - - /** - * Status shutdown. - * - * @var int - */ - const STATUS_SHUTDOWN = 4; - - /** - * Status reloading. - * - * @var int - */ - const STATUS_RELOADING = 8; - - /** - * After sending the restart command to the child process KILL_WORKER_TIMER_TIME seconds, - * if the process is still living then forced to kill. - * - * @var int - */ - const KILL_WORKER_TIMER_TIME = 2; - - /** - * Default backlog. Backlog is the maximum length of the queue of pending connections. - * - * @var int - */ - const DEFAULT_BACKLOG = 102400; - /** - * Max udp package size. - * - * @var int - */ - const MAX_UDP_PACKAGE_SIZE = 65535; - - /** - * The safe distance for columns adjacent - * - * @var int - */ - const UI_SAFE_LENGTH = 4; - - /** - * Worker id. - * - * @var int - */ - public $id = 0; - - /** - * Name of the worker processes. - * - * @var string - */ - public $name = 'none'; - - /** - * Number of worker processes. - * - * @var int - */ - public $count = 1; - - /** - * Unix user of processes, needs appropriate privileges (usually root). - * - * @var string - */ - public $user = ''; - - /** - * Unix group of processes, needs appropriate privileges (usually root). - * - * @var string - */ - public $group = ''; - - /** - * reloadable. - * - * @var bool - */ - public $reloadable = true; - - /** - * reuse port. - * - * @var bool - */ - public $reusePort = false; - - /** - * Emitted when worker processes start. - * - * @var callable - */ - public $onWorkerStart = null; - - /** - * Emitted when a socket connection is successfully established. - * - * @var callable - */ - public $onConnect = null; - - /** - * Emitted when data is received. - * - * @var callable - */ - public $onMessage = null; - - /** - * Emitted when the other end of the socket sends a FIN packet. - * - * @var callable - */ - public $onClose = null; - - /** - * Emitted when an error occurs with connection. - * - * @var callable - */ - public $onError = null; - - /** - * Emitted when the send buffer becomes full. - * - * @var callable - */ - public $onBufferFull = null; - - /** - * Emitted when the send buffer becomes empty. - * - * @var callable - */ - public $onBufferDrain = null; - - /** - * Emitted when worker processes stoped. - * - * @var callable - */ - public $onWorkerStop = null; - - /** - * Emitted when worker processes get reload signal. - * - * @var callable - */ - public $onWorkerReload = null; - - /** - * Transport layer protocol. - * - * @var string - */ - public $transport = 'tcp'; - - /** - * Store all connections of clients. - * - * @var array - */ - public $connections = array(); - - /** - * Application layer protocol. - * - * @var string - */ - public $protocol = null; - - /** - * Root path for autoload. - * - * @var string - */ - protected $_autoloadRootPath = ''; - - /** - * Pause accept new connections or not. - * - * @var bool - */ - protected $_pauseAccept = true; - - /** - * Is worker stopping ? - * @var bool - */ - public $stopping = false; - - /** - * Daemonize. - * - * @var bool - */ - public static $daemonize = false; - - /** - * Stdout file. - * - * @var string - */ - public static $stdoutFile = '/dev/null'; - - /** - * The file to store master process PID. - * - * @var string - */ - public static $pidFile = ''; - - /** - * The file used to store the master process status file. - * - * @var string - */ - public static $statusFile = ''; - - /** - * Log file. - * - * @var mixed - */ - public static $logFile = ''; - - /** - * Global event loop. - * - * @var EventInterface - */ - public static $globalEvent = null; - - /** - * Emitted when the master process get reload signal. - * - * @var callable - */ - public static $onMasterReload = null; - - /** - * Emitted when the master process terminated. - * - * @var callable - */ - public static $onMasterStop = null; - - /** - * EventLoopClass - * - * @var string - */ - public static $eventLoopClass = ''; - - /** - * Process title - * - * @var string - */ - public static $processTitle = 'WorkerMan'; - - /** - * The PID of master process. - * - * @var int - */ - protected static $_masterPid = 0; - - /** - * Listening socket. - * - * @var resource - */ - protected $_mainSocket = null; - - /** - * Socket name. The format is like this http://0.0.0.0:80 . - * - * @var string - */ - protected $_socketName = ''; - - /** parse from _socketName avoid parse again in master or worker - * LocalSocket The format is like tcp://0.0.0.0:8080 - * @var string - */ - - protected $_localSocket=null; - - /** - * Context of socket. - * - * @var resource - */ - protected $_context = null; - - /** - * All worker instances. - * - * @var Worker[] - */ - protected static $_workers = array(); - - /** - * All worker processes pid. - * The format is like this [worker_id=>[pid=>pid, pid=>pid, ..], ..] - * - * @var array - */ - protected static $_pidMap = array(); - - /** - * All worker processes waiting for restart. - * The format is like this [pid=>pid, pid=>pid]. - * - * @var array - */ - protected static $_pidsToRestart = array(); - - /** - * Mapping from PID to worker process ID. - * The format is like this [worker_id=>[0=>$pid, 1=>$pid, ..], ..]. - * - * @var array - */ - protected static $_idMap = array(); - - /** - * Current status. - * - * @var int - */ - protected static $_status = self::STATUS_STARTING; - - /** - * Maximum length of the worker names. - * - * @var int - */ - protected static $_maxWorkerNameLength = 12; - - /** - * Maximum length of the socket names. - * - * @var int - */ - protected static $_maxSocketNameLength = 12; - - /** - * Maximum length of the process user names. - * - * @var int - */ - protected static $_maxUserNameLength = 12; - - /** - * Maximum length of the Proto names. - * - * @var int - */ - protected static $_maxProtoNameLength = 4; - - /** - * Maximum length of the Processes names. - * - * @var int - */ - protected static $_maxProcessesNameLength = 9; - - /** - * Maximum length of the Status names. - * - * @var int - */ - protected static $_maxStatusNameLength = 1; - - /** - * The file to store status info of current worker process. - * - * @var string - */ - protected static $_statisticsFile = ''; - - /** - * Start file. - * - * @var string - */ - protected static $_startFile = ''; - - /** - * OS. - * - * @var string - */ - protected static $_OS = \OS_TYPE_LINUX; - - /** - * Processes for windows. - * - * @var array - */ - protected static $_processForWindows = array(); - - /** - * Status info of current worker process. - * - * @var array - */ - protected static $_globalStatistics = array( - 'start_timestamp' => 0, - 'worker_exit_info' => array() - ); - - /** - * Available event loops. - * - * @var array - */ - protected static $_availableEventLoops = array( - 'event' => '\Workerman\Events\Event', - 'libevent' => '\Workerman\Events\Libevent' - ); - - /** - * PHP built-in protocols. - * - * @var array - */ - protected static $_builtinTransports = array( - 'tcp' => 'tcp', - 'udp' => 'udp', - 'unix' => 'unix', - 'ssl' => 'tcp' - ); - - /** - * PHP built-in error types. - * - * @var array - */ - protected static $_errorType = array( - \E_ERROR => 'E_ERROR', // 1 - \E_WARNING => 'E_WARNING', // 2 - \E_PARSE => 'E_PARSE', // 4 - \E_NOTICE => 'E_NOTICE', // 8 - \E_CORE_ERROR => 'E_CORE_ERROR', // 16 - \E_CORE_WARNING => 'E_CORE_WARNING', // 32 - \E_COMPILE_ERROR => 'E_COMPILE_ERROR', // 64 - \E_COMPILE_WARNING => 'E_COMPILE_WARNING', // 128 - \E_USER_ERROR => 'E_USER_ERROR', // 256 - \E_USER_WARNING => 'E_USER_WARNING', // 512 - \E_USER_NOTICE => 'E_USER_NOTICE', // 1024 - \E_STRICT => 'E_STRICT', // 2048 - \E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR', // 4096 - \E_DEPRECATED => 'E_DEPRECATED', // 8192 - \E_USER_DEPRECATED => 'E_USER_DEPRECATED' // 16384 - ); - - /** - * Graceful stop or not. - * - * @var bool - */ - protected static $_gracefulStop = false; - - /** - * Standard output stream - * @var resource - */ - protected static $_outputStream = null; - - /** - * If $outputStream support decorated - * @var bool - */ - protected static $_outputDecorated = null; - - /** - * Run all worker instances. - * - * @return void - */ - public static function runAll() - { - static::checkSapiEnv(); - static::init(); - static::parseCommand(); - static::daemonize(); - static::initWorkers(); - static::installSignal(); - static::saveMasterPid(); - static::displayUI(); - static::forkWorkers(); - static::resetStd(); - static::monitorWorkers(); - } - - /** - * Check sapi. - * - * @return void - */ - protected static function checkSapiEnv() - { - // Only for cli. - if (\PHP_SAPI !== 'cli') { - exit("Only run in command line mode \n"); - } - if (\DIRECTORY_SEPARATOR === '\\') { - self::$_OS = \OS_TYPE_WINDOWS; - } - } - - /** - * Init. - * - * @return void - */ - protected static function init() - { - \set_error_handler(function($code, $msg, $file, $line){ - Worker::safeEcho("$msg in file $file on line $line\n"); - }); - - // Start file. - $backtrace = \debug_backtrace(); - static::$_startFile = $backtrace[\count($backtrace) - 1]['file']; - - - $unique_prefix = \str_replace('/', '_', static::$_startFile); - - // Pid file. - if (empty(static::$pidFile)) { - static::$pidFile = __DIR__ . "/../$unique_prefix.pid"; - } - - // Log file. - if (empty(static::$logFile)) { - static::$logFile = __DIR__ . '/../workerman.log'; - } - $log_file = (string)static::$logFile; - if (!\is_file($log_file)) { - \touch($log_file); - \chmod($log_file, 0622); - } - - // State. - static::$_status = static::STATUS_STARTING; - - // For statistics. - static::$_globalStatistics['start_timestamp'] = \time(); - - // Process title. - static::setProcessTitle(static::$processTitle . ': master process start_file=' . static::$_startFile); - - // Init data for worker id. - static::initId(); - - // Timer init. - Timer::init(); - } - - /** - * Lock. - * - * @return void - */ - protected static function lock() - { - $fd = \fopen(static::$_startFile, 'r'); - if ($fd && !flock($fd, LOCK_EX)) { - static::log('Workerman['.static::$_startFile.'] already running.'); - exit; - } - } - - /** - * Unlock. - * - * @return void - */ - protected static function unlock() - { - $fd = \fopen(static::$_startFile, 'r'); - $fd && flock($fd, \LOCK_UN); - } - - /** - * Init All worker instances. - * - * @return void - */ - protected static function initWorkers() - { - if (static::$_OS !== \OS_TYPE_LINUX) { - return; - } - - static::$_statisticsFile = static::$statusFile ? static::$statusFile : __DIR__ . '/../workerman-' .posix_getpid().'.status'; - - foreach (static::$_workers as $worker) { - // Worker name. - if (empty($worker->name)) { - $worker->name = 'none'; - } - - // Get unix user of the worker process. - if (empty($worker->user)) { - $worker->user = static::getCurrentUser(); - } else { - if (\posix_getuid() !== 0 && $worker->user !== static::getCurrentUser()) { - static::log('Warning: You must have the root privileges to change uid and gid.'); - } - } - - // Socket name. - $worker->socket = $worker->getSocketName(); - - // Status name. - $worker->status = ' [OK] '; - - // Get column mapping for UI - foreach(static::getUiColumns() as $column_name => $prop){ - !isset($worker->{$prop}) && $worker->{$prop} = 'NNNN'; - $prop_length = \strlen($worker->{$prop}); - $key = '_max' . \ucfirst(\strtolower($column_name)) . 'NameLength'; - static::$$key = \max(static::$$key, $prop_length); - } - - // Listen. - if (!$worker->reusePort) { - $worker->listen(); - } - } - } - - /** - * Reload all worker instances. - * - * @return void - */ - public static function reloadAllWorkers() - { - static::init(); - static::initWorkers(); - static::displayUI(); - static::$_status = static::STATUS_RELOADING; - } - - /** - * Get all worker instances. - * - * @return array - */ - public static function getAllWorkers() - { - return static::$_workers; - } - - /** - * Get global event-loop instance. - * - * @return EventInterface - */ - public static function getEventLoop() - { - return static::$globalEvent; - } - - /** - * Get main socket resource - * @return resource - */ - public function getMainSocket(){ - return $this->_mainSocket; - } - - /** - * Init idMap. - * return void - */ - protected static function initId() - { - foreach (static::$_workers as $worker_id => $worker) { - $new_id_map = array(); - $worker->count = $worker->count < 1 ? 1 : $worker->count; - for($key = 0; $key < $worker->count; $key++) { - $new_id_map[$key] = isset(static::$_idMap[$worker_id][$key]) ? static::$_idMap[$worker_id][$key] : 0; - } - static::$_idMap[$worker_id] = $new_id_map; - } - } - - /** - * Get unix user of current porcess. - * - * @return string - */ - protected static function getCurrentUser() - { - $user_info = \posix_getpwuid(\posix_getuid()); - return $user_info['name']; - } - - /** - * Display staring UI. - * - * @return void - */ - protected static function displayUI() - { - global $argv; - if (\in_array('-q', $argv)) { - return; - } - if (static::$_OS !== \OS_TYPE_LINUX) { - static::safeEcho("----------------------- WORKERMAN -----------------------------\r\n"); - static::safeEcho('Workerman version:'. static::VERSION. ' PHP version:'. \PHP_VERSION. "\r\n"); - static::safeEcho("------------------------ WORKERS -------------------------------\r\n"); - static::safeEcho("worker listen processes status\r\n"); - return; - } - - //show version - $line_version = 'Workerman version:' . static::VERSION . \str_pad('PHP version:', 22, ' ', \STR_PAD_LEFT) . \PHP_VERSION . \PHP_EOL; - !\defined('LINE_VERSIOIN_LENGTH') && \define('LINE_VERSIOIN_LENGTH', \strlen($line_version)); - $total_length = static::getSingleLineTotalLength(); - $line_one = '' . \str_pad(' WORKERMAN ', $total_length + \strlen(''), '-', \STR_PAD_BOTH) . ''. \PHP_EOL; - $line_two = \str_pad(' WORKERS ' , $total_length + \strlen(''), '-', \STR_PAD_BOTH) . \PHP_EOL; - static::safeEcho($line_one . $line_version . $line_two); - - //Show title - $title = ''; - foreach(static::getUiColumns() as $column_name => $prop){ - $key = '_max' . \ucfirst(\strtolower($column_name)) . 'NameLength'; - //just keep compatible with listen name - $column_name === 'socket' && $column_name = 'listen'; - $title.= "{$column_name}" . \str_pad('', static::$$key + static::UI_SAFE_LENGTH - \strlen($column_name)); - } - $title && static::safeEcho($title . \PHP_EOL); - - //Show content - foreach (static::$_workers as $worker) { - $content = ''; - foreach(static::getUiColumns() as $column_name => $prop){ - $key = '_max' . \ucfirst(\strtolower($column_name)) . 'NameLength'; - \preg_match_all("/(|<\/n>||<\/w>||<\/g>)/is", $worker->{$prop}, $matches); - $place_holder_length = !empty($matches) ? \strlen(\implode('', $matches[0])) : 0; - $content .= \str_pad($worker->{$prop}, static::$$key + static::UI_SAFE_LENGTH + $place_holder_length); - } - $content && static::safeEcho($content . \PHP_EOL); - } - - //Show last line - $line_last = \str_pad('', static::getSingleLineTotalLength(), '-') . \PHP_EOL; - !empty($content) && static::safeEcho($line_last); - - if (static::$daemonize) { - $tmpArgv = $argv; - foreach ($tmpArgv as $index => $value) { - if ($value == '-d') { - unset($tmpArgv[$index]); - } elseif ($value == 'start' || $value == 'restart') { - $tmpArgv[$index] = 'stop'; - } - } - static::safeEcho("Input \"php ".implode(' ', $tmpArgv)."\" to stop. Start success.\n\n"); - } else { - static::safeEcho("Press Ctrl+C to stop. Start success.\n"); - } - } - - /** - * Get UI columns to be shown in terminal - * - * 1. $column_map: array('ui_column_name' => 'clas_property_name') - * 2. Consider move into configuration in future - * - * @return array - */ - public static function getUiColumns() - { - return array( - 'proto' => 'transport', - 'user' => 'user', - 'worker' => 'name', - 'socket' => 'socket', - 'processes' => 'count', - 'status' => 'status', - ); - } - - /** - * Get single line total length for ui - * - * @return int - */ - public static function getSingleLineTotalLength() - { - $total_length = 0; - - foreach(static::getUiColumns() as $column_name => $prop){ - $key = '_max' . \ucfirst(\strtolower($column_name)) . 'NameLength'; - $total_length += static::$$key + static::UI_SAFE_LENGTH; - } - - //keep beauty when show less colums - !\defined('LINE_VERSIOIN_LENGTH') && \define('LINE_VERSIOIN_LENGTH', 0); - $total_length <= LINE_VERSIOIN_LENGTH && $total_length = LINE_VERSIOIN_LENGTH; - - return $total_length; - } - - /** - * Parse command. - * - * @return void - */ - protected static function parseCommand() - { - if (static::$_OS !== \OS_TYPE_LINUX) { - return; - } - global $argv; - // Check argv; - $start_file = $argv[0]; - $usage = "Usage: php yourfile [mode]\nCommands: \nstart\t\tStart worker in DEBUG mode.\n\t\tUse mode -d to start in DAEMON mode.\nstop\t\tStop worker.\n\t\tUse mode -g to stop gracefully.\nrestart\t\tRestart workers.\n\t\tUse mode -d to start in DAEMON mode.\n\t\tUse mode -g to stop gracefully.\nreload\t\tReload codes.\n\t\tUse mode -g to reload gracefully.\nstatus\t\tGet worker status.\n\t\tUse mode -d to show live status.\nconnections\tGet worker connections.\n"; - $available_commands = array( - 'start', - 'stop', - 'restart', - 'reload', - 'status', - 'connections', - ); - $available_mode = array( - '-d', - '-g' - ); - $command = $mode = ''; - foreach ($argv as $value) { - if (\in_array($value, $available_commands)) { - $command = $value; - } elseif (\in_array($value, $available_mode)) { - $mode = $value; - } - } - - if (!$command) { - exit($usage); - } - - // Start command. - $mode_str = ''; - if ($command === 'start') { - if ($mode === '-d' || static::$daemonize) { - $mode_str = 'in DAEMON mode'; - } else { - $mode_str = 'in DEBUG mode'; - } - } - static::log("Workerman[$start_file] $command $mode_str"); - - // Get master process PID. - $master_pid = \is_file(static::$pidFile) ? (int)\file_get_contents(static::$pidFile) : 0; - // Master is still alive? - if (static::checkMasterIsAlive($master_pid)) { - if ($command === 'start') { - static::log("Workerman[$start_file] already running"); - exit; - } - } elseif ($command !== 'start' && $command !== 'restart') { - static::log("Workerman[$start_file] not run"); - exit; - } - - $statistics_file = static::$statusFile ? static::$statusFile : __DIR__ . "/../workerman-$master_pid.status"; - - // execute command. - switch ($command) { - case 'start': - if ($mode === '-d') { - static::$daemonize = true; - } - break; - case 'status': - while (1) { - if (\is_file($statistics_file)) { - @\unlink($statistics_file); - } - // Master process will send SIGUSR2 signal to all child processes. - \posix_kill($master_pid, SIGUSR2); - // Sleep 1 second. - \sleep(1); - // Clear terminal. - if ($mode === '-d') { - static::safeEcho("\33[H\33[2J\33(B\33[m", true); - } - // Echo status data. - static::safeEcho(static::formatStatusData($statistics_file)); - if ($mode !== '-d') { - exit(0); - } - static::safeEcho("\nPress Ctrl+C to quit.\n\n"); - } - exit(0); - case 'connections': - if (\is_file($statistics_file) && \is_writable($statistics_file)) { - \unlink($statistics_file); - } - // Master process will send SIGIO signal to all child processes. - \posix_kill($master_pid, SIGIO); - // Waiting amoment. - \usleep(500000); - // Display statisitcs data from a disk file. - if(\is_readable($statistics_file)) { - \readfile($statistics_file); - } - exit(0); - case 'restart': - case 'stop': - if ($mode === '-g') { - static::$_gracefulStop = true; - $sig = \SIGHUP; - static::log("Workerman[$start_file] is gracefully stopping ..."); - } else { - static::$_gracefulStop = false; - $sig = \SIGINT; - static::log("Workerman[$start_file] is stopping ..."); - } - // Send stop signal to master process. - $master_pid && \posix_kill($master_pid, $sig); - // Timeout. - $timeout = 5; - $start_time = \time(); - // Check master process is still alive? - while (1) { - $master_is_alive = $master_pid && \posix_kill((int) $master_pid, 0); - if ($master_is_alive) { - // Timeout? - if (!static::$_gracefulStop && \time() - $start_time >= $timeout) { - static::log("Workerman[$start_file] stop fail"); - exit; - } - // Waiting amoment. - \usleep(10000); - continue; - } - // Stop success. - static::log("Workerman[$start_file] stop success"); - if ($command === 'stop') { - exit(0); - } - if ($mode === '-d') { - static::$daemonize = true; - } - break; - } - break; - case 'reload': - if($mode === '-g'){ - $sig = \SIGQUIT; - }else{ - $sig = \SIGUSR1; - } - \posix_kill($master_pid, $sig); - exit; - default : - if (isset($command)) { - static::safeEcho('Unknown command: ' . $command . "\n"); - } - exit($usage); - } - } - - /** - * Format status data. - * - * @param $statistics_file - * @return string - */ - protected static function formatStatusData($statistics_file) - { - static $total_request_cache = array(); - if (!\is_readable($statistics_file)) { - return ''; - } - $info = \file($statistics_file, \FILE_IGNORE_NEW_LINES); - if (!$info) { - return ''; - } - $status_str = ''; - $current_total_request = array(); - $worker_info = \unserialize($info[0]); - \ksort($worker_info, SORT_NUMERIC); - unset($info[0]); - $data_waiting_sort = array(); - $read_process_status = false; - $total_requests = 0; - $total_qps = 0; - $total_connections = 0; - $total_fails = 0; - $total_memory = 0; - $total_timers = 0; - $maxLen1 = static::$_maxSocketNameLength; - $maxLen2 = static::$_maxWorkerNameLength; - foreach($info as $key => $value) { - if (!$read_process_status) { - $status_str .= $value . "\n"; - if (\preg_match('/^pid.*?memory.*?listening/', $value)) { - $read_process_status = true; - } - continue; - } - if(\preg_match('/^[0-9]+/', $value, $pid_math)) { - $pid = $pid_math[0]; - $data_waiting_sort[$pid] = $value; - if(\preg_match('/^\S+?\s+?(\S+?)\s+?(\S+?)\s+?(\S+?)\s+?(\S+?)\s+?(\S+?)\s+?(\S+?)\s+?(\S+?)\s+?/', $value, $match)) { - $total_memory += \intval(\str_ireplace('M','',$match[1])); - $maxLen1 = \max($maxLen1,\strlen($match[2])); - $maxLen2 = \max($maxLen2,\strlen($match[3])); - $total_connections += \intval($match[4]); - $total_fails += \intval($match[5]); - $total_timers += \intval($match[6]); - $current_total_request[$pid] = $match[7]; - $total_requests += \intval($match[7]); - } - } - } - foreach($worker_info as $pid => $info) { - if (!isset($data_waiting_sort[$pid])) { - $status_str .= "$pid\t" . \str_pad('N/A', 7) . " " - . \str_pad($info['listen'], static::$_maxSocketNameLength) . " " - . \str_pad($info['name'], static::$_maxWorkerNameLength) . " " - . \str_pad('N/A', 11) . " " . \str_pad('N/A', 9) . " " - . \str_pad('N/A', 7) . " " . \str_pad('N/A', 13) . " N/A [busy] \n"; - continue; - } - //$qps = isset($total_request_cache[$pid]) ? $current_total_request[$pid] - if (!isset($total_request_cache[$pid]) || !isset($current_total_request[$pid])) { - $qps = 0; - } else { - $qps = $current_total_request[$pid] - $total_request_cache[$pid]; - $total_qps += $qps; - } - $status_str .= $data_waiting_sort[$pid]. " " . \str_pad($qps, 6) ." [idle]\n"; - } - $total_request_cache = $current_total_request; - $status_str .= "----------------------------------------------PROCESS STATUS---------------------------------------------------\n"; - $status_str .= "Summary\t" . \str_pad($total_memory.'M', 7) . " " - . \str_pad('-', $maxLen1) . " " - . \str_pad('-', $maxLen2) . " " - . \str_pad($total_connections, 11) . " " . \str_pad($total_fails, 9) . " " - . \str_pad($total_timers, 7) . " " . \str_pad($total_requests, 13) . " " - . \str_pad($total_qps,6)." [Summary] \n"; - return $status_str; - } - - - /** - * Install signal handler. - * - * @return void - */ - protected static function installSignal() - { - if (static::$_OS !== \OS_TYPE_LINUX) { - return; - } - $signalHandler = '\Workerman\Worker::signalHandler'; - // stop - \pcntl_signal(\SIGINT, $signalHandler, false); - // stop - \pcntl_signal(\SIGTERM, $signalHandler, false); - // graceful stop - \pcntl_signal(\SIGHUP, $signalHandler, false); - // reload - \pcntl_signal(\SIGUSR1, $signalHandler, false); - // graceful reload - \pcntl_signal(\SIGQUIT, $signalHandler, false); - // status - \pcntl_signal(\SIGUSR2, $signalHandler, false); - // connection status - \pcntl_signal(\SIGIO, $signalHandler, false); - // ignore - \pcntl_signal(\SIGPIPE, \SIG_IGN, false); - } - - /** - * Reinstall signal handler. - * - * @return void - */ - protected static function reinstallSignal() - { - if (static::$_OS !== \OS_TYPE_LINUX) { - return; - } - $signalHandler = '\Workerman\Worker::signalHandler'; - // uninstall stop signal handler - \pcntl_signal(\SIGINT, \SIG_IGN, false); - // uninstall stop signal handler - \pcntl_signal(\SIGTERM, \SIG_IGN, false); - // uninstall graceful stop signal handler - \pcntl_signal(\SIGHUP, \SIG_IGN, false); - // uninstall reload signal handler - \pcntl_signal(\SIGUSR1, \SIG_IGN, false); - // uninstall graceful reload signal handler - \pcntl_signal(\SIGQUIT, \SIG_IGN, false); - // uninstall status signal handler - \pcntl_signal(\SIGUSR2, \SIG_IGN, false); - // uninstall connections status signal handler - \pcntl_signal(\SIGIO, \SIG_IGN, false); - // reinstall stop signal handler - static::$globalEvent->add(\SIGINT, EventInterface::EV_SIGNAL, $signalHandler); - // reinstall graceful stop signal handler - static::$globalEvent->add(\SIGHUP, EventInterface::EV_SIGNAL, $signalHandler); - // reinstall reload signal handler - static::$globalEvent->add(\SIGUSR1, EventInterface::EV_SIGNAL, $signalHandler); - // reinstall graceful reload signal handler - static::$globalEvent->add(\SIGQUIT, EventInterface::EV_SIGNAL, $signalHandler); - // reinstall status signal handler - static::$globalEvent->add(\SIGUSR2, EventInterface::EV_SIGNAL, $signalHandler); - // reinstall connection status signal handler - static::$globalEvent->add(\SIGIO, EventInterface::EV_SIGNAL, $signalHandler); - } - - /** - * Signal handler. - * - * @param int $signal - */ - public static function signalHandler($signal) - { - switch ($signal) { - // Stop. - case \SIGINT: - case \SIGTERM: - static::$_gracefulStop = false; - static::stopAll(); - break; - // Graceful stop. - case \SIGHUP: - static::$_gracefulStop = true; - static::stopAll(); - break; - // Reload. - case \SIGQUIT: - case \SIGUSR1: - static::$_gracefulStop = $signal === \SIGQUIT; - static::$_pidsToRestart = static::getAllWorkerPids(); - static::reload(); - break; - // Show status. - case \SIGUSR2: - static::writeStatisticsToStatusFile(); - break; - // Show connection status. - case \SIGIO: - static::writeConnectionsStatisticsToStatusFile(); - break; - } - } - - /** - * Run as daemon mode. - * - * @throws Exception - */ - protected static function daemonize() - { - if (!static::$daemonize || static::$_OS !== \OS_TYPE_LINUX) { - return; - } - \umask(0); - $pid = \pcntl_fork(); - if (-1 === $pid) { - throw new Exception('Fork fail'); - } elseif ($pid > 0) { - exit(0); - } - if (-1 === \posix_setsid()) { - throw new Exception("Setsid fail"); - } - // Fork again avoid SVR4 system regain the control of terminal. - $pid = \pcntl_fork(); - if (-1 === $pid) { - throw new Exception("Fork fail"); - } elseif (0 !== $pid) { - exit(0); - } - } - - /** - * Redirect standard input and output. - * - * @throws Exception - */ - public static function resetStd() - { - if (!static::$daemonize || static::$_OS !== \OS_TYPE_LINUX) { - return; - } - global $STDOUT, $STDERR; - $handle = \fopen(static::$stdoutFile, "a"); - if ($handle) { - unset($handle); - \set_error_handler(function(){}); - if ($STDOUT) { - \fclose($STDOUT); - } - if ($STDERR) { - \fclose($STDERR); - } - \fclose(\STDOUT); - \fclose(\STDERR); - $STDOUT = \fopen(static::$stdoutFile, "a"); - $STDERR = \fopen(static::$stdoutFile, "a"); - // change output stream - static::$_outputStream = null; - static::outputStream($STDOUT); - \restore_error_handler(); - return; - } - - throw new Exception('Can not open stdoutFile ' . static::$stdoutFile); - } - - /** - * Save pid. - * - * @throws Exception - */ - protected static function saveMasterPid() - { - if (static::$_OS !== \OS_TYPE_LINUX) { - return; - } - - static::$_masterPid = \posix_getpid(); - if (false === \file_put_contents(static::$pidFile, static::$_masterPid)) { - throw new Exception('can not save pid to ' . static::$pidFile); - } - } - - /** - * Get event loop name. - * - * @return string - */ - protected static function getEventLoopName() - { - if (static::$eventLoopClass) { - return static::$eventLoopClass; - } - - if (!\class_exists('\Swoole\Event', false)) { - unset(static::$_availableEventLoops['swoole']); - } - - $loop_name = ''; - foreach (static::$_availableEventLoops as $name=>$class) { - if (\extension_loaded($name)) { - $loop_name = $name; - break; - } - } - - if ($loop_name) { - static::$eventLoopClass = static::$_availableEventLoops[$loop_name]; - } else { - static::$eventLoopClass = '\Workerman\Events\Select'; - } - return static::$eventLoopClass; - } - - /** - * Get all pids of worker processes. - * - * @return array - */ - protected static function getAllWorkerPids() - { - $pid_array = array(); - foreach (static::$_pidMap as $worker_pid_array) { - foreach ($worker_pid_array as $worker_pid) { - $pid_array[$worker_pid] = $worker_pid; - } - } - return $pid_array; - } - - /** - * Fork some worker processes. - * - * @return void - */ - protected static function forkWorkers() - { - if (static::$_OS === \OS_TYPE_LINUX) { - static::forkWorkersForLinux(); - } else { - static::forkWorkersForWindows(); - } - } - - /** - * Fork some worker processes. - * - * @return void - */ - protected static function forkWorkersForLinux() - { - - foreach (static::$_workers as $worker) { - if (static::$_status === static::STATUS_STARTING) { - if (empty($worker->name)) { - $worker->name = $worker->getSocketName(); - } - $worker_name_length = \strlen($worker->name); - if (static::$_maxWorkerNameLength < $worker_name_length) { - static::$_maxWorkerNameLength = $worker_name_length; - } - } - - while (\count(static::$_pidMap[$worker->workerId]) < $worker->count) { - static::forkOneWorkerForLinux($worker); - } - } - } - - /** - * Fork some worker processes. - * - * @return void - */ - protected static function forkWorkersForWindows() - { - $files = static::getStartFilesForWindows(); - global $argv; - if(\in_array('-q', $argv) || \count($files) === 1) - { - if(\count(static::$_workers) > 1) - { - static::safeEcho("@@@ Error: multi workers init in one php file are not support @@@\r\n"); - static::safeEcho("@@@ See http://doc.workerman.net/faq/multi-woker-for-windows.html @@@\r\n"); - } - elseif(\count(static::$_workers) <= 0) - { - exit("@@@no worker inited@@@\r\n\r\n"); - } - - \reset(static::$_workers); - /** @var Worker $worker */ - $worker = current(static::$_workers); - - // Display UI. - static::safeEcho(\str_pad($worker->name, 30) . \str_pad($worker->getSocketName(), 36) . \str_pad($worker->count, 10) . "[ok]\n"); - $worker->listen(); - $worker->run(); - exit("@@@child exit@@@\r\n"); - } - else - { - static::$globalEvent = new \Workerman\Events\Select(); - Timer::init(static::$globalEvent); - foreach($files as $start_file) - { - static::forkOneWorkerForWindows($start_file); - } - } - } - - /** - * Get start files for windows. - * - * @return array - */ - public static function getStartFilesForWindows() { - global $argv; - $files = array(); - foreach($argv as $file) - { - if(\is_file($file)) - { - $files[$file] = $file; - } - } - return $files; - } - - /** - * Fork one worker process. - * - * @param string $start_file - */ - public static function forkOneWorkerForWindows($start_file) - { - $start_file = \realpath($start_file); - - $descriptorspec = array( - STDIN, STDOUT, STDOUT - ); - - $pipes = array(); - $process = \proc_open("php \"$start_file\" -q", $descriptorspec, $pipes); - - if (empty(static::$globalEvent)) { - static::$globalEvent = new Select(); - Timer::init(static::$globalEvent); - } - - // 保存子进程句柄 - static::$_processForWindows[$start_file] = array($process, $start_file); - } - - /** - * check worker status for windows. - * @return void - */ - public static function checkWorkerStatusForWindows() - { - foreach(static::$_processForWindows as $process_data) - { - $process = $process_data[0]; - $start_file = $process_data[1]; - $status = \proc_get_status($process); - if(isset($status['running'])) - { - if(!$status['running']) - { - static::safeEcho("process $start_file terminated and try to restart\n"); - \proc_close($process); - static::forkOneWorkerForWindows($start_file); - } - } - else - { - static::safeEcho("proc_get_status fail\n"); - } - } - } - - - /** - * Fork one worker process. - * - * @param self $worker - * @throws Exception - */ - protected static function forkOneWorkerForLinux(self $worker) - { - // Get available worker id. - $id = static::getId($worker->workerId, 0); - if ($id === false) { - return; - } - $pid = \pcntl_fork(); - // For master process. - if ($pid > 0) { - static::$_pidMap[$worker->workerId][$pid] = $pid; - static::$_idMap[$worker->workerId][$id] = $pid; - } // For child processes. - elseif (0 === $pid) { - \srand(); - \mt_srand(); - if ($worker->reusePort) { - $worker->listen(); - } - if (static::$_status === static::STATUS_STARTING) { - static::resetStd(); - } - static::$_pidMap = array(); - // Remove other listener. - foreach(static::$_workers as $key => $one_worker) { - if ($one_worker->workerId !== $worker->workerId) { - $one_worker->unlisten(); - unset(static::$_workers[$key]); - } - } - Timer::delAll(); - static::setProcessTitle(self::$processTitle . ': worker process ' . $worker->name . ' ' . $worker->getSocketName()); - $worker->setUserAndGroup(); - $worker->id = $id; - $worker->run(); - if (strpos(static::$eventLoopClass, 'Workerman\Events\Swoole') !== false) { - exit(0); - } - $err = new Exception('event-loop exited'); - static::log($err); - exit(250); - } else { - throw new Exception("forkOneWorker fail"); - } - } - - /** - * Get worker id. - * - * @param int $worker_id - * @param int $pid - * - * @return integer - */ - protected static function getId($worker_id, $pid) - { - return \array_search($pid, static::$_idMap[$worker_id]); - } - - /** - * Set unix user and group for current process. - * - * @return void - */ - public function setUserAndGroup() - { - // Get uid. - $user_info = \posix_getpwnam($this->user); - if (!$user_info) { - static::log("Warning: User {$this->user} not exsits"); - return; - } - $uid = $user_info['uid']; - // Get gid. - if ($this->group) { - $group_info = \posix_getgrnam($this->group); - if (!$group_info) { - static::log("Warning: Group {$this->group} not exsits"); - return; - } - $gid = $group_info['gid']; - } else { - $gid = $user_info['gid']; - } - - // Set uid and gid. - if ($uid !== \posix_getuid() || $gid !== \posix_getgid()) { - if (!\posix_setgid($gid) || !\posix_initgroups($user_info['name'], $gid) || !\posix_setuid($uid)) { - static::log("Warning: change gid or uid fail."); - } - } - } - - /** - * Set process name. - * - * @param string $title - * @return void - */ - protected static function setProcessTitle($title) - { - \set_error_handler(function(){}); - // >=php 5.5 - if (\function_exists('cli_set_process_title')) { - \cli_set_process_title($title); - } // Need proctitle when php<=5.5 . - elseif (\extension_loaded('proctitle') && \function_exists('setproctitle')) { - \setproctitle($title); - } - \restore_error_handler(); - } - - /** - * Monitor all child processes. - * - * @return void - */ - protected static function monitorWorkers() - { - if (static::$_OS === \OS_TYPE_LINUX) { - static::monitorWorkersForLinux(); - } else { - static::monitorWorkersForWindows(); - } - } - - /** - * Monitor all child processes. - * - * @return void - */ - protected static function monitorWorkersForLinux() - { - static::$_status = static::STATUS_RUNNING; - while (1) { - // Calls signal handlers for pending signals. - \pcntl_signal_dispatch(); - // Suspends execution of the current process until a child has exited, or until a signal is delivered - $status = 0; - $pid = \pcntl_wait($status, \WUNTRACED); - // Calls signal handlers for pending signals again. - \pcntl_signal_dispatch(); - // If a child has already exited. - if ($pid > 0) { - // Find out which worker process exited. - foreach (static::$_pidMap as $worker_id => $worker_pid_array) { - if (isset($worker_pid_array[$pid])) { - $worker = static::$_workers[$worker_id]; - // Exit status. - if ($status !== 0) { - static::log("worker[" . $worker->name . ":$pid] exit with status $status"); - } - - // For Statistics. - if (!isset(static::$_globalStatistics['worker_exit_info'][$worker_id][$status])) { - static::$_globalStatistics['worker_exit_info'][$worker_id][$status] = 0; - } - ++static::$_globalStatistics['worker_exit_info'][$worker_id][$status]; - - // Clear process data. - unset(static::$_pidMap[$worker_id][$pid]); - - // Mark id is available. - $id = static::getId($worker_id, $pid); - static::$_idMap[$worker_id][$id] = 0; - - break; - } - } - // Is still running state then fork a new worker process. - if (static::$_status !== static::STATUS_SHUTDOWN) { - static::forkWorkers(); - // If reloading continue. - if (isset(static::$_pidsToRestart[$pid])) { - unset(static::$_pidsToRestart[$pid]); - static::reload(); - } - } - } - - // If shutdown state and all child processes exited then master process exit. - if (static::$_status === static::STATUS_SHUTDOWN && !static::getAllWorkerPids()) { - static::exitAndClearAll(); - } - } - } - - /** - * Monitor all child processes. - * - * @return void - */ - protected static function monitorWorkersForWindows() - { - Timer::add(1, "\\Workerman\\Worker::checkWorkerStatusForWindows"); - - static::$globalEvent->loop(); - } - - /** - * Exit current process. - * - * @return void - */ - protected static function exitAndClearAll() - { - foreach (static::$_workers as $worker) { - $socket_name = $worker->getSocketName(); - if ($worker->transport === 'unix' && $socket_name) { - list(, $address) = \explode(':', $socket_name, 2); - $address = substr($address, strpos($address, '/') + 2); - @\unlink($address); - } - } - @\unlink(static::$pidFile); - static::log("Workerman[" . \basename(static::$_startFile) . "] has been stopped"); - if (static::$onMasterStop) { - \call_user_func(static::$onMasterStop); - } - exit(0); - } - - /** - * Execute reload. - * - * @return void - */ - protected static function reload() - { - // For master process. - if (static::$_masterPid === \posix_getpid()) { - // Set reloading state. - if (static::$_status !== static::STATUS_RELOADING && static::$_status !== static::STATUS_SHUTDOWN) { - static::log("Workerman[" . \basename(static::$_startFile) . "] reloading"); - static::$_status = static::STATUS_RELOADING; - // Try to emit onMasterReload callback. - if (static::$onMasterReload) { - try { - \call_user_func(static::$onMasterReload); - } catch (\Exception $e) { - static::stopAll(250, $e); - } catch (\Error $e) { - static::stopAll(250, $e); - } - static::initId(); - } - } - - if (static::$_gracefulStop) { - $sig = \SIGQUIT; - } else { - $sig = \SIGUSR1; - } - - // Send reload signal to all child processes. - $reloadable_pid_array = array(); - foreach (static::$_pidMap as $worker_id => $worker_pid_array) { - $worker = static::$_workers[$worker_id]; - if ($worker->reloadable) { - foreach ($worker_pid_array as $pid) { - $reloadable_pid_array[$pid] = $pid; - } - } else { - foreach ($worker_pid_array as $pid) { - // Send reload signal to a worker process which reloadable is false. - \posix_kill($pid, $sig); - } - } - } - - // Get all pids that are waiting reload. - static::$_pidsToRestart = \array_intersect(static::$_pidsToRestart, $reloadable_pid_array); - - // Reload complete. - if (empty(static::$_pidsToRestart)) { - if (static::$_status !== static::STATUS_SHUTDOWN) { - static::$_status = static::STATUS_RUNNING; - } - return; - } - // Continue reload. - $one_worker_pid = \current(static::$_pidsToRestart); - // Send reload signal to a worker process. - \posix_kill($one_worker_pid, $sig); - // If the process does not exit after static::KILL_WORKER_TIMER_TIME seconds try to kill it. - if(!static::$_gracefulStop){ - Timer::add(static::KILL_WORKER_TIMER_TIME, '\posix_kill', array($one_worker_pid, \SIGKILL), false); - } - } // For child processes. - else { - \reset(static::$_workers); - $worker = \current(static::$_workers); - // Try to emit onWorkerReload callback. - if ($worker->onWorkerReload) { - try { - \call_user_func($worker->onWorkerReload, $worker); - } catch (\Exception $e) { - static::stopAll(250, $e); - } catch (\Error $e) { - static::stopAll(250, $e); - } - } - - if ($worker->reloadable) { - static::stopAll(); - } - } - } - - /** - * Stop all. - * - * @param int $code - * @param string $log - */ - public static function stopAll($code = 0, $log = '') - { - if ($log) { - static::log($log); - } - - static::$_status = static::STATUS_SHUTDOWN; - // For master process. - if (static::$_masterPid === \posix_getpid()) { - static::log("Workerman[" . \basename(static::$_startFile) . "] stopping ..."); - $worker_pid_array = static::getAllWorkerPids(); - // Send stop signal to all child processes. - if (static::$_gracefulStop) { - $sig = \SIGHUP; - } else { - $sig = \SIGINT; - } - foreach ($worker_pid_array as $worker_pid) { - \posix_kill($worker_pid, $sig); - if(!static::$_gracefulStop){ - Timer::add(static::KILL_WORKER_TIMER_TIME, '\posix_kill', array($worker_pid, \SIGKILL), false); - } - } - Timer::add(1, "\\Workerman\\Worker::checkIfChildRunning"); - // Remove statistics file. - if (\is_file(static::$_statisticsFile)) { - @\unlink(static::$_statisticsFile); - } - } // For child processes. - else { - // Execute exit. - foreach (static::$_workers as $worker) { - if(!$worker->stopping){ - $worker->stop(); - $worker->stopping = true; - } - } - if (!static::$_gracefulStop || ConnectionInterface::$statistics['connection_count'] <= 0) { - static::$_workers = array(); - if (static::$globalEvent) { - static::$globalEvent->destroy(); - } - - try { - exit($code); - } catch (Exception $e) { - - } - } - } - } - - /** - * check if child processes is really running - */ - public static function checkIfChildRunning() - { - foreach (static::$_pidMap as $worker_id => $worker_pid_array) { - foreach ($worker_pid_array as $pid => $worker_pid) { - if (!\posix_kill($pid, 0)) { - unset(static::$_pidMap[$worker_id][$pid]); - } - } - } - } - - /** - * Get process status. - * - * @return number - */ - public static function getStatus() - { - return static::$_status; - } - - /** - * If stop gracefully. - * - * @return bool - */ - public static function getGracefulStop() - { - return static::$_gracefulStop; - } - - /** - * Write statistics data to disk. - * - * @return void - */ - protected static function writeStatisticsToStatusFile() - { - // For master process. - if (static::$_masterPid === \posix_getpid()) { - $all_worker_info = array(); - foreach(static::$_pidMap as $worker_id => $pid_array) { - /** @var /Workerman/Worker $worker */ - $worker = static::$_workers[$worker_id]; - foreach($pid_array as $pid) { - $all_worker_info[$pid] = array('name' => $worker->name, 'listen' => $worker->getSocketName()); - } - } - - \file_put_contents(static::$_statisticsFile, \serialize($all_worker_info)."\n", \FILE_APPEND); - $loadavg = \function_exists('sys_getloadavg') ? \array_map('round', \sys_getloadavg(), array(2,2,2)) : array('-', '-', '-'); - \file_put_contents(static::$_statisticsFile, - "----------------------------------------------GLOBAL STATUS----------------------------------------------------\n", \FILE_APPEND); - \file_put_contents(static::$_statisticsFile, - 'Workerman version:' . static::VERSION . " PHP version:" . \PHP_VERSION . "\n", \FILE_APPEND); - \file_put_contents(static::$_statisticsFile, 'start time:' . \date('Y-m-d H:i:s', - static::$_globalStatistics['start_timestamp']) . ' run ' . \floor((\time() - static::$_globalStatistics['start_timestamp']) / (24 * 60 * 60)) . ' days ' . \floor(((\time() - static::$_globalStatistics['start_timestamp']) % (24 * 60 * 60)) / (60 * 60)) . " hours \n", - FILE_APPEND); - $load_str = 'load average: ' . \implode(", ", $loadavg); - \file_put_contents(static::$_statisticsFile, - \str_pad($load_str, 33) . 'event-loop:' . static::getEventLoopName() . "\n", \FILE_APPEND); - \file_put_contents(static::$_statisticsFile, - \count(static::$_pidMap) . ' workers ' . \count(static::getAllWorkerPids()) . " processes\n", - \FILE_APPEND); - \file_put_contents(static::$_statisticsFile, - \str_pad('worker_name', static::$_maxWorkerNameLength) . " exit_status exit_count\n", \FILE_APPEND); - foreach (static::$_pidMap as $worker_id => $worker_pid_array) { - $worker = static::$_workers[$worker_id]; - if (isset(static::$_globalStatistics['worker_exit_info'][$worker_id])) { - foreach (static::$_globalStatistics['worker_exit_info'][$worker_id] as $worker_exit_status => $worker_exit_count) { - \file_put_contents(static::$_statisticsFile, - \str_pad($worker->name, static::$_maxWorkerNameLength) . " " . \str_pad($worker_exit_status, - 16) . " $worker_exit_count\n", \FILE_APPEND); - } - } else { - \file_put_contents(static::$_statisticsFile, - \str_pad($worker->name, static::$_maxWorkerNameLength) . " " . \str_pad(0, 16) . " 0\n", - \FILE_APPEND); - } - } - \file_put_contents(static::$_statisticsFile, - "----------------------------------------------PROCESS STATUS---------------------------------------------------\n", - \FILE_APPEND); - \file_put_contents(static::$_statisticsFile, - "pid\tmemory " . \str_pad('listening', static::$_maxSocketNameLength) . " " . \str_pad('worker_name', - static::$_maxWorkerNameLength) . " connections " . \str_pad('send_fail', 9) . " " - . \str_pad('timers', 8) . \str_pad('total_request', 13) ." qps status\n", \FILE_APPEND); - - \chmod(static::$_statisticsFile, 0722); - - foreach (static::getAllWorkerPids() as $worker_pid) { - \posix_kill($worker_pid, \SIGUSR2); - } - return; - } - - // For child processes. - \reset(static::$_workers); - /** @var \Workerman\Worker $worker */ - $worker = current(static::$_workers); - $worker_status_str = \posix_getpid() . "\t" . \str_pad(round(memory_get_usage(true) / (1024 * 1024), 2) . "M", 7) - . " " . \str_pad($worker->getSocketName(), static::$_maxSocketNameLength) . " " - . \str_pad(($worker->name === $worker->getSocketName() ? 'none' : $worker->name), static::$_maxWorkerNameLength) - . " "; - $worker_status_str .= \str_pad(ConnectionInterface::$statistics['connection_count'], 11) - . " " . \str_pad(ConnectionInterface::$statistics['send_fail'], 9) - . " " . \str_pad(static::$globalEvent->getTimerCount(), 7) - . " " . \str_pad(ConnectionInterface::$statistics['total_request'], 13) . "\n"; - \file_put_contents(static::$_statisticsFile, $worker_status_str, \FILE_APPEND); - } - - /** - * Write statistics data to disk. - * - * @return void - */ - protected static function writeConnectionsStatisticsToStatusFile() - { - // For master process. - if (static::$_masterPid === \posix_getpid()) { - \file_put_contents(static::$_statisticsFile, "--------------------------------------------------------------------- WORKERMAN CONNECTION STATUS --------------------------------------------------------------------------------\n", \FILE_APPEND); - \file_put_contents(static::$_statisticsFile, "PID Worker CID Trans Protocol ipv4 ipv6 Recv-Q Send-Q Bytes-R Bytes-W Status Local Address Foreign Address\n", \FILE_APPEND); - \chmod(static::$_statisticsFile, 0722); - foreach (static::getAllWorkerPids() as $worker_pid) { - \posix_kill($worker_pid, \SIGIO); - } - return; - } - - // For child processes. - $bytes_format = function($bytes) - { - if($bytes > 1024*1024*1024*1024) { - return round($bytes/(1024*1024*1024*1024), 1)."TB"; - } - if($bytes > 1024*1024*1024) { - return round($bytes/(1024*1024*1024), 1)."GB"; - } - if($bytes > 1024*1024) { - return round($bytes/(1024*1024), 1)."MB"; - } - if($bytes > 1024) { - return round($bytes/(1024), 1)."KB"; - } - return $bytes."B"; - }; - - $pid = \posix_getpid(); - $str = ''; - \reset(static::$_workers); - $current_worker = current(static::$_workers); - $default_worker_name = $current_worker->name; - - /** @var \Workerman\Worker $worker */ - foreach(TcpConnection::$connections as $connection) { - /** @var \Workerman\Connection\TcpConnection $connection */ - $transport = $connection->transport; - $ipv4 = $connection->isIpV4() ? ' 1' : ' 0'; - $ipv6 = $connection->isIpV6() ? ' 1' : ' 0'; - $recv_q = $bytes_format($connection->getRecvBufferQueueSize()); - $send_q = $bytes_format($connection->getSendBufferQueueSize()); - $local_address = \trim($connection->getLocalAddress()); - $remote_address = \trim($connection->getRemoteAddress()); - $state = $connection->getStatus(false); - $bytes_read = $bytes_format($connection->bytesRead); - $bytes_written = $bytes_format($connection->bytesWritten); - $id = $connection->id; - $protocol = $connection->protocol ? $connection->protocol : $connection->transport; - $pos = \strrpos($protocol, '\\'); - if ($pos) { - $protocol = \substr($protocol, $pos+1); - } - if (\strlen($protocol) > 15) { - $protocol = \substr($protocol, 0, 13) . '..'; - } - $worker_name = isset($connection->worker) ? $connection->worker->name : $default_worker_name; - if (\strlen($worker_name) > 14) { - $worker_name = \substr($worker_name, 0, 12) . '..'; - } - $str .= \str_pad($pid, 9) . \str_pad($worker_name, 16) . \str_pad($id, 10) . \str_pad($transport, 8) - . \str_pad($protocol, 16) . \str_pad($ipv4, 7) . \str_pad($ipv6, 7) . \str_pad($recv_q, 13) - . \str_pad($send_q, 13) . \str_pad($bytes_read, 13) . \str_pad($bytes_written, 13) . ' ' - . \str_pad($state, 14) . ' ' . \str_pad($local_address, 22) . ' ' . \str_pad($remote_address, 22) ."\n"; - } - if ($str) { - \file_put_contents(static::$_statisticsFile, $str, \FILE_APPEND); - } - } - - /** - * Check errors when current process exited. - * - * @return void - */ - public static function checkErrors() - { - if (static::STATUS_SHUTDOWN !== static::$_status) { - $error_msg = static::$_OS === \OS_TYPE_LINUX ? 'Worker['. \posix_getpid() .'] process terminated' : 'Worker process terminated'; - $errors = error_get_last(); - if ($errors && ($errors['type'] === \E_ERROR || - $errors['type'] === \E_PARSE || - $errors['type'] === \E_CORE_ERROR || - $errors['type'] === \E_COMPILE_ERROR || - $errors['type'] === \E_RECOVERABLE_ERROR) - ) { - $error_msg .= ' with ERROR: ' . static::getErrorType($errors['type']) . " \"{$errors['message']} in {$errors['file']} on line {$errors['line']}\""; - } - static::log($error_msg); - } - } - - /** - * Get error message by error code. - * - * @param integer $type - * @return string - */ - protected static function getErrorType($type) - { - if(isset(self::$_errorType[$type])) { - return self::$_errorType[$type]; - } - - return ''; - } - - /** - * Log. - * - * @param string $msg - * @return void - */ - public static function log($msg) - { - $msg = $msg . "\n"; - if (!static::$daemonize) { - static::safeEcho($msg); - } - \file_put_contents((string)static::$logFile, \date('Y-m-d H:i:s') . ' ' . 'pid:' - . (static::$_OS === \OS_TYPE_LINUX ? \posix_getpid() : 1) . ' ' . $msg, \FILE_APPEND | \LOCK_EX); - } - - /** - * Safe Echo. - * @param string $msg - * @param bool $decorated - * @return bool - */ - public static function safeEcho($msg, $decorated = false) - { - $stream = static::outputStream(); - if (!$stream) { - return false; - } - if (!$decorated) { - $line = $white = $green = $end = ''; - if (static::$_outputDecorated) { - $line = "\033[1A\n\033[K"; - $white = "\033[47;30m"; - $green = "\033[32;40m"; - $end = "\033[0m"; - } - $msg = \str_replace(array('', '', ''), array($line, $white, $green), $msg); - $msg = \str_replace(array('', '', ''), $end, $msg); - } elseif (!static::$_outputDecorated) { - return false; - } - \fwrite($stream, $msg); - \fflush($stream); - return true; - } - - /** - * @param resource|null $stream - * @return bool|resource - */ - private static function outputStream($stream = null) - { - if (!$stream) { - $stream = static::$_outputStream ? static::$_outputStream : \STDOUT; - } - if (!$stream || !\is_resource($stream) || 'stream' !== \get_resource_type($stream)) { - return false; - } - $stat = \fstat($stream); - if (!$stat) { - return false; - } - if (($stat['mode'] & 0170000) === 0100000) { - // file - static::$_outputDecorated = false; - } else { - static::$_outputDecorated = - static::$_OS === \OS_TYPE_LINUX && - \function_exists('posix_isatty') && - \posix_isatty($stream); - } - return static::$_outputStream = $stream; - } - - /** - * Construct. - * - * @param string $socket_name - * @param array $context_option - */ - public function __construct($socket_name = '', array $context_option = array()) - { - // Save all worker instances. - $this->workerId = \spl_object_hash($this); - static::$_workers[$this->workerId] = $this; - static::$_pidMap[$this->workerId] = array(); - - // Get autoload root path. - $backtrace = \debug_backtrace(); - $this->_autoloadRootPath = \dirname($backtrace[0]['file']); - Autoloader::setRootPath($this->_autoloadRootPath); - - // Context for socket. - if ($socket_name) { - $this->_socketName = $socket_name; - if (!isset($context_option['socket']['backlog'])) { - $context_option['socket']['backlog'] = static::DEFAULT_BACKLOG; - } - $this->_context = \stream_context_create($context_option); - } - - // Turn reusePort on. - /*if (static::$_OS === \OS_TYPE_LINUX // if linux - && \version_compare(\PHP_VERSION,'7.0.0', 'ge') // if php >= 7.0.0 - && \version_compare(php_uname('r'), '3.9', 'ge') // if kernel >=3.9 - && \strtolower(\php_uname('s')) !== 'darwin' // if not Mac OS - && strpos($socket_name,'unix') !== 0) { // if not unix socket - - $this->reusePort = true; - }*/ - } - - - /** - * Listen. - * - * @throws Exception - */ - public function listen() - { - if (!$this->_socketName) { - return; - } - - // Autoload. - Autoloader::setRootPath($this->_autoloadRootPath); - - if (!$this->_mainSocket) { - - $local_socket = $this->parseSocketAddress(); - - // Flag. - $flags = $this->transport === 'udp' ? \STREAM_SERVER_BIND : \STREAM_SERVER_BIND | \STREAM_SERVER_LISTEN; - $errno = 0; - $errmsg = ''; - // SO_REUSEPORT. - if ($this->reusePort) { - \stream_context_set_option($this->_context, 'socket', 'so_reuseport', 1); - } - - // Create an Internet or Unix domain server socket. - $this->_mainSocket = \stream_socket_server($local_socket, $errno, $errmsg, $flags, $this->_context); - if (!$this->_mainSocket) { - throw new Exception($errmsg); - } - - if ($this->transport === 'ssl') { - \stream_socket_enable_crypto($this->_mainSocket, false); - } elseif ($this->transport === 'unix') { - $socket_file = \substr($local_socket, 7); - if ($this->user) { - \chown($socket_file, $this->user); - } - if ($this->group) { - \chgrp($socket_file, $this->group); - } - } - - // Try to open keepalive for tcp and disable Nagle algorithm. - if (\function_exists('socket_import_stream') && static::$_builtinTransports[$this->transport] === 'tcp') { - \set_error_handler(function(){}); - $socket = \socket_import_stream($this->_mainSocket); - \socket_set_option($socket, \SOL_SOCKET, \SO_KEEPALIVE, 1); - \socket_set_option($socket, \SOL_TCP, \TCP_NODELAY, 1); - \restore_error_handler(); - } - - // Non blocking. - \stream_set_blocking($this->_mainSocket, false); - } - - $this->resumeAccept(); - } - - /** - * Unlisten. - * - * @return void - */ - public function unlisten() { - $this->pauseAccept(); - if ($this->_mainSocket) { - \set_error_handler(function(){}); - \fclose($this->_mainSocket); - \restore_error_handler(); - $this->_mainSocket = null; - } - } - - /** - * Parse local socket address. - * - * @throws Exception - */ - protected function parseSocketAddress() { - if (!$this->_socketName) { - return; - } - // Get the application layer communication protocol and listening address. - list($scheme, $address) = \explode(':', $this->_socketName, 2); - // Check application layer protocol class. - if (!isset(static::$_builtinTransports[$scheme])) { - $scheme = \ucfirst($scheme); - $this->protocol = \substr($scheme,0,1)==='\\' ? $scheme : 'Protocols\\' . $scheme; - if (!\class_exists($this->protocol)) { - $this->protocol = "Workerman\\Protocols\\$scheme"; - if (!\class_exists($this->protocol)) { - throw new Exception("class \\Protocols\\$scheme not exist"); - } - } - - if (!isset(static::$_builtinTransports[$this->transport])) { - throw new Exception('Bad worker->transport ' . \var_export($this->transport, true)); - } - } else { - $this->transport = $scheme; - } - //local socket - return static::$_builtinTransports[$this->transport] . ":" . $address; - } - - /** - * Pause accept new connections. - * - * @return void - */ - public function pauseAccept() - { - if (static::$globalEvent && false === $this->_pauseAccept && $this->_mainSocket) { - static::$globalEvent->del($this->_mainSocket, EventInterface::EV_READ); - $this->_pauseAccept = true; - } - } - - /** - * Resume accept new connections. - * - * @return void - */ - public function resumeAccept() - { - // Register a listener to be notified when server socket is ready to read. - if (static::$globalEvent && true === $this->_pauseAccept && $this->_mainSocket) { - if ($this->transport !== 'udp') { - static::$globalEvent->add($this->_mainSocket, EventInterface::EV_READ, array($this, 'acceptConnection')); - } else { - static::$globalEvent->add($this->_mainSocket, EventInterface::EV_READ, array($this, 'acceptUdpConnection')); - } - $this->_pauseAccept = false; - } - } - - /** - * Get socket name. - * - * @return string - */ - public function getSocketName() - { - return $this->_socketName ? \lcfirst($this->_socketName) : 'none'; - } - - /** - * Run worker instance. - * - * @return void - */ - public function run() - { - //Update process state. - static::$_status = static::STATUS_RUNNING; - - // Register shutdown function for checking errors. - \register_shutdown_function(array("\\Workerman\\Worker", 'checkErrors')); - - // Set autoload root path. - Autoloader::setRootPath($this->_autoloadRootPath); - - // Create a global event loop. - if (!static::$globalEvent) { - $event_loop_class = static::getEventLoopName(); - static::$globalEvent = new $event_loop_class; - $this->resumeAccept(); - } - - // Reinstall signal. - static::reinstallSignal(); - - // Init Timer. - Timer::init(static::$globalEvent); - - // Set an empty onMessage callback. - if (empty($this->onMessage)) { - $this->onMessage = function () {}; - } - - \restore_error_handler(); - - // Try to emit onWorkerStart callback. - if ($this->onWorkerStart) { - try { - \call_user_func($this->onWorkerStart, $this); - } catch (\Exception $e) { - // Avoid rapid infinite loop exit. - sleep(1); - static::stopAll(250, $e); - } catch (\Error $e) { - // Avoid rapid infinite loop exit. - sleep(1); - static::stopAll(250, $e); - } - } - - // Main loop. - static::$globalEvent->loop(); - } - - /** - * Stop current worker instance. - * - * @return void - */ - public function stop() - { - // Try to emit onWorkerStop callback. - if ($this->onWorkerStop) { - try { - \call_user_func($this->onWorkerStop, $this); - } catch (\Exception $e) { - static::stopAll(250, $e); - } catch (\Error $e) { - static::stopAll(250, $e); - } - } - // Remove listener for server socket. - $this->unlisten(); - // Close all connections for the worker. - if (!static::$_gracefulStop) { - foreach ($this->connections as $connection) { - $connection->close(); - } - } - // Clear callback. - $this->onMessage = $this->onClose = $this->onError = $this->onBufferDrain = $this->onBufferFull = null; - } - - /** - * Accept a connection. - * - * @param resource $socket - * @return void - */ - public function acceptConnection($socket) - { - // Accept a connection on server socket. - \set_error_handler(function(){}); - $new_socket = \stream_socket_accept($socket, 0, $remote_address); - \restore_error_handler(); - - // Thundering herd. - if (!$new_socket) { - return; - } - - // TcpConnection. - $connection = new TcpConnection($new_socket, $remote_address); - $this->connections[$connection->id] = $connection; - $connection->worker = $this; - $connection->protocol = $this->protocol; - $connection->transport = $this->transport; - $connection->onMessage = $this->onMessage; - $connection->onClose = $this->onClose; - $connection->onError = $this->onError; - $connection->onBufferDrain = $this->onBufferDrain; - $connection->onBufferFull = $this->onBufferFull; - - // Try to emit onConnect callback. - if ($this->onConnect) { - try { - \call_user_func($this->onConnect, $connection); - } catch (\Exception $e) { - static::stopAll(250, $e); - } catch (\Error $e) { - static::stopAll(250, $e); - } - } - } - - /** - * For udp package. - * - * @param resource $socket - * @return bool - */ - public function acceptUdpConnection($socket) - { - \set_error_handler(function(){}); - $recv_buffer = \stream_socket_recvfrom($socket, static::MAX_UDP_PACKAGE_SIZE, 0, $remote_address); - \restore_error_handler(); - if (false === $recv_buffer || empty($remote_address)) { - return false; - } - // UdpConnection. - $connection = new UdpConnection($socket, $remote_address); - $connection->protocol = $this->protocol; - if ($this->onMessage) { - try { - if ($this->protocol !== null) { - /** @var \Workerman\Protocols\ProtocolInterface $parser */ - $parser = $this->protocol; - if ($parser && \method_exists($parser, 'input')) { - while ($recv_buffer !== '') { - $len = $parser::input($recv_buffer, $connection); - if ($len === 0) - return true; - $package = \substr($recv_buffer, 0, $len); - $recv_buffer = \substr($recv_buffer, $len); - $data = $parser::decode($package, $connection); - if ($data === false) - continue; - \call_user_func($this->onMessage, $connection, $data); - } - } else { - $data = $parser::decode($recv_buffer, $connection); - // Discard bad packets. - if ($data === false) - return true; - \call_user_func($this->onMessage, $connection, $data); - } - } else { - \call_user_func($this->onMessage, $connection, $recv_buffer); - } - ++ConnectionInterface::$statistics['total_request']; - } catch (\Exception $e) { - static::stopAll(250, $e); - } catch (\Error $e) { - static::stopAll(250, $e); - } - } - return true; - } - - /** - * Check master process is alive - * - * @param int $master_pid - * @return bool - */ - protected static function checkMasterIsAlive($master_pid) - { - if (empty($master_pid)) { - return false; - } - - $master_is_alive = $master_pid && \posix_kill((int) $master_pid, 0) && \posix_getpid() !== $master_pid; - if (!$master_is_alive) { - return false; - } - - $cmdline = "/proc/{$master_pid}/cmdline"; - if (!is_readable($cmdline) || empty(static::$processTitle)) { - return true; - } - - $content = file_get_contents($cmdline); - if (empty($content)) { - return true; - } - - return stripos($content, static::$processTitle) !== false || stripos($content, 'php') !== false; - } -} - diff --git a/GatewayWorker_linux/vendor/workerman/workerman/composer.json b/GatewayWorker_linux/vendor/workerman/workerman/composer.json deleted file mode 100644 index fdd4808a..00000000 --- a/GatewayWorker_linux/vendor/workerman/workerman/composer.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "workerman/workerman", - "type": "library", - "keywords": [ - "event-loop", - "asynchronous" - ], - "homepage": "http://www.workerman.net", - "license": "MIT", - "description": "An asynchronous event driven PHP framework for easily building fast, scalable network applications.", - "authors": [ - { - "name": "walkor", - "email": "walkor@workerman.net", - "homepage": "http://www.workerman.net", - "role": "Developer" - } - ], - "support": { - "email": "walkor@workerman.net", - "issues": "https://github.com/walkor/workerman/issues", - "forum": "http://wenda.workerman.net/", - "wiki": "http://doc.workerman.net/", - "source": "https://github.com/walkor/workerman" - }, - "require": { - "php": ">=5.3" - }, - "suggest": { - "ext-event": "For better performance. " - }, - "autoload": { - "psr-4": { - "Workerman\\": "./" - } - }, - "minimum-stability": "dev" -} diff --git a/README.md b/README.md index 61e4f8d3..96e2b131 100644 --- a/README.md +++ b/README.md @@ -1,272 +1,108 @@ -## 写在前面 - 2018年的春节假期,受朋友的鼓励和内心的指引,对近两年所学到的知识进行了系统的沉淀和总结。 - 从多个项目中提取关键点、抛弃了的业务部分,对底层的功能进行了各类优化和抽象,写成本项目。 -## 1、 当前版本介绍 - -## 1.1 版本说明 - -> 当前版本laravel_template_with_vue (3) - -## 1.2 改进说明 - -#### 总体构架 -> 1. 修改后端目录为api -> 2. 修改管理端目录为element(UI使用element) -> 3. 增加管理端目录antd(UI使用antd) -> 4. 增加小程序端目录uni-app(UI使用uview) -> 5. 增加独立的公众号目录vant(单页面 UI使用vant) - -#### 后端: -> 1.更新larave框架为LTS版本laravel6 -> -> 2.更新passport插件到最新版本 -> -> 3.完善RBAC管理 -> -> 4.增加验证码功能、短信发送功能和第三方登陆等功能 - -#### 管理端: -> 1. 前端element ui 更新到了2.15.6版本,请参照开发 -> 2. 完善RBAC的管理端操作 -> 3. 增加简单的内容管理(文章、文章类型、轮播图,使用于小程序和公众号等) -> 6. 配置完善websocket功能,实现聊天室、客服等功能 -> 7. 增加微信端的各种配置信息等 - -#### 小程序端: - -> 1. 小程序完善的目录结构和开发功能,直接对接后端接口 -> -> 2. 小程序内用户的登陆、获取用户名和手机号码 - -## 2、系统概述 - 项目依托laravel6与vue.js,采用了主流的前后端分离方式来构建,作为程序的起点,你可以在此基础上进行自身业务的扩展。 - 后端(api目录)负责OAuth认证、用户授权、第三方用户登录验证和提供API,在此基础上集成excel文件的操作和完善的RBAC管理等基础功能,使用者只需专注于业务api的开发即可。后端整合了laravel-echo-server,实现了websocket。并实现消息的实时推送、为聊天室、客服等功能提供了API,是全网最好的laravel-echo-server教程。 - 前端(element目录)负责页面的显示和前端用户权限的控制。项目引入了element UI框架,并已经对用户登录认证、路由、权限等基础功能进行了处理。前端用户的权限不但可以控制系统的导航菜单,而且可以控制到页面按钮、表格等内容的显示。使用者只需要专注于业务界面的开发即可。 - 小程序(uni-app目录)主要用户小程序开发,集成了uview,实现了用户的登陆授权和获取手机号等功能,在此基础上,使用时只需要关心业务页面的开发即可以。 - 本项目使用广泛,已经在本人的多个项目中商用。 -#### 注意事项 - -> 1. 系统中admin用户为超级管理员,为了方便演示,也是为了供大家使用,发布的版本中,已经屏蔽admin用户的信息修改等功能,实际开发中,用户只需要去相应的前端页面中学校除去屏蔽修改的语句就可以。 -> -> 2. 为了使用websocket等功能,需要用户同时修改前后和后端的配置,开启websocket -> -> 3. 为了演示聊天室和客服等功能,用户可以进入系统后首先创建多个用户,并且利用不同的浏览器同时登陆,就可以演示相关功能。 - -## 3、项目演示与截图 -> (管理端 element ui)演示网站(https://element.wmhello.cn) -> -> 管理员用户名和密码(admin/123456) - -### 项目截图 -#### 登陆页面(可以扩充到使用验证码和手机号码登陆) -![](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/系统登陆.jpg) - -管理员面板 - -![](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/2-管理员面板.jpg) - -#### 修改个人信息 - -![](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/3-修改个人信息.jpg) - -#### 全屏幕操作 - -![](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/4-全屏操作.jpg) - -#### 管理员管理 - -![](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/5-管理员管理.jpg) - -#### 添加管理员 -![](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/6-添加管理员.jpg) - -#### 导入管理员 -![](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/7-批量导入管理员.jpg) - -#### 角色管理 - -![](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/8-角色管理.jpg) - -#### 角色功能设置 -![](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/9-角色功能设置.jpg) - -#### 模块与权限管理 - -![](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/10-模块管理.jpg) - -#### 添加新模块 - -![](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/11-添加模块.jpg) - -#### 超级管理员界面下的功能 -![](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/12-超级管理员界面.jpg) - -#### 不同角色用户下的功能 - -![](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/13-不同角色用户.jpg) - -#### 文章管理以及富文本编辑器 - -![](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/14-文章管理及富文本.jpg) - -#### 聊天室 - -![](https://s2.loli.net/2022/08/22/YeTZas5VJMX9uky.jpg) - -#### 客服功能(普通用户界面) -![](https://s2.loli.net/2022/08/22/kToDHnEixfgMU8d.jpg) - -#### 客服功能(客服界面 1对多) -![](https://s2.loli.net/2022/08/22/CKnlR7FIgNm4Wh9.jpg) - -#### 代码片段 -![](https://s2.loli.net/2022/08/22/aYRStNyWws3lV9Q.jpg) - -#### 自动化编码配置 -![](https://s2.loli.net/2022/08/22/CugynFAtPi4SBQG.jpg) -![](https://s2.loli.net/2022/08/22/WjB2DXphQKwAHqa.jpg) - -#### 代码下载(代码包括前后端增删改查的所有内容) -![](https://s2.loli.net/2022/08/22/IQkKE1UStW2TiV6.jpg) - - -#### 快速开发应用 -![](https://i.loli.net/2021/11/29/StAMiRD1jPJEc9Z.png) - - -#### 微信公众号测试号 -![微信测试号2.png](https://s2.loli.net/2021/12/10/M2BVRZQDvqjahTo.png) - - -#### 测试号菜单 -![测试号菜单](https://s2.loli.net/2021/12/10/kbzDur6sIhC7FTO.jpg) - -#### 测试号H5页面 -![测试号H5页面](https://s2.loli.net/2021/12/10/sS2duifVE4B59he.png) - - - -## 4、技术文档 -### 部署视频 -https://www.bilibili.com/video/BV1qi4y197JF?spm_id_from=333.999.0.0 - -### [后端快速部署](back.md) - -### [前端快速部署](front.md) - -### [关键知识点讲述](knowledge.md) - -### [业务开发](developer.md) - - - -## 5、 开发视频与在线辅导 - -> 如果需要购买相应的学习视频 可以光临我的小店(https://yzkjit.taobao.com) -> -> 如果需要技术辅导和支持 可以加我微信(xpyzwm) - -### 利用vue.js和vue-element-admin开发管理系统 -学习视频: -https://v.qq.com/x/page/i3059zqgj4y.html -https://v.qq.com/x/page/m3059l9bitb.html - -#### 目录 - -![](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/admin-mulu-2.png) - -### 利用PHP开发微信公众号 -学习视频: -https://url.cn/5d4wWGl?sf=uri - -![微信公众号开发目录](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/wx-mulu.png) - - -### 利用Laravel开发RESTful API -学习视频: -https://v.qq.com/x/page/t3059mfpgkg.html - -#### 目录: -1 软件构建与表的设计 -2 迁移表的编写 -3 模拟数据的生成 -4 列表API的编写 -5 新增和修改API的编写 -6 删除API的编写和优化 -7 数据的导入和导出 -8 个性化导入 -9 后台API的书写流程以及示列 -10 passport插件的安装 -11 利用passport生成和注销令牌 -12 令牌的刷新 -13 RBAC权限管理-数据表的建立 -14 RBAC权限管理-逻辑的编写 -15 中间件的编写 -16 封装可以复用的控制器模板 -17 模板控制器的编写(增加、修改和删除功能) -18 模板控制器的编写(数据的导入和导出) -19 模板控制器使用以及分析 -20 自定义命令行--command的应用 -21 代码解耦的好帮手--事件系统 -22 广播与消息推送-理论与配置 -23 广播与消息推送的实际应用 -24 利用laravel-echo-server实现消息推送和聊天室功能 -25 laravel中短信发送功能的集成 -26 laravel中邮件发送功能的集成 - -### 利用uni-app开发微信小程序(核心知识点) - -![](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/mp-mulu.png) - - -### 在线辅导 - 如果你在计算机程序设计的学习与开发的过程中,碰到难点,需要技术指导和相关的开发辅导。可以联系本人,本人将提供有偿的技术支持和辅导(50元/时-100元/小时),辅导的内容包括但不局限于以下(前端、后端PHP、nodejs、数据库、javascript和PHP的程序设计模式、公众号、小程序、vue.js、uni-app等)。 - - -## 6.使用该模板开发的项目 -1.[在线考试系统管理端](http://exam-admin.wmhello.cn/#/login) 用户名/密码(admin/123456) -[在线考试系统用户端](http://exam-online.wmhello.cn/) 用户名/密码(test/123456) - -2.[商品进销存管理系统](http://erp-admin.wmhello.cn/login) 用户名/密码(admin/123456) - -3.[民主测评管理系统](http://result.wmhello.cn) 用户名/密码(admin/123456) - -4.[学校信息管理系统模板](https://docs.wmhello.cn/design/b65500/) - -5.[其他案列](https://docs.wmhello.cn/project/) - - -## 7、技术支持 -> 欢迎大家来光临我的博客,主要专注于laravel与vue.js的应用 -[博客](https://docs.wmhello.cn) - -> 部署和使用中如果有疑问,可以到项目交流群进行讨论:微信(xpyzwm)或者关注公众号(computer_life)学习相关基础知识 - -> ![微信二维码](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/weixin1.png) - -> ![全栈开发公众号](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/gzh.jpg) - - -## 8、打赏 -如果我的付出能够帮助到你,我也乐于接受你的帮助,小小的赞赏是我持续进步的动力。 - -![支付宝支付](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/pay1.jpg) - -![微信支付](https://cdn.jsdelivr.net/gh/wmhello/imgs/blog/wx.jpg) - -## 9、致谢 - 站在巨人之上,我们才能走得更远。项目中使用和借鉴了以下开源框架的实现方法 一并致谢 ->- [laravel](https://laravel.com/) ->- [workerman](https://www.workerman.net/) ->- [后端excel插件](https://github.com/rap2hpoutre/fast-excel) ->- [vue.js](https://cn.vuejs.org/index.html) ->- [vue-router](https://router.vuejs.org/) ->- [vuex](https://vuex.vuejs.org/) ->- [管理端element ui](http://element.eleme.io/#/zh-CN) ->- [前端构架 vueAdmin-template](https://github.com/PanJiaChen/vueAdmin-template) ->- [小程序UI uview](https://v1.uviewui.com/) ->- [微信公众号UI vant](https://vant-ui.github.io/vant/v2/#/zh-CN/) - -# License - -[MIT](https://github.com/wmhello/laravel_template_with_vue/blob/master/LICENSE) +## 1、写在前面 + 2018年的春节假期,受朋友的鼓励和内心的指引,对近两年所学到的知识进行了系统的沉淀和总结。 + 从多个项目中提取关键点、抛弃了的业务部分,对底层的功能进行了各类优化和抽象,写成本项目。 + +## 2、系统概述 + 项目依托laravel5.5与vue.js,采用了主流的前后端分离方式来构建,作为程序的起点,你可以在此基础上进行自身业务的扩展。 + 后端(backend目录)负责OAuth认证、用户授权、第三方用户登录验证和提供API,在此基础上集成了跨域和excel文件的操作等基础功能,使用者只需专注于业务api的开发即可。 + 前端(frontend目录)负责页面的显示和前端用户权限的控制。项目已经引入了element UI框架,并已经对用户登录认证、路由、权限等基础功能进行了处理。 + 前端用户的权限不但可以控制系统的导航菜单,而且可以控制到页面按钮、表格等内容的显示。使用者只需要专注于业务界面的开发即可。 + 本项目使用广泛,已经在本人的多个项目中商用。 + +> 第三方登录测试时,可以先进入系统创建一个用户,然后用github登录后绑定刚刚创建的新用户,之后就可以使用github来自动登录了 + +## 3、项目演示与截图 +> 演示网站(http://front.ynxpyz.cn) +> 管理员用户名和密码(871228582@qq.com/123456) +> 普通用户用户名和密码(786270744@qq.com/123456) + +### 项目截图 + +#### 后端API文档 +![后端API文档](https://github.com/wmhello/laravel_template_with_vue/raw/master/Screenshots/apidoc.png) + +#### 管理员面板 +![管理员面板](https://github.com/wmhello/laravel_template_with_vue/raw/master/Screenshots/dashboard.png) + +#### 普通用户面板[注意观察系统日志和左侧导航菜单] +![普通用户面板](https://github.com/wmhello/laravel_template_with_vue/raw/master/Screenshots/dashboard-user.png) + +#### 用户管理 +![用户管理](https://github.com/wmhello/laravel_template_with_vue/raw/master/Screenshots/user-list.png) + +#### 用户添加 +![用户添加](https://github.com/wmhello/laravel_template_with_vue/raw/master/Screenshots/user-add.png) + +#### 用户数据导出 +![用户数据导出](https://github.com/wmhello/laravel_template_with_vue/raw/master/Screenshots/user-download.png) + +#### 角色管理 +![角色管理](https://github.com/wmhello/laravel_template_with_vue/raw/master/Screenshots/role-manger.png) + +#### 角色功能设置 +![角色功能设置](https://github.com/wmhello/laravel_template_with_vue/raw/master/Screenshots/role-set-feature.png) + +#### 功能管理 +![功能管理](https://github.com/wmhello/laravel_template_with_vue/raw/master/Screenshots/permission-manger.png) + +#### 功能组管理 +![功能组管理](https://github.com/wmhello/laravel_template_with_vue/raw/master/Screenshots/permission-group.png) + +#### 添加新功能 +![添加新功能](https://github.com/wmhello/laravel_template_with_vue/raw/master/Screenshots/permission-feature.png) + +#### 管理员界面下的学期管理 +![管理员界面下的学期管理](https://github.com/wmhello/laravel_template_with_vue/raw/master/Screenshots/session-admin.png) + +#### 普通用户界面下的学期管理 +![普通用户界面下的学期管理](https://github.com/wmhello/laravel_template_with_vue/raw/master/Screenshots/session-user.png) + +## 4、技术文档 +### [1、后端快速部署](back.md) +### [2、前端快速部署](front.md) +### [3、关键知识点讲述](knowledge.md) +### [4、业务开发](developer.md) +### [5、系统视频与在线辅导](vedio.md) +### [6、升级版的前端项目](adv.md) + +## 5、技术支持 +> 欢迎大家来光临我的博客,主要专注于laravel与vue.js的应用 +[博客](https://wmhello.github.io) + +> 如果对您有帮助,您可以点右上角 "Star" 支持一下 谢谢! ^_^ + +> 或者您可以 "follow" 一下,我会不断完善该项目 + +> 开发环境 windows 7 Chrome 63 PHP 7.1.7 + +> 如有问题请直接在 Issues 中提,或者您发现问题并有非常好的解决方案,欢迎 PR 👍 + +> __部署和使用中如果有疑问,可以到项目交流群进行讨论:106822531(QQ)或者关注公众号(computer_life)学习相关基础知识 + +> ![QQ群二维码](https://github.com/wmhello/laravel_template_with_vue/raw/master/Screenshots/qq_qrcode.jpg) + +> ![全栈开发公众号](https://github.com/wmhello/laravel_template_with_vue/blob/master/Screenshots/gzh.jpg) + + +## 6、打赏 +如果我的付出能够帮助到你,我也乐于接受你的帮助,小小的赞赏是我们持续进步的动力。 + +![支付宝支付](https://github.com/wmhello/laravel_template_with_vue/raw/master/Screenshots/pay1.jpg) +![微信支付](https://github.com/wmhello/laravel_template_with_vue/raw/master/Screenshots/wx.jpg) + +## 7、致谢 + 站在巨人之上,我们才能走得更远。项目中使用和借鉴了以下开源框架的实现方法 一并致谢 +>- [laravel](https://laravel.com/) +>- [后端excel插件](https://github.com/Maatwebsite/Laravel-Excel) +>- [后端跨域](https://github.com/barryvdh/laravel-cors) +>- [API接口文档书写](http://apidocjs.com/) +>- [vue.js](https://cn.vuejs.org/index.html) +>- [element ui](http://element.eleme.io/#/zh-CN) +>- [vue-router](https://router.vuejs.org/) +>- [vuex](https://vuex.vuejs.org/) +>- [前端构架 vueAdmin-template](https://github.com/PanJiaChen/vueAdmin-template) +>- [前端权限控制 Vue-Access-control](https://github.com/tower1229/Vue-Access-Control) + +# License + +[MIT](https://github.com/wmhello/laravel_template_with_vue/blob/master/LICENSE) diff --git a/Screenshots/QQ.png b/Screenshots/QQ.png new file mode 100644 index 00000000..5989999c Binary files /dev/null and b/Screenshots/QQ.png differ diff --git a/Screenshots/apidoc.png b/Screenshots/apidoc.png new file mode 100644 index 00000000..1c9368da Binary files /dev/null and b/Screenshots/apidoc.png differ diff --git a/Screenshots/blog.png b/Screenshots/blog.png new file mode 100644 index 00000000..44038404 Binary files /dev/null and b/Screenshots/blog.png differ diff --git a/Screenshots/dashboard-user.png b/Screenshots/dashboard-user.png new file mode 100644 index 00000000..95374d6b Binary files /dev/null and b/Screenshots/dashboard-user.png differ diff --git a/Screenshots/dashboard.png b/Screenshots/dashboard.png new file mode 100644 index 00000000..16f7a546 Binary files /dev/null and b/Screenshots/dashboard.png differ diff --git a/Screenshots/dishboard-user.png b/Screenshots/dishboard-user.png new file mode 100644 index 00000000..8bbc4b54 Binary files /dev/null and b/Screenshots/dishboard-user.png differ diff --git a/Screenshots/gzh.jpg b/Screenshots/gzh.jpg new file mode 100644 index 00000000..1c7be262 Binary files /dev/null and b/Screenshots/gzh.jpg differ diff --git a/Screenshots/pay1.jpg b/Screenshots/pay1.jpg new file mode 100644 index 00000000..b3cb3ba9 Binary files /dev/null and b/Screenshots/pay1.jpg differ diff --git a/Screenshots/permission-feature.png b/Screenshots/permission-feature.png new file mode 100644 index 00000000..af9f0cee Binary files /dev/null and b/Screenshots/permission-feature.png differ diff --git a/Screenshots/permission-group.png b/Screenshots/permission-group.png new file mode 100644 index 00000000..10d810f0 Binary files /dev/null and b/Screenshots/permission-group.png differ diff --git a/Screenshots/permission-manger.png b/Screenshots/permission-manger.png new file mode 100644 index 00000000..bb8d251c Binary files /dev/null and b/Screenshots/permission-manger.png differ diff --git a/Screenshots/qq_qrcode.jpg b/Screenshots/qq_qrcode.jpg new file mode 100644 index 00000000..510e9ad0 Binary files /dev/null and b/Screenshots/qq_qrcode.jpg differ diff --git a/Screenshots/role-manger.png b/Screenshots/role-manger.png new file mode 100644 index 00000000..7a9f610f Binary files /dev/null and b/Screenshots/role-manger.png differ diff --git a/Screenshots/role-set-feature.png b/Screenshots/role-set-feature.png new file mode 100644 index 00000000..fb6b5895 Binary files /dev/null and b/Screenshots/role-set-feature.png differ diff --git a/Screenshots/session-admin.png b/Screenshots/session-admin.png new file mode 100644 index 00000000..bd835ecb Binary files /dev/null and b/Screenshots/session-admin.png differ diff --git a/Screenshots/session-user.png b/Screenshots/session-user.png new file mode 100644 index 00000000..f71eefda Binary files /dev/null and b/Screenshots/session-user.png differ diff --git a/Screenshots/user-add.png b/Screenshots/user-add.png new file mode 100644 index 00000000..c59a2821 Binary files /dev/null and b/Screenshots/user-add.png differ diff --git a/Screenshots/user-download.png b/Screenshots/user-download.png new file mode 100644 index 00000000..cd4afaab Binary files /dev/null and b/Screenshots/user-download.png differ diff --git a/Screenshots/user-list.png b/Screenshots/user-list.png new file mode 100644 index 00000000..1b9e8be2 Binary files /dev/null and b/Screenshots/user-list.png differ diff --git a/Screenshots/weixin1.png b/Screenshots/weixin1.png new file mode 100644 index 00000000..234e7f6c Binary files /dev/null and b/Screenshots/weixin1.png differ diff --git a/Screenshots/wx.jpg b/Screenshots/wx.jpg new file mode 100644 index 00000000..8225d9ae Binary files /dev/null and b/Screenshots/wx.jpg differ diff --git a/adv.md b/adv.md new file mode 100644 index 00000000..0da7e62c --- /dev/null +++ b/adv.md @@ -0,0 +1,15 @@ +## 获取升级版的前端项目 +> 除了开源的前端项目之外,你也可以通过打赏赞助(超过100元)来获取升级版的前端项目,同时也将获得作者1个小时的技术支持(根据你的需求进行的在线讲解) + +> 微信:xpyzwm + +### 前端项目新增功能 +>1、更高级的权限控制,可以根据后端接口返回的数据动态的配置和调整权限,解决前后端分离模式下的前端开发中的权限控制难点。 + +>2、可以同时打开多个业务页面,页面之间可以根据需要随时切换 + +>3、提供全屏显示功能 + +>4、提供中英文、多语言切换功能 + +>5、提供管理员多个角色切换功能 \ No newline at end of file diff --git a/api/.editorconfig b/api/.editorconfig deleted file mode 100644 index 6537ca46..00000000 --- a/api/.editorconfig +++ /dev/null @@ -1,15 +0,0 @@ -root = true - -[*] -charset = utf-8 -end_of_line = lf -insert_final_newline = true -indent_style = space -indent_size = 4 -trim_trailing_whitespace = true - -[*.md] -trim_trailing_whitespace = false - -[*.{yml,yaml}] -indent_size = 2 diff --git a/api/.env.example b/api/.env.example deleted file mode 100644 index 344cb156..00000000 --- a/api/.env.example +++ /dev/null @@ -1,73 +0,0 @@ -APP_NAME=Laravel -APP_ENV=local -APP_KEY= -APP_DEBUG=true -APP_URL=http://localhost - -LOG_CHANNEL=stack - -DB_CONNECTION=mysql -DB_HOST=127.0.0.1 -DB_PORT=3306 -DB_DATABASE=laravel -DB_USERNAME=root -DB_PASSWORD= - -BROADCAST_DRIVER=log -CACHE_DRIVER=file -QUEUE_CONNECTION=sync -SESSION_DRIVER=file -SESSION_LIFETIME=120 - -REDIS_HOST=127.0.0.1 -REDIS_PASSWORD=null -REDIS_PORT=6379 - -MAIL_DRIVER=smtp -MAIL_HOST=smtp.mailtrap.io -MAIL_PORT=2525 -MAIL_USERNAME=null -MAIL_PASSWORD=null -MAIL_ENCRYPTION=null -MAIL_FROM_ADDRESS=null -MAIL_FROM_NAME="${APP_NAME}" - -AWS_ACCESS_KEY_ID= -AWS_SECRET_ACCESS_KEY= -AWS_DEFAULT_REGION=us-east-1 -AWS_BUCKET= - -PUSHER_APP_ID= -PUSHER_APP_KEY= -PUSHER_APP_SECRET= -PUSHER_APP_CLUSTER=mt1 - -MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" -MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" - - -## OAuth登录配置 -PASSPORT_CLIENT_ID= -PASSPORT_CLIENT_SECRET= - -## 微信服务号配置 -WECHAT_OFFICIAL_ACCOUNT_APPID= -WECHAT_OFFICIAL_ACCOUNT_SECRET= -WECHAT_OFFICIAL_ACCOUNT_TOKEN= -WECHAT_OFFICIAL_ACCOUNT_AES_KEY= - - -## 微信支付配置 -WECHAT_PAYMENT_APPID= -WECHAT_PAYMENT_MCH_ID= -WECHAT_PAYMENT_KEY= -WECHAT_PAYMENT_CERT_PATH= -WECHAT_PAYMENT_KEY_PATH= -WECHAT_PAYMENT_NOTIFY_URL= - -## 微信小程序配置 -WECHAT_MINI_PROGRAM_APPID= -WECHAT_MINI_PROGRAM_SECRET= - -## GatewayWorker配置,用于websocket -REGISTER_ADDRESS= diff --git a/api/.gitignore b/api/.gitignore deleted file mode 100644 index 0f7df0fb..00000000 --- a/api/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -/node_modules -/public/hot -/public/storage -/storage/*.key -/vendor -.env -.env.backup -.phpunit.result.cache -Homestead.json -Homestead.yaml -npm-debug.log -yarn-error.log diff --git a/api/.styleci.yml b/api/.styleci.yml deleted file mode 100644 index 1db61d96..00000000 --- a/api/.styleci.yml +++ /dev/null @@ -1,13 +0,0 @@ -php: - preset: laravel - disabled: - - unused_use - finder: - not-name: - - index.php - - server.php -js: - finder: - not-name: - - webpack.mix.js -css: true diff --git a/api/README.md b/api/README.md deleted file mode 100644 index 4e2cadb6..00000000 --- a/api/README.md +++ /dev/null @@ -1,78 +0,0 @@ -

- -

-Build Status -Total Downloads -Latest Stable Version -License -

- -## About Laravel - -Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as: - -- [Simple, fast routing engine](https://laravel.com/docs/routing). -- [Powerful dependency injection container](https://laravel.com/docs/container). -- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage. -- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent). -- Database agnostic [schema migrations](https://laravel.com/docs/migrations). -- [Robust background job processing](https://laravel.com/docs/queues). -- [Real-time event broadcasting](https://laravel.com/docs/broadcasting). - -Laravel is accessible, powerful, and provides tools required for large, robust applications. - -## Learning Laravel - -Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework. - -If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains over 1500 video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library. - -## Laravel Sponsors - -We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the Laravel [Patreon page](https://patreon.com/taylorotwell). - -- **[Vehikl](https://vehikl.com/)** -- **[Tighten Co.](https://tighten.co)** -- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)** -- **[64 Robots](https://64robots.com)** -- **[Cubet Techno Labs](https://cubettech.com)** -- **[Cyber-Duck](https://cyber-duck.co.uk)** -- **[British Software Development](https://www.britishsoftware.co)** -- **[Webdock, Fast VPS Hosting](https://www.webdock.io/en)** -- **[DevSquad](https://devsquad.com)** -- [UserInsights](https://userinsights.com) -- [Fragrantica](https://www.fragrantica.com) -- [SOFTonSOFA](https://softonsofa.com/) -- [User10](https://user10.com) -- [Soumettre.fr](https://soumettre.fr/) -- [CodeBrisk](https://codebrisk.com) -- [1Forge](https://1forge.com) -- [TECPRESSO](https://tecpresso.co.jp/) -- [Runtime Converter](http://runtimeconverter.com/) -- [WebL'Agence](https://weblagence.com/) -- [Invoice Ninja](https://www.invoiceninja.com) -- [iMi digital](https://www.imi-digital.de/) -- [Earthlink](https://www.earthlink.ro/) -- [Steadfast Collective](https://steadfastcollective.com/) -- [We Are The Robots Inc.](https://watr.mx/) -- [Understand.io](https://www.understand.io/) -- [Abdel Elrafa](https://abdelelrafa.com) -- [Hyper Host](https://hyper.host) -- [Appoly](https://www.appoly.co.uk) -- [OP.GG](https://op.gg) - -## Contributing - -Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). - -## Code of Conduct - -In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct). - -## Security Vulnerabilities - -If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed. - -## License - -The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). diff --git a/api/_ide_helper.php b/api/_ide_helper.php deleted file mode 100644 index 4923be29..00000000 --- a/api/_ide_helper.php +++ /dev/null @@ -1,17244 +0,0 @@ - - * @see https://github.com/barryvdh/laravel-ide-helper - */ - - namespace Illuminate\Support\Facades { - /** - * - * - * @see \Illuminate\Contracts\Foundation\Application - */ - class App { - /** - * Get the version number of the application. - * - * @return string - * @static - */ - public static function version() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->version(); - } - /** - * Run the given array of bootstrap classes. - * - * @param string[] $bootstrappers - * @return void - * @static - */ - public static function bootstrapWith($bootstrappers) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->bootstrapWith($bootstrappers); - } - /** - * Register a callback to run after loading the environment. - * - * @param \Closure $callback - * @return void - * @static - */ - public static function afterLoadingEnvironment($callback) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->afterLoadingEnvironment($callback); - } - /** - * Register a callback to run before a bootstrapper. - * - * @param string $bootstrapper - * @param \Closure $callback - * @return void - * @static - */ - public static function beforeBootstrapping($bootstrapper, $callback) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->beforeBootstrapping($bootstrapper, $callback); - } - /** - * Register a callback to run after a bootstrapper. - * - * @param string $bootstrapper - * @param \Closure $callback - * @return void - * @static - */ - public static function afterBootstrapping($bootstrapper, $callback) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->afterBootstrapping($bootstrapper, $callback); - } - /** - * Determine if the application has been bootstrapped before. - * - * @return bool - * @static - */ - public static function hasBeenBootstrapped() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->hasBeenBootstrapped(); - } - /** - * Set the base path for the application. - * - * @param string $basePath - * @return \Illuminate\Foundation\Application - * @static - */ - public static function setBasePath($basePath) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->setBasePath($basePath); - } - /** - * Get the path to the application "app" directory. - * - * @param string $path - * @return string - * @static - */ - public static function path($path = '') - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->path($path); - } - /** - * Set the application directory. - * - * @param string $path - * @return \Illuminate\Foundation\Application - * @static - */ - public static function useAppPath($path) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->useAppPath($path); - } - /** - * Get the base path of the Laravel installation. - * - * @param string $path - * @return string - * @static - */ - public static function basePath($path = '') - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->basePath($path); - } - /** - * Get the path to the bootstrap directory. - * - * @param string $path - * @return string - * @static - */ - public static function bootstrapPath($path = '') - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->bootstrapPath($path); - } - /** - * Get the path to the application configuration files. - * - * @param string $path - * @return string - * @static - */ - public static function configPath($path = '') - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->configPath($path); - } - /** - * Get the path to the database directory. - * - * @param string $path - * @return string - * @static - */ - public static function databasePath($path = '') - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->databasePath($path); - } - /** - * Set the database directory. - * - * @param string $path - * @return \Illuminate\Foundation\Application - * @static - */ - public static function useDatabasePath($path) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->useDatabasePath($path); - } - /** - * Get the path to the language files. - * - * @return string - * @static - */ - public static function langPath() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->langPath(); - } - /** - * Get the path to the public / web directory. - * - * @return string - * @static - */ - public static function publicPath() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->publicPath(); - } - /** - * Get the path to the storage directory. - * - * @return string - * @static - */ - public static function storagePath() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->storagePath(); - } - /** - * Set the storage directory. - * - * @param string $path - * @return \Illuminate\Foundation\Application - * @static - */ - public static function useStoragePath($path) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->useStoragePath($path); - } - /** - * Get the path to the resources directory. - * - * @param string $path - * @return string - * @static - */ - public static function resourcePath($path = '') - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->resourcePath($path); - } - /** - * Get the path to the environment file directory. - * - * @return string - * @static - */ - public static function environmentPath() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->environmentPath(); - } - /** - * Set the directory for the environment file. - * - * @param string $path - * @return \Illuminate\Foundation\Application - * @static - */ - public static function useEnvironmentPath($path) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->useEnvironmentPath($path); - } - /** - * Set the environment file to be loaded during bootstrapping. - * - * @param string $file - * @return \Illuminate\Foundation\Application - * @static - */ - public static function loadEnvironmentFrom($file) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->loadEnvironmentFrom($file); - } - /** - * Get the environment file the application is using. - * - * @return string - * @static - */ - public static function environmentFile() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->environmentFile(); - } - /** - * Get the fully qualified path to the environment file. - * - * @return string - * @static - */ - public static function environmentFilePath() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->environmentFilePath(); - } - /** - * Get or check the current application environment. - * - * @param string|array $environments - * @return string|bool - * @static - */ - public static function environment(...$environments) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->environment(...$environments); - } - /** - * Determine if application is in local environment. - * - * @return bool - * @static - */ - public static function isLocal() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->isLocal(); - } - /** - * Determine if application is in production environment. - * - * @return bool - * @static - */ - public static function isProduction() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->isProduction(); - } - /** - * Detect the application's current environment. - * - * @param \Closure $callback - * @return string - * @static - */ - public static function detectEnvironment($callback) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->detectEnvironment($callback); - } - /** - * Determine if the application is running in the console. - * - * @return bool - * @static - */ - public static function runningInConsole() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->runningInConsole(); - } - /** - * Determine if the application is running unit tests. - * - * @return bool - * @static - */ - public static function runningUnitTests() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->runningUnitTests(); - } - /** - * Register all of the configured providers. - * - * @return void - * @static - */ - public static function registerConfiguredProviders() - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->registerConfiguredProviders(); - } - /** - * Register a service provider with the application. - * - * @param \Illuminate\Support\ServiceProvider|string $provider - * @param bool $force - * @return \Illuminate\Support\ServiceProvider - * @static - */ - public static function register($provider, $force = false) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->register($provider, $force); - } - /** - * Get the registered service provider instance if it exists. - * - * @param \Illuminate\Support\ServiceProvider|string $provider - * @return \Illuminate\Support\ServiceProvider|null - * @static - */ - public static function getProvider($provider) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getProvider($provider); - } - /** - * Get the registered service provider instances if any exist. - * - * @param \Illuminate\Support\ServiceProvider|string $provider - * @return array - * @static - */ - public static function getProviders($provider) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getProviders($provider); - } - /** - * Resolve a service provider instance from the class name. - * - * @param string $provider - * @return \Illuminate\Support\ServiceProvider - * @static - */ - public static function resolveProvider($provider) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->resolveProvider($provider); - } - /** - * Load and boot all of the remaining deferred providers. - * - * @return void - * @static - */ - public static function loadDeferredProviders() - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->loadDeferredProviders(); - } - /** - * Load the provider for a deferred service. - * - * @param string $service - * @return void - * @static - */ - public static function loadDeferredProvider($service) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->loadDeferredProvider($service); - } - /** - * Register a deferred provider and service. - * - * @param string $provider - * @param string|null $service - * @return void - * @static - */ - public static function registerDeferredProvider($provider, $service = null) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->registerDeferredProvider($provider, $service); - } - /** - * Resolve the given type from the container. - * - * @param string $abstract - * @param array $parameters - * @return mixed - * @static - */ - public static function make($abstract, $parameters = []) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->make($abstract, $parameters); - } - /** - * Determine if the given abstract type has been bound. - * - * @param string $abstract - * @return bool - * @static - */ - public static function bound($abstract) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->bound($abstract); - } - /** - * Determine if the application has booted. - * - * @return bool - * @static - */ - public static function isBooted() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->isBooted(); - } - /** - * Boot the application's service providers. - * - * @return void - * @static - */ - public static function boot() - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->boot(); - } - /** - * Register a new boot listener. - * - * @param callable $callback - * @return void - * @static - */ - public static function booting($callback) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->booting($callback); - } - /** - * Register a new "booted" listener. - * - * @param callable $callback - * @return void - * @static - */ - public static function booted($callback) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->booted($callback); - } - /** - * {@inheritdoc} - * - * @static - */ - public static function handle($request, $type = 1, $catch = true) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->handle($request, $type, $catch); - } - /** - * Determine if middleware has been disabled for the application. - * - * @return bool - * @static - */ - public static function shouldSkipMiddleware() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->shouldSkipMiddleware(); - } - /** - * Get the path to the cached services.php file. - * - * @return string - * @static - */ - public static function getCachedServicesPath() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getCachedServicesPath(); - } - /** - * Get the path to the cached packages.php file. - * - * @return string - * @static - */ - public static function getCachedPackagesPath() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getCachedPackagesPath(); - } - /** - * Determine if the application configuration is cached. - * - * @return bool - * @static - */ - public static function configurationIsCached() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->configurationIsCached(); - } - /** - * Get the path to the configuration cache file. - * - * @return string - * @static - */ - public static function getCachedConfigPath() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getCachedConfigPath(); - } - /** - * Determine if the application routes are cached. - * - * @return bool - * @static - */ - public static function routesAreCached() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->routesAreCached(); - } - /** - * Get the path to the routes cache file. - * - * @return string - * @static - */ - public static function getCachedRoutesPath() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getCachedRoutesPath(); - } - /** - * Determine if the application events are cached. - * - * @return bool - * @static - */ - public static function eventsAreCached() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->eventsAreCached(); - } - /** - * Get the path to the events cache file. - * - * @return string - * @static - */ - public static function getCachedEventsPath() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getCachedEventsPath(); - } - /** - * Determine if the application is currently down for maintenance. - * - * @return bool - * @static - */ - public static function isDownForMaintenance() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->isDownForMaintenance(); - } - /** - * Throw an HttpException with the given data. - * - * @param int $code - * @param string $message - * @param array $headers - * @return void - * @throws \Symfony\Component\HttpKernel\Exception\HttpException - * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException - * @static - */ - public static function abort($code, $message = '', $headers = []) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->abort($code, $message, $headers); - } - /** - * Register a terminating callback with the application. - * - * @param callable|string $callback - * @return \Illuminate\Foundation\Application - * @static - */ - public static function terminating($callback) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->terminating($callback); - } - /** - * Terminate the application. - * - * @return void - * @static - */ - public static function terminate() - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->terminate(); - } - /** - * Get the service providers that have been loaded. - * - * @return array - * @static - */ - public static function getLoadedProviders() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getLoadedProviders(); - } - /** - * Get the application's deferred services. - * - * @return array - * @static - */ - public static function getDeferredServices() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getDeferredServices(); - } - /** - * Set the application's deferred services. - * - * @param array $services - * @return void - * @static - */ - public static function setDeferredServices($services) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->setDeferredServices($services); - } - /** - * Add an array of services to the application's deferred services. - * - * @param array $services - * @return void - * @static - */ - public static function addDeferredServices($services) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->addDeferredServices($services); - } - /** - * Determine if the given service is a deferred service. - * - * @param string $service - * @return bool - * @static - */ - public static function isDeferredService($service) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->isDeferredService($service); - } - /** - * Configure the real-time facade namespace. - * - * @param string $namespace - * @return void - * @static - */ - public static function provideFacades($namespace) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->provideFacades($namespace); - } - /** - * Get the current application locale. - * - * @return string - * @static - */ - public static function getLocale() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getLocale(); - } - /** - * Set the current application locale. - * - * @param string $locale - * @return void - * @static - */ - public static function setLocale($locale) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->setLocale($locale); - } - /** - * Determine if application locale is the given locale. - * - * @param string $locale - * @return bool - * @static - */ - public static function isLocale($locale) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->isLocale($locale); - } - /** - * Register the core class aliases in the container. - * - * @return void - * @static - */ - public static function registerCoreContainerAliases() - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->registerCoreContainerAliases(); - } - /** - * Flush the container of all bindings and resolved instances. - * - * @return void - * @static - */ - public static function flush() - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->flush(); - } - /** - * Get the application namespace. - * - * @return string - * @throws \RuntimeException - * @static - */ - public static function getNamespace() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getNamespace(); - } - /** - * Define a contextual binding. - * - * @param array|string $concrete - * @return \Illuminate\Contracts\Container\ContextualBindingBuilder - * @static - */ - public static function when($concrete) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->when($concrete); - } - /** - * Returns true if the container can return an entry for the given identifier. - * - * Returns false otherwise. - * - * `has($id)` returning true does not mean that `get($id)` will not throw an exception. - * It does however mean that `get($id)` will not throw a `NotFoundExceptionInterface`. - * - * @param string $id Identifier of the entry to look for. - * @return bool - * @static - */ - public static function has($id) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->has($id); - } - /** - * Determine if the given abstract type has been resolved. - * - * @param string $abstract - * @return bool - * @static - */ - public static function resolved($abstract) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->resolved($abstract); - } - /** - * Determine if a given type is shared. - * - * @param string $abstract - * @return bool - * @static - */ - public static function isShared($abstract) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->isShared($abstract); - } - /** - * Determine if a given string is an alias. - * - * @param string $name - * @return bool - * @static - */ - public static function isAlias($name) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->isAlias($name); - } - /** - * Register a binding with the container. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @param bool $shared - * @return void - * @static - */ - public static function bind($abstract, $concrete = null, $shared = false) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->bind($abstract, $concrete, $shared); - } - /** - * Determine if the container has a method binding. - * - * @param string $method - * @return bool - * @static - */ - public static function hasMethodBinding($method) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->hasMethodBinding($method); - } - /** - * Bind a callback to resolve with Container::call. - * - * @param array|string $method - * @param \Closure $callback - * @return void - * @static - */ - public static function bindMethod($method, $callback) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->bindMethod($method, $callback); - } - /** - * Get the method binding for the given method. - * - * @param string $method - * @param mixed $instance - * @return mixed - * @static - */ - public static function callMethodBinding($method, $instance) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->callMethodBinding($method, $instance); - } - /** - * Add a contextual binding to the container. - * - * @param string $concrete - * @param string $abstract - * @param \Closure|string $implementation - * @return void - * @static - */ - public static function addContextualBinding($concrete, $abstract, $implementation) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->addContextualBinding($concrete, $abstract, $implementation); - } - /** - * Register a binding if it hasn't already been registered. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @param bool $shared - * @return void - * @static - */ - public static function bindIf($abstract, $concrete = null, $shared = false) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->bindIf($abstract, $concrete, $shared); - } - /** - * Register a shared binding in the container. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @return void - * @static - */ - public static function singleton($abstract, $concrete = null) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->singleton($abstract, $concrete); - } - /** - * Register a shared binding if it hasn't already been registered. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @return void - * @static - */ - public static function singletonIf($abstract, $concrete = null) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->singletonIf($abstract, $concrete); - } - /** - * "Extend" an abstract type in the container. - * - * @param string $abstract - * @param \Closure $closure - * @return void - * @throws \InvalidArgumentException - * @static - */ - public static function extend($abstract, $closure) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->extend($abstract, $closure); - } - /** - * Register an existing instance as shared in the container. - * - * @param string $abstract - * @param mixed $instance - * @return mixed - * @static - */ - public static function instance($abstract, $instance) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->instance($abstract, $instance); - } - /** - * Assign a set of tags to a given binding. - * - * @param array|string $abstracts - * @param array|mixed $tags - * @return void - * @static - */ - public static function tag($abstracts, $tags) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->tag($abstracts, $tags); - } - /** - * Resolve all of the bindings for a given tag. - * - * @param string $tag - * @return \Illuminate\Container\iterable - * @static - */ - public static function tagged($tag) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->tagged($tag); - } - /** - * Alias a type to a different name. - * - * @param string $abstract - * @param string $alias - * @return void - * @throws \LogicException - * @static - */ - public static function alias($abstract, $alias) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->alias($abstract, $alias); - } - /** - * Bind a new callback to an abstract's rebind event. - * - * @param string $abstract - * @param \Closure $callback - * @return mixed - * @static - */ - public static function rebinding($abstract, $callback) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->rebinding($abstract, $callback); - } - /** - * Refresh an instance on the given target and method. - * - * @param string $abstract - * @param mixed $target - * @param string $method - * @return mixed - * @static - */ - public static function refresh($abstract, $target, $method) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->refresh($abstract, $target, $method); - } - /** - * Wrap the given closure such that its dependencies will be injected when executed. - * - * @param \Closure $callback - * @param array $parameters - * @return \Closure - * @static - */ - public static function wrap($callback, $parameters = []) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->wrap($callback, $parameters); - } - /** - * Call the given Closure / class@method and inject its dependencies. - * - * @param callable|string $callback - * @param array $parameters - * @param string|null $defaultMethod - * @return mixed - * @static - */ - public static function call($callback, $parameters = [], $defaultMethod = null) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->call($callback, $parameters, $defaultMethod); - } - /** - * Get a closure to resolve the given type from the container. - * - * @param string $abstract - * @return \Closure - * @static - */ - public static function factory($abstract) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->factory($abstract); - } - /** - * An alias function name for make(). - * - * @param string $abstract - * @param array $parameters - * @return mixed - * @static - */ - public static function makeWith($abstract, $parameters = []) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->makeWith($abstract, $parameters); - } - /** - * Finds an entry of the container by its identifier and returns it. - * - * @param string $id Identifier of the entry to look for. - * @throws NotFoundExceptionInterface No entry was found for **this** identifier. - * @throws ContainerExceptionInterface Error while retrieving the entry. - * @return mixed Entry. - * @static - */ - public static function get($id) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->get($id); - } - /** - * Instantiate a concrete instance of the given type. - * - * @param string $concrete - * @return mixed - * @throws \Illuminate\Contracts\Container\BindingResolutionException - * @static - */ - public static function build($concrete) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->build($concrete); - } - /** - * Register a new resolving callback. - * - * @param \Closure|string $abstract - * @param \Closure|null $callback - * @return void - * @static - */ - public static function resolving($abstract, $callback = null) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->resolving($abstract, $callback); - } - /** - * Register a new after resolving callback for all types. - * - * @param \Closure|string $abstract - * @param \Closure|null $callback - * @return void - * @static - */ - public static function afterResolving($abstract, $callback = null) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->afterResolving($abstract, $callback); - } - /** - * Get the container's bindings. - * - * @return array - * @static - */ - public static function getBindings() - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getBindings(); - } - /** - * Get the alias for an abstract if available. - * - * @param string $abstract - * @return string - * @static - */ - public static function getAlias($abstract) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getAlias($abstract); - } - /** - * Remove all of the extender callbacks for a given type. - * - * @param string $abstract - * @return void - * @static - */ - public static function forgetExtenders($abstract) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->forgetExtenders($abstract); - } - /** - * Remove a resolved instance from the instance cache. - * - * @param string $abstract - * @return void - * @static - */ - public static function forgetInstance($abstract) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->forgetInstance($abstract); - } - /** - * Clear all of the instances from the container. - * - * @return void - * @static - */ - public static function forgetInstances() - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->forgetInstances(); - } - /** - * Get the globally available instance of the container. - * - * @return static - * @static - */ - public static function getInstance() - { //Method inherited from \Illuminate\Container\Container - return \Illuminate\Foundation\Application::getInstance(); - } - /** - * Set the shared instance of the container. - * - * @param \Illuminate\Contracts\Container\Container|null $container - * @return \Illuminate\Contracts\Container\Container|static - * @static - */ - public static function setInstance($container = null) - { //Method inherited from \Illuminate\Container\Container - return \Illuminate\Foundation\Application::setInstance($container); - } - /** - * Determine if a given offset exists. - * - * @param string $key - * @return bool - * @static - */ - public static function offsetExists($key) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->offsetExists($key); - } - /** - * Get the value at a given offset. - * - * @param string $key - * @return mixed - * @static - */ - public static function offsetGet($key) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->offsetGet($key); - } - /** - * Set the value at a given offset. - * - * @param string $key - * @param mixed $value - * @return void - * @static - */ - public static function offsetSet($key, $value) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->offsetSet($key, $value); - } - /** - * Unset the value at a given offset. - * - * @param string $key - * @return void - * @static - */ - public static function offsetUnset($key) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->offsetUnset($key); - } - - } - /** - * - * - * @see \Illuminate\Contracts\Console\Kernel - */ - class Artisan { - /** - * Run the console application. - * - * @param \Symfony\Component\Console\Input\InputInterface $input - * @param \Symfony\Component\Console\Output\OutputInterface|null $output - * @return int - * @static - */ - public static function handle($input, $output = null) - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - return $instance->handle($input, $output); - } - /** - * Terminate the application. - * - * @param \Symfony\Component\Console\Input\InputInterface $input - * @param int $status - * @return void - * @static - */ - public static function terminate($input, $status) - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - $instance->terminate($input, $status); - } - /** - * Register a Closure based command with the application. - * - * @param string $signature - * @param \Closure $callback - * @return \Illuminate\Foundation\Console\ClosureCommand - * @static - */ - public static function command($signature, $callback) - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - return $instance->command($signature, $callback); - } - /** - * Register the given command with the console application. - * - * @param \Symfony\Component\Console\Command\Command $command - * @return void - * @static - */ - public static function registerCommand($command) - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - $instance->registerCommand($command); - } - /** - * Run an Artisan console command by name. - * - * @param string $command - * @param array $parameters - * @param \Symfony\Component\Console\Output\OutputInterface|null $outputBuffer - * @return int - * @throws \Symfony\Component\Console\Exception\CommandNotFoundException - * @static - */ - public static function call($command, $parameters = [], $outputBuffer = null) - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - return $instance->call($command, $parameters, $outputBuffer); - } - /** - * Queue the given console command. - * - * @param string $command - * @param array $parameters - * @return \Illuminate\Foundation\Bus\PendingDispatch - * @static - */ - public static function queue($command, $parameters = []) - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - return $instance->queue($command, $parameters); - } - /** - * Get all of the commands registered with the console. - * - * @return array - * @static - */ - public static function all() - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - return $instance->all(); - } - /** - * Get the output for the last run command. - * - * @return string - * @static - */ - public static function output() - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - return $instance->output(); - } - /** - * Bootstrap the application for artisan commands. - * - * @return void - * @static - */ - public static function bootstrap() - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - $instance->bootstrap(); - } - /** - * Set the Artisan application instance. - * - * @param \Illuminate\Console\Application $artisan - * @return void - * @static - */ - public static function setArtisan($artisan) - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - $instance->setArtisan($artisan); - } - - } - /** - * - * - * @method static bool attempt(array $credentials = [], bool $remember = false) - * @method static bool once(array $credentials = []) - * @method static void login(\Illuminate\Contracts\Auth\Authenticatable $user, bool $remember = false) - * @method static \Illuminate\Contracts\Auth\Authenticatable loginUsingId(mixed $id, bool $remember = false) - * @method static bool onceUsingId(mixed $id) - * @method static bool viaRemember() - * @method static void logout() - * @method static \Symfony\Component\HttpFoundation\Response|null onceBasic(string $field = 'email',array $extraConditions = []) - * @method static bool|null logoutOtherDevices(string $password, string $attribute = 'password') - * @see \Illuminate\Auth\AuthManager - * @see \Illuminate\Contracts\Auth\Factory - * @see \Illuminate\Contracts\Auth\Guard - * @see \Illuminate\Contracts\Auth\StatefulGuard - */ - class Auth { - /** - * Attempt to get the guard from the local cache. - * - * @param string|null $name - * @return \Illuminate\Contracts\Auth\Guard|\Illuminate\Contracts\Auth\StatefulGuard - * @static - */ - public static function guard($name = null) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->guard($name); - } - /** - * Create a session based authentication guard. - * - * @param string $name - * @param array $config - * @return \Illuminate\Auth\SessionGuard - * @static - */ - public static function createSessionDriver($name, $config) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->createSessionDriver($name, $config); - } - /** - * Create a token based authentication guard. - * - * @param string $name - * @param array $config - * @return \Illuminate\Auth\TokenGuard - * @static - */ - public static function createTokenDriver($name, $config) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->createTokenDriver($name, $config); - } - /** - * Get the default authentication driver name. - * - * @return string - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Set the default guard driver the factory should serve. - * - * @param string $name - * @return void - * @static - */ - public static function shouldUse($name) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - $instance->shouldUse($name); - } - /** - * Set the default authentication driver name. - * - * @param string $name - * @return void - * @static - */ - public static function setDefaultDriver($name) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - $instance->setDefaultDriver($name); - } - /** - * Register a new callback based request guard. - * - * @param string $driver - * @param callable $callback - * @return \Illuminate\Auth\AuthManager - * @static - */ - public static function viaRequest($driver, $callback) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->viaRequest($driver, $callback); - } - /** - * Get the user resolver callback. - * - * @return \Closure - * @static - */ - public static function userResolver() - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->userResolver(); - } - /** - * Set the callback to be used to resolve users. - * - * @param \Closure $userResolver - * @return \Illuminate\Auth\AuthManager - * @static - */ - public static function resolveUsersUsing($userResolver) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->resolveUsersUsing($userResolver); - } - /** - * Register a custom driver creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return \Illuminate\Auth\AuthManager - * @static - */ - public static function extend($driver, $callback) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->extend($driver, $callback); - } - /** - * Register a custom provider creator Closure. - * - * @param string $name - * @param \Closure $callback - * @return \Illuminate\Auth\AuthManager - * @static - */ - public static function provider($name, $callback) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->provider($name, $callback); - } - /** - * Determines if any guards have already been resolved. - * - * @return bool - * @static - */ - public static function hasResolvedGuards() - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->hasResolvedGuards(); - } - /** - * Create the user provider implementation for the driver. - * - * @param string|null $provider - * @return \Illuminate\Contracts\Auth\UserProvider|null - * @throws \InvalidArgumentException - * @static - */ - public static function createUserProvider($provider = null) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->createUserProvider($provider); - } - /** - * Get the default user provider name. - * - * @return string - * @static - */ - public static function getDefaultUserProvider() - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->getDefaultUserProvider(); - } - /** - * Get the currently authenticated user. - * - * @return \App\Models\User|null - * @static - */ - public static function user() - { - /** @var \Illuminate\Auth\RequestGuard $instance */ - return $instance->user(); - } - /** - * Validate a user's credentials. - * - * @param array $credentials - * @return bool - * @static - */ - public static function validate($credentials = []) - { - /** @var \Illuminate\Auth\RequestGuard $instance */ - return $instance->validate($credentials); - } - /** - * Set the current request instance. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Auth\RequestGuard - * @static - */ - public static function setRequest($request) - { - /** @var \Illuminate\Auth\RequestGuard $instance */ - return $instance->setRequest($request); - } - /** - * Determine if current user is authenticated. If not, throw an exception. - * - * @return \App\Models\User - * @throws \Illuminate\Auth\AuthenticationException - * @static - */ - public static function authenticate() - { - /** @var \Illuminate\Auth\RequestGuard $instance */ - return $instance->authenticate(); - } - /** - * Determine if the guard has a user instance. - * - * @return bool - * @static - */ - public static function hasUser() - { - /** @var \Illuminate\Auth\RequestGuard $instance */ - return $instance->hasUser(); - } - /** - * Determine if the current user is authenticated. - * - * @return bool - * @static - */ - public static function check() - { - /** @var \Illuminate\Auth\RequestGuard $instance */ - return $instance->check(); - } - /** - * Determine if the current user is a guest. - * - * @return bool - * @static - */ - public static function guest() - { - /** @var \Illuminate\Auth\RequestGuard $instance */ - return $instance->guest(); - } - /** - * Get the ID for the currently authenticated user. - * - * @return int|null - * @static - */ - public static function id() - { - /** @var \Illuminate\Auth\RequestGuard $instance */ - return $instance->id(); - } - /** - * Set the current user. - * - * @param \Illuminate\Contracts\Auth\Authenticatable $user - * @return \Illuminate\Auth\RequestGuard - * @static - */ - public static function setUser($user) - { - /** @var \Illuminate\Auth\RequestGuard $instance */ - return $instance->setUser($user); - } - /** - * Get the user provider used by the guard. - * - * @return \Illuminate\Contracts\Auth\UserProvider - * @static - */ - public static function getProvider() - { - /** @var \Illuminate\Auth\RequestGuard $instance */ - return $instance->getProvider(); - } - /** - * Set the user provider used by the guard. - * - * @param \Illuminate\Contracts\Auth\UserProvider $provider - * @return void - * @static - */ - public static function setProvider($provider) - { - /** @var \Illuminate\Auth\RequestGuard $instance */ - $instance->setProvider($provider); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Auth\RequestGuard::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Auth\RequestGuard::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Auth\RequestGuard::hasMacro($name); - } - - } - /** - * - * - * @see \Illuminate\View\Compilers\BladeCompiler - */ - class Blade { - /** - * Compile the view at the given path. - * - * @param string|null $path - * @return void - * @static - */ - public static function compile($path = null) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->compile($path); - } - /** - * Get the path currently being compiled. - * - * @return string - * @static - */ - public static function getPath() - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->getPath(); - } - /** - * Set the path currently being compiled. - * - * @param string $path - * @return void - * @static - */ - public static function setPath($path) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->setPath($path); - } - /** - * Compile the given Blade template contents. - * - * @param string $value - * @return string - * @static - */ - public static function compileString($value) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->compileString($value); - } - /** - * Strip the parentheses from the given expression. - * - * @param string $expression - * @return string - * @static - */ - public static function stripParentheses($expression) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->stripParentheses($expression); - } - /** - * Register a custom Blade compiler. - * - * @param callable $compiler - * @return void - * @static - */ - public static function extend($compiler) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->extend($compiler); - } - /** - * Get the extensions used by the compiler. - * - * @return array - * @static - */ - public static function getExtensions() - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->getExtensions(); - } - /** - * Register an "if" statement directive. - * - * @param string $name - * @param callable $callback - * @return void - * @static - */ - public static function if($name, $callback) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->if($name, $callback); - } - /** - * Check the result of a condition. - * - * @param string $name - * @param array $parameters - * @return bool - * @static - */ - public static function check($name, ...$parameters) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->check($name, ...$parameters); - } - /** - * Register a component alias directive. - * - * @param string $path - * @param string|null $alias - * @return void - * @static - */ - public static function component($path, $alias = null) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->component($path, $alias); - } - /** - * Register an include alias directive. - * - * @param string $path - * @param string|null $alias - * @return void - * @static - */ - public static function include($path, $alias = null) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->include($path, $alias); - } - /** - * Register a handler for custom directives. - * - * @param string $name - * @param callable $handler - * @return void - * @throws \InvalidArgumentException - * @static - */ - public static function directive($name, $handler) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->directive($name, $handler); - } - /** - * Get the list of custom directives. - * - * @return array - * @static - */ - public static function getCustomDirectives() - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->getCustomDirectives(); - } - /** - * Set the echo format to be used by the compiler. - * - * @param string $format - * @return void - * @static - */ - public static function setEchoFormat($format) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->setEchoFormat($format); - } - /** - * Set the "echo" format to double encode entities. - * - * @return void - * @static - */ - public static function withDoubleEncoding() - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->withDoubleEncoding(); - } - /** - * Set the "echo" format to not double encode entities. - * - * @return void - * @static - */ - public static function withoutDoubleEncoding() - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->withoutDoubleEncoding(); - } - /** - * Get the path to the compiled version of a view. - * - * @param string $path - * @return string - * @static - */ - public static function getCompiledPath($path) - { //Method inherited from \Illuminate\View\Compilers\Compiler - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->getCompiledPath($path); - } - /** - * Determine if the view at the given path is expired. - * - * @param string $path - * @return bool - * @static - */ - public static function isExpired($path) - { //Method inherited from \Illuminate\View\Compilers\Compiler - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->isExpired($path); - } - - } - /** - * - * - * @method static \Illuminate\Broadcasting\Broadcasters\Broadcaster channel(string $channel, callable|string $callback, array $options = []) - * @method static mixed auth(\Illuminate\Http\Request $request) - * @see \Illuminate\Contracts\Broadcasting\Factory - */ - class Broadcast { - /** - * Register the routes for handling broadcast authentication and sockets. - * - * @param array|null $attributes - * @return void - * @static - */ - public static function routes($attributes = null) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - $instance->routes($attributes); - } - /** - * Get the socket ID for the given request. - * - * @param \Illuminate\Http\Request|null $request - * @return string|null - * @static - */ - public static function socket($request = null) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - return $instance->socket($request); - } - /** - * Begin broadcasting an event. - * - * @param mixed|null $event - * @return \Illuminate\Broadcasting\PendingBroadcast - * @static - */ - public static function event($event = null) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - return $instance->event($event); - } - /** - * Queue the given event for broadcast. - * - * @param mixed $event - * @return void - * @static - */ - public static function queue($event) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - $instance->queue($event); - } - /** - * Get a driver instance. - * - * @param string|null $driver - * @return mixed - * @static - */ - public static function connection($driver = null) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - return $instance->connection($driver); - } - /** - * Get a driver instance. - * - * @param string|null $name - * @return mixed - * @static - */ - public static function driver($name = null) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - return $instance->driver($name); - } - /** - * Get the default driver name. - * - * @return string - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Set the default driver name. - * - * @param string $name - * @return void - * @static - */ - public static function setDefaultDriver($name) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - $instance->setDefaultDriver($name); - } - /** - * Register a custom driver creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return \Illuminate\Broadcasting\BroadcastManager - * @static - */ - public static function extend($driver, $callback) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - return $instance->extend($driver, $callback); - } - - } - /** - * - * - * @see \Illuminate\Contracts\Bus\Dispatcher - */ - class Bus { - /** - * Dispatch a command to its appropriate handler. - * - * @param mixed $command - * @return mixed - * @static - */ - public static function dispatch($command) - { - /** @var \Illuminate\Bus\Dispatcher $instance */ - return $instance->dispatch($command); - } - /** - * Dispatch a command to its appropriate handler in the current process. - * - * @param mixed $command - * @param mixed $handler - * @return mixed - * @static - */ - public static function dispatchNow($command, $handler = null) - { - /** @var \Illuminate\Bus\Dispatcher $instance */ - return $instance->dispatchNow($command, $handler); - } - /** - * Determine if the given command has a handler. - * - * @param mixed $command - * @return bool - * @static - */ - public static function hasCommandHandler($command) - { - /** @var \Illuminate\Bus\Dispatcher $instance */ - return $instance->hasCommandHandler($command); - } - /** - * Retrieve the handler for a command. - * - * @param mixed $command - * @return bool|mixed - * @static - */ - public static function getCommandHandler($command) - { - /** @var \Illuminate\Bus\Dispatcher $instance */ - return $instance->getCommandHandler($command); - } - /** - * Dispatch a command to its appropriate handler behind a queue. - * - * @param mixed $command - * @return mixed - * @static - */ - public static function dispatchToQueue($command) - { - /** @var \Illuminate\Bus\Dispatcher $instance */ - return $instance->dispatchToQueue($command); - } - /** - * Dispatch a command to its appropriate handler after the current process. - * - * @param mixed $command - * @param mixed $handler - * @return void - * @static - */ - public static function dispatchAfterResponse($command, $handler = null) - { - /** @var \Illuminate\Bus\Dispatcher $instance */ - $instance->dispatchAfterResponse($command, $handler); - } - /** - * Set the pipes through which commands should be piped before dispatching. - * - * @param array $pipes - * @return \Illuminate\Bus\Dispatcher - * @static - */ - public static function pipeThrough($pipes) - { - /** @var \Illuminate\Bus\Dispatcher $instance */ - return $instance->pipeThrough($pipes); - } - /** - * Map a command to a handler. - * - * @param array $map - * @return \Illuminate\Bus\Dispatcher - * @static - */ - public static function map($map) - { - /** @var \Illuminate\Bus\Dispatcher $instance */ - return $instance->map($map); - } - /** - * Assert if a job was dispatched based on a truth-test callback. - * - * @param string $command - * @param callable|int|null $callback - * @return void - * @static - */ - public static function assertDispatched($command, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertDispatched($command, $callback); - } - /** - * Assert if a job was pushed a number of times. - * - * @param string $command - * @param int $times - * @return void - * @static - */ - public static function assertDispatchedTimes($command, $times = 1) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertDispatchedTimes($command, $times); - } - /** - * Determine if a job was dispatched based on a truth-test callback. - * - * @param string $command - * @param callable|null $callback - * @return void - * @static - */ - public static function assertNotDispatched($command, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertNotDispatched($command, $callback); - } - /** - * Assert if a job was dispatched after the response was sent based on a truth-test callback. - * - * @param string $command - * @param callable|int|null $callback - * @return void - * @static - */ - public static function assertDispatchedAfterResponse($command, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertDispatchedAfterResponse($command, $callback); - } - /** - * Assert if a job was pushed after the response was sent a number of times. - * - * @param string $command - * @param int $times - * @return void - * @static - */ - public static function assertDispatchedAfterResponseTimes($command, $times = 1) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertDispatchedAfterResponseTimes($command, $times); - } - /** - * Determine if a job was dispatched based on a truth-test callback. - * - * @param string $command - * @param callable|null $callback - * @return void - * @static - */ - public static function assertNotDispatchedAfterResponse($command, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertNotDispatchedAfterResponse($command, $callback); - } - /** - * Get all of the jobs matching a truth-test callback. - * - * @param string $command - * @param callable|null $callback - * @return \Illuminate\Support\Collection - * @static - */ - public static function dispatched($command, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - return $instance->dispatched($command, $callback); - } - /** - * Get all of the jobs dispatched after the response was sent matching a truth-test callback. - * - * @param string $command - * @param callable|null $callback - * @return \Illuminate\Support\Collection - * @static - */ - public static function dispatchedAfterResponse($command, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - return $instance->dispatchedAfterResponse($command, $callback); - } - /** - * Determine if there are any stored commands for a given class. - * - * @param string $command - * @return bool - * @static - */ - public static function hasDispatched($command) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - return $instance->hasDispatched($command); - } - /** - * Determine if there are any stored commands for a given class. - * - * @param string $command - * @return bool - * @static - */ - public static function hasDispatchedAfterResponse($command) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - return $instance->hasDispatchedAfterResponse($command); - } - - } - /** - * - * - * @see \Illuminate\Cache\CacheManager - * @see \Illuminate\Cache\Repository - */ - class Cache { - /** - * Get a cache store instance by name, wrapped in a repository. - * - * @param string|null $name - * @return \Illuminate\Contracts\Cache\Repository - * @static - */ - public static function store($name = null) - { - /** @var \Illuminate\Cache\CacheManager $instance */ - return $instance->store($name); - } - /** - * Get a cache driver instance. - * - * @param string|null $driver - * @return \Illuminate\Contracts\Cache\Repository - * @static - */ - public static function driver($driver = null) - { - /** @var \Illuminate\Cache\CacheManager $instance */ - return $instance->driver($driver); - } - /** - * Create a new cache repository with the given implementation. - * - * @param \Illuminate\Contracts\Cache\Store $store - * @return \Illuminate\Cache\Repository - * @static - */ - public static function repository($store) - { - /** @var \Illuminate\Cache\CacheManager $instance */ - return $instance->repository($store); - } - /** - * Re-set the event dispatcher on all resolved cache repositories. - * - * @return void - * @static - */ - public static function refreshEventDispatcher() - { - /** @var \Illuminate\Cache\CacheManager $instance */ - $instance->refreshEventDispatcher(); - } - /** - * Get the default cache driver name. - * - * @return string - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Cache\CacheManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Set the default cache driver name. - * - * @param string $name - * @return void - * @static - */ - public static function setDefaultDriver($name) - { - /** @var \Illuminate\Cache\CacheManager $instance */ - $instance->setDefaultDriver($name); - } - /** - * Unset the given driver instances. - * - * @param array|string|null $name - * @return \Illuminate\Cache\CacheManager - * @static - */ - public static function forgetDriver($name = null) - { - /** @var \Illuminate\Cache\CacheManager $instance */ - return $instance->forgetDriver($name); - } - /** - * Register a custom driver creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return \Illuminate\Cache\CacheManager - * @static - */ - public static function extend($driver, $callback) - { - /** @var \Illuminate\Cache\CacheManager $instance */ - return $instance->extend($driver, $callback); - } - /** - * Determine if an item exists in the cache. - * - * @param string $key - * @return bool - * @static - */ - public static function has($key) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->has($key); - } - /** - * Determine if an item doesn't exist in the cache. - * - * @param string $key - * @return bool - * @static - */ - public static function missing($key) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->missing($key); - } - /** - * Retrieve an item from the cache by key. - * - * @param string $key - * @param mixed $default - * @return mixed - * @static - */ - public static function get($key, $default = null) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->get($key, $default); - } - /** - * Retrieve multiple items from the cache by key. - * - * Items not found in the cache will have a null value. - * - * @param array $keys - * @return array - * @static - */ - public static function many($keys) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->many($keys); - } - /** - * Obtains multiple cache items by their unique keys. - * - * @param \Psr\SimpleCache\iterable $keys A list of keys that can obtained in a single operation. - * @param mixed $default Default value to return for keys that do not exist. - * @return \Psr\SimpleCache\iterable A list of key => value pairs. Cache keys that do not exist or are stale will have $default as value. - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if $keys is neither an array nor a Traversable, - * or if any of the $keys are not a legal value. - * @static - */ - public static function getMultiple($keys, $default = null) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->getMultiple($keys, $default); - } - /** - * Retrieve an item from the cache and delete it. - * - * @param string $key - * @param mixed $default - * @return mixed - * @static - */ - public static function pull($key, $default = null) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->pull($key, $default); - } - /** - * Store an item in the cache. - * - * @param string $key - * @param mixed $value - * @param \DateTimeInterface|\DateInterval|int|null $ttl - * @return bool - * @static - */ - public static function put($key, $value, $ttl = null) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->put($key, $value, $ttl); - } - /** - * Persists data in the cache, uniquely referenced by a key with an optional expiration TTL time. - * - * @param string $key The key of the item to store. - * @param mixed $value The value of the item to store, must be serializable. - * @param null|int|\DateInterval $ttl Optional. The TTL value of this item. If no value is sent and - * the driver supports TTL then the library may set a default value - * for it or let the driver take care of that. - * @return bool True on success and false on failure. - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if the $key string is not a legal value. - * @static - */ - public static function set($key, $value, $ttl = null) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->set($key, $value, $ttl); - } - /** - * Store multiple items in the cache for a given number of seconds. - * - * @param array $values - * @param \DateTimeInterface|\DateInterval|int|null $ttl - * @return bool - * @static - */ - public static function putMany($values, $ttl = null) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->putMany($values, $ttl); - } - /** - * Persists a set of key => value pairs in the cache, with an optional TTL. - * - * @param \Psr\SimpleCache\iterable $values A list of key => value pairs for a multiple-set operation. - * @param null|int|\DateInterval $ttl Optional. The TTL value of this item. If no value is sent and - * the driver supports TTL then the library may set a default value - * for it or let the driver take care of that. - * @return bool True on success and false on failure. - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if $values is neither an array nor a Traversable, - * or if any of the $values are not a legal value. - * @static - */ - public static function setMultiple($values, $ttl = null) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->setMultiple($values, $ttl); - } - /** - * Store an item in the cache if the key does not exist. - * - * @param string $key - * @param mixed $value - * @param \DateTimeInterface|\DateInterval|int|null $ttl - * @return bool - * @static - */ - public static function add($key, $value, $ttl = null) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->add($key, $value, $ttl); - } - /** - * Increment the value of an item in the cache. - * - * @param string $key - * @param mixed $value - * @return int|bool - * @static - */ - public static function increment($key, $value = 1) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->increment($key, $value); - } - /** - * Decrement the value of an item in the cache. - * - * @param string $key - * @param mixed $value - * @return int|bool - * @static - */ - public static function decrement($key, $value = 1) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->decrement($key, $value); - } - /** - * Store an item in the cache indefinitely. - * - * @param string $key - * @param mixed $value - * @return bool - * @static - */ - public static function forever($key, $value) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->forever($key, $value); - } - /** - * Get an item from the cache, or execute the given Closure and store the result. - * - * @param string $key - * @param \DateTimeInterface|\DateInterval|int|null $ttl - * @param \Closure $callback - * @return mixed - * @static - */ - public static function remember($key, $ttl, $callback) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->remember($key, $ttl, $callback); - } - /** - * Get an item from the cache, or execute the given Closure and store the result forever. - * - * @param string $key - * @param \Closure $callback - * @return mixed - * @static - */ - public static function sear($key, $callback) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->sear($key, $callback); - } - /** - * Get an item from the cache, or execute the given Closure and store the result forever. - * - * @param string $key - * @param \Closure $callback - * @return mixed - * @static - */ - public static function rememberForever($key, $callback) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->rememberForever($key, $callback); - } - /** - * Remove an item from the cache. - * - * @param string $key - * @return bool - * @static - */ - public static function forget($key) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->forget($key); - } - /** - * Delete an item from the cache by its unique key. - * - * @param string $key The unique cache key of the item to delete. - * @return bool True if the item was successfully removed. False if there was an error. - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if the $key string is not a legal value. - * @static - */ - public static function delete($key) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->delete($key); - } - /** - * Deletes multiple cache items in a single operation. - * - * @param \Psr\SimpleCache\iterable $keys A list of string-based keys to be deleted. - * @return bool True if the items were successfully removed. False if there was an error. - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if $keys is neither an array nor a Traversable, - * or if any of the $keys are not a legal value. - * @static - */ - public static function deleteMultiple($keys) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->deleteMultiple($keys); - } - /** - * Wipes clean the entire cache's keys. - * - * @return bool True on success and false on failure. - * @static - */ - public static function clear() - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->clear(); - } - /** - * Begin executing a new tags operation if the store supports it. - * - * @param array|mixed $names - * @return \Illuminate\Cache\TaggedCache - * @throws \BadMethodCallException - * @static - */ - public static function tags($names) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->tags($names); - } - /** - * Get the default cache time. - * - * @return int|null - * @static - */ - public static function getDefaultCacheTime() - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->getDefaultCacheTime(); - } - /** - * Set the default cache time in seconds. - * - * @param int|null $seconds - * @return \Illuminate\Cache\Repository - * @static - */ - public static function setDefaultCacheTime($seconds) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->setDefaultCacheTime($seconds); - } - /** - * Get the cache store implementation. - * - * @return \Illuminate\Contracts\Cache\Store - * @static - */ - public static function getStore() - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->getStore(); - } - /** - * Get the event dispatcher instance. - * - * @return \Illuminate\Contracts\Events\Dispatcher - * @static - */ - public static function getEventDispatcher() - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->getEventDispatcher(); - } - /** - * Set the event dispatcher instance. - * - * @param \Illuminate\Contracts\Events\Dispatcher $events - * @return void - * @static - */ - public static function setEventDispatcher($events) - { - /** @var \Illuminate\Cache\Repository $instance */ - $instance->setEventDispatcher($events); - } - /** - * Determine if a cached value exists. - * - * @param string $key - * @return bool - * @static - */ - public static function offsetExists($key) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->offsetExists($key); - } - /** - * Retrieve an item from the cache by key. - * - * @param string $key - * @return mixed - * @static - */ - public static function offsetGet($key) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->offsetGet($key); - } - /** - * Store an item in the cache for the default time. - * - * @param string $key - * @param mixed $value - * @return void - * @static - */ - public static function offsetSet($key, $value) - { - /** @var \Illuminate\Cache\Repository $instance */ - $instance->offsetSet($key, $value); - } - /** - * Remove an item from the cache. - * - * @param string $key - * @return void - * @static - */ - public static function offsetUnset($key) - { - /** @var \Illuminate\Cache\Repository $instance */ - $instance->offsetUnset($key); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Cache\Repository::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Cache\Repository::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Cache\Repository::hasMacro($name); - } - /** - * Dynamically handle calls to the class. - * - * @param string $method - * @param array $parameters - * @return mixed - * @throws \BadMethodCallException - * @static - */ - public static function macroCall($method, $parameters) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->macroCall($method, $parameters); - } - /** - * Remove all items from the cache. - * - * @return bool - * @static - */ - public static function flush() - { - /** @var \Illuminate\Cache\FileStore $instance */ - return $instance->flush(); - } - /** - * Get the Filesystem instance. - * - * @return \Illuminate\Filesystem\Filesystem - * @static - */ - public static function getFilesystem() - { - /** @var \Illuminate\Cache\FileStore $instance */ - return $instance->getFilesystem(); - } - /** - * Get the working directory of the cache. - * - * @return string - * @static - */ - public static function getDirectory() - { - /** @var \Illuminate\Cache\FileStore $instance */ - return $instance->getDirectory(); - } - /** - * Get the cache key prefix. - * - * @return string - * @static - */ - public static function getPrefix() - { - /** @var \Illuminate\Cache\FileStore $instance */ - return $instance->getPrefix(); - } - - } - /** - * - * - * @see \Illuminate\Config\Repository - */ - class Config { - /** - * Determine if the given configuration value exists. - * - * @param string $key - * @return bool - * @static - */ - public static function has($key) - { - /** @var \Illuminate\Config\Repository $instance */ - return $instance->has($key); - } - /** - * Get the specified configuration value. - * - * @param array|string $key - * @param mixed $default - * @return mixed - * @static - */ - public static function get($key, $default = null) - { - /** @var \Illuminate\Config\Repository $instance */ - return $instance->get($key, $default); - } - /** - * Get many configuration values. - * - * @param array $keys - * @return array - * @static - */ - public static function getMany($keys) - { - /** @var \Illuminate\Config\Repository $instance */ - return $instance->getMany($keys); - } - /** - * Set a given configuration value. - * - * @param array|string $key - * @param mixed $value - * @return void - * @static - */ - public static function set($key, $value = null) - { - /** @var \Illuminate\Config\Repository $instance */ - $instance->set($key, $value); - } - /** - * Prepend a value onto an array configuration value. - * - * @param string $key - * @param mixed $value - * @return void - * @static - */ - public static function prepend($key, $value) - { - /** @var \Illuminate\Config\Repository $instance */ - $instance->prepend($key, $value); - } - /** - * Push a value onto an array configuration value. - * - * @param string $key - * @param mixed $value - * @return void - * @static - */ - public static function push($key, $value) - { - /** @var \Illuminate\Config\Repository $instance */ - $instance->push($key, $value); - } - /** - * Get all of the configuration items for the application. - * - * @return array - * @static - */ - public static function all() - { - /** @var \Illuminate\Config\Repository $instance */ - return $instance->all(); - } - /** - * Determine if the given configuration option exists. - * - * @param string $key - * @return bool - * @static - */ - public static function offsetExists($key) - { - /** @var \Illuminate\Config\Repository $instance */ - return $instance->offsetExists($key); - } - /** - * Get a configuration option. - * - * @param string $key - * @return mixed - * @static - */ - public static function offsetGet($key) - { - /** @var \Illuminate\Config\Repository $instance */ - return $instance->offsetGet($key); - } - /** - * Set a configuration option. - * - * @param string $key - * @param mixed $value - * @return void - * @static - */ - public static function offsetSet($key, $value) - { - /** @var \Illuminate\Config\Repository $instance */ - $instance->offsetSet($key, $value); - } - /** - * Unset a configuration option. - * - * @param string $key - * @return void - * @static - */ - public static function offsetUnset($key) - { - /** @var \Illuminate\Config\Repository $instance */ - $instance->offsetUnset($key); - } - - } - /** - * - * - * @see \Illuminate\Cookie\CookieJar - */ - class Cookie { - /** - * Create a new cookie instance. - * - * @param string $name - * @param string $value - * @param int $minutes - * @param string|null $path - * @param string|null $domain - * @param bool|null $secure - * @param bool $httpOnly - * @param bool $raw - * @param string|null $sameSite - * @return \Symfony\Component\HttpFoundation\Cookie - * @static - */ - public static function make($name, $value, $minutes = 0, $path = null, $domain = null, $secure = null, $httpOnly = true, $raw = false, $sameSite = null) - { - /** @var \Illuminate\Cookie\CookieJar $instance */ - return $instance->make($name, $value, $minutes, $path, $domain, $secure, $httpOnly, $raw, $sameSite); - } - /** - * Create a cookie that lasts "forever" (five years). - * - * @param string $name - * @param string $value - * @param string|null $path - * @param string|null $domain - * @param bool|null $secure - * @param bool $httpOnly - * @param bool $raw - * @param string|null $sameSite - * @return \Symfony\Component\HttpFoundation\Cookie - * @static - */ - public static function forever($name, $value, $path = null, $domain = null, $secure = null, $httpOnly = true, $raw = false, $sameSite = null) - { - /** @var \Illuminate\Cookie\CookieJar $instance */ - return $instance->forever($name, $value, $path, $domain, $secure, $httpOnly, $raw, $sameSite); - } - /** - * Expire the given cookie. - * - * @param string $name - * @param string|null $path - * @param string|null $domain - * @return \Symfony\Component\HttpFoundation\Cookie - * @static - */ - public static function forget($name, $path = null, $domain = null) - { - /** @var \Illuminate\Cookie\CookieJar $instance */ - return $instance->forget($name, $path, $domain); - } - /** - * Determine if a cookie has been queued. - * - * @param string $key - * @param string|null $path - * @return bool - * @static - */ - public static function hasQueued($key, $path = null) - { - /** @var \Illuminate\Cookie\CookieJar $instance */ - return $instance->hasQueued($key, $path); - } - /** - * Get a queued cookie instance. - * - * @param string $key - * @param mixed $default - * @param string|null $path - * @return \Symfony\Component\HttpFoundation\Cookie - * @static - */ - public static function queued($key, $default = null, $path = null) - { - /** @var \Illuminate\Cookie\CookieJar $instance */ - return $instance->queued($key, $default, $path); - } - /** - * Queue a cookie to send with the next response. - * - * @param array $parameters - * @return void - * @static - */ - public static function queue(...$parameters) - { - /** @var \Illuminate\Cookie\CookieJar $instance */ - $instance->queue(...$parameters); - } - /** - * Remove a cookie from the queue. - * - * @param string $name - * @param string|null $path - * @return void - * @static - */ - public static function unqueue($name, $path = null) - { - /** @var \Illuminate\Cookie\CookieJar $instance */ - $instance->unqueue($name, $path); - } - /** - * Set the default path and domain for the jar. - * - * @param string $path - * @param string $domain - * @param bool $secure - * @param string|null $sameSite - * @return \Illuminate\Cookie\CookieJar - * @static - */ - public static function setDefaultPathAndDomain($path, $domain, $secure = false, $sameSite = null) - { - /** @var \Illuminate\Cookie\CookieJar $instance */ - return $instance->setDefaultPathAndDomain($path, $domain, $secure, $sameSite); - } - /** - * Get the cookies which have been queued for the next request. - * - * @return \Symfony\Component\HttpFoundation\Cookie[] - * @static - */ - public static function getQueuedCookies() - { - /** @var \Illuminate\Cookie\CookieJar $instance */ - return $instance->getQueuedCookies(); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Cookie\CookieJar::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Cookie\CookieJar::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Cookie\CookieJar::hasMacro($name); - } - - } - /** - * - * - * @see \Illuminate\Encryption\Encrypter - */ - class Crypt { - /** - * Determine if the given key and cipher combination is valid. - * - * @param string $key - * @param string $cipher - * @return bool - * @static - */ - public static function supported($key, $cipher) - { - return \Illuminate\Encryption\Encrypter::supported($key, $cipher); - } - /** - * Create a new encryption key for the given cipher. - * - * @param string $cipher - * @return string - * @static - */ - public static function generateKey($cipher) - { - return \Illuminate\Encryption\Encrypter::generateKey($cipher); - } - /** - * Encrypt the given value. - * - * @param mixed $value - * @param bool $serialize - * @return string - * @throws \Illuminate\Contracts\Encryption\EncryptException - * @static - */ - public static function encrypt($value, $serialize = true) - { - /** @var \Illuminate\Encryption\Encrypter $instance */ - return $instance->encrypt($value, $serialize); - } - /** - * Encrypt a string without serialization. - * - * @param string $value - * @return string - * @throws \Illuminate\Contracts\Encryption\EncryptException - * @static - */ - public static function encryptString($value) - { - /** @var \Illuminate\Encryption\Encrypter $instance */ - return $instance->encryptString($value); - } - /** - * Decrypt the given value. - * - * @param string $payload - * @param bool $unserialize - * @return mixed - * @throws \Illuminate\Contracts\Encryption\DecryptException - * @static - */ - public static function decrypt($payload, $unserialize = true) - { - /** @var \Illuminate\Encryption\Encrypter $instance */ - return $instance->decrypt($payload, $unserialize); - } - /** - * Decrypt the given string without unserialization. - * - * @param string $payload - * @return string - * @throws \Illuminate\Contracts\Encryption\DecryptException - * @static - */ - public static function decryptString($payload) - { - /** @var \Illuminate\Encryption\Encrypter $instance */ - return $instance->decryptString($payload); - } - /** - * Get the encryption key. - * - * @return string - * @static - */ - public static function getKey() - { - /** @var \Illuminate\Encryption\Encrypter $instance */ - return $instance->getKey(); - } - - } - /** - * - * - * @see \Illuminate\Database\DatabaseManager - * @see \Illuminate\Database\Connection - */ - class DB { - /** - * Get a database connection instance. - * - * @param string|null $name - * @return \Illuminate\Database\Connection - * @static - */ - public static function connection($name = null) - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - return $instance->connection($name); - } - /** - * Disconnect from the given database and remove from local cache. - * - * @param string|null $name - * @return void - * @static - */ - public static function purge($name = null) - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - $instance->purge($name); - } - /** - * Disconnect from the given database. - * - * @param string|null $name - * @return void - * @static - */ - public static function disconnect($name = null) - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - $instance->disconnect($name); - } - /** - * Reconnect to the given database. - * - * @param string|null $name - * @return \Illuminate\Database\Connection - * @static - */ - public static function reconnect($name = null) - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - return $instance->reconnect($name); - } - /** - * Get the default connection name. - * - * @return string - * @static - */ - public static function getDefaultConnection() - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - return $instance->getDefaultConnection(); - } - /** - * Set the default connection name. - * - * @param string $name - * @return void - * @static - */ - public static function setDefaultConnection($name) - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - $instance->setDefaultConnection($name); - } - /** - * Get all of the support drivers. - * - * @return array - * @static - */ - public static function supportedDrivers() - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - return $instance->supportedDrivers(); - } - /** - * Get all of the drivers that are actually available. - * - * @return array - * @static - */ - public static function availableDrivers() - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - return $instance->availableDrivers(); - } - /** - * Register an extension connection resolver. - * - * @param string $name - * @param callable $resolver - * @return void - * @static - */ - public static function extend($name, $resolver) - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - $instance->extend($name, $resolver); - } - /** - * Return all of the created connections. - * - * @return array - * @static - */ - public static function getConnections() - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - return $instance->getConnections(); - } - /** - * Set the database reconnector callback. - * - * @param callable $reconnector - * @return void - * @static - */ - public static function setReconnector($reconnector) - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - $instance->setReconnector($reconnector); - } - /** - * Get a schema builder instance for the connection. - * - * @return \Illuminate\Database\Schema\MySqlBuilder - * @static - */ - public static function getSchemaBuilder() - { - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getSchemaBuilder(); - } - /** - * Set the query grammar to the default implementation. - * - * @return void - * @static - */ - public static function useDefaultQueryGrammar() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->useDefaultQueryGrammar(); - } - /** - * Set the schema grammar to the default implementation. - * - * @return void - * @static - */ - public static function useDefaultSchemaGrammar() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->useDefaultSchemaGrammar(); - } - /** - * Set the query post processor to the default implementation. - * - * @return void - * @static - */ - public static function useDefaultPostProcessor() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->useDefaultPostProcessor(); - } - /** - * Begin a fluent query against a database table. - * - * @param \Closure|\Illuminate\Database\Query\Builder|string $table - * @param string|null $as - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function table($table, $as = null) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->table($table, $as); - } - /** - * Get a new query builder instance. - * - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function query() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->query(); - } - /** - * Run a select statement and return a single result. - * - * @param string $query - * @param array $bindings - * @param bool $useReadPdo - * @return mixed - * @static - */ - public static function selectOne($query, $bindings = [], $useReadPdo = true) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->selectOne($query, $bindings, $useReadPdo); - } - /** - * Run a select statement against the database. - * - * @param string $query - * @param array $bindings - * @return array - * @static - */ - public static function selectFromWriteConnection($query, $bindings = []) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->selectFromWriteConnection($query, $bindings); - } - /** - * Run a select statement against the database. - * - * @param string $query - * @param array $bindings - * @param bool $useReadPdo - * @return array - * @static - */ - public static function select($query, $bindings = [], $useReadPdo = true) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->select($query, $bindings, $useReadPdo); - } - /** - * Run a select statement against the database and returns a generator. - * - * @param string $query - * @param array $bindings - * @param bool $useReadPdo - * @return \Generator - * @static - */ - public static function cursor($query, $bindings = [], $useReadPdo = true) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->cursor($query, $bindings, $useReadPdo); - } - /** - * Run an insert statement against the database. - * - * @param string $query - * @param array $bindings - * @return bool - * @static - */ - public static function insert($query, $bindings = []) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->insert($query, $bindings); - } - /** - * Run an update statement against the database. - * - * @param string $query - * @param array $bindings - * @return int - * @static - */ - public static function update($query, $bindings = []) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->update($query, $bindings); - } - /** - * Run a delete statement against the database. - * - * @param string $query - * @param array $bindings - * @return int - * @static - */ - public static function delete($query, $bindings = []) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->delete($query, $bindings); - } - /** - * Execute an SQL statement and return the boolean result. - * - * @param string $query - * @param array $bindings - * @return bool - * @static - */ - public static function statement($query, $bindings = []) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->statement($query, $bindings); - } - /** - * Run an SQL statement and get the number of rows affected. - * - * @param string $query - * @param array $bindings - * @return int - * @static - */ - public static function affectingStatement($query, $bindings = []) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->affectingStatement($query, $bindings); - } - /** - * Run a raw, unprepared query against the PDO connection. - * - * @param string $query - * @return bool - * @static - */ - public static function unprepared($query) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->unprepared($query); - } - /** - * Execute the given callback in "dry run" mode. - * - * @param \Closure $callback - * @return array - * @static - */ - public static function pretend($callback) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->pretend($callback); - } - /** - * Bind values to their parameters in the given statement. - * - * @param \PDOStatement $statement - * @param array $bindings - * @return void - * @static - */ - public static function bindValues($statement, $bindings) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->bindValues($statement, $bindings); - } - /** - * Prepare the query bindings for execution. - * - * @param array $bindings - * @return array - * @static - */ - public static function prepareBindings($bindings) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->prepareBindings($bindings); - } - /** - * Log a query in the connection's query log. - * - * @param string $query - * @param array $bindings - * @param float|null $time - * @return void - * @static - */ - public static function logQuery($query, $bindings, $time = null) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->logQuery($query, $bindings, $time); - } - /** - * Register a database query listener with the connection. - * - * @param \Closure $callback - * @return void - * @static - */ - public static function listen($callback) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->listen($callback); - } - /** - * Get a new raw query expression. - * - * @param mixed $value - * @return \Illuminate\Database\Query\Expression - * @static - */ - public static function raw($value) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->raw($value); - } - /** - * Indicate if any records have been modified. - * - * @param bool $value - * @return void - * @static - */ - public static function recordsHaveBeenModified($value = true) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->recordsHaveBeenModified($value); - } - /** - * Is Doctrine available? - * - * @return bool - * @static - */ - public static function isDoctrineAvailable() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->isDoctrineAvailable(); - } - /** - * Get a Doctrine Schema Column instance. - * - * @param string $table - * @param string $column - * @return \Doctrine\DBAL\Schema\Column - * @static - */ - public static function getDoctrineColumn($table, $column) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getDoctrineColumn($table, $column); - } - /** - * Get the Doctrine DBAL schema manager for the connection. - * - * @return \Doctrine\DBAL\Schema\AbstractSchemaManager - * @static - */ - public static function getDoctrineSchemaManager() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getDoctrineSchemaManager(); - } - /** - * Get the Doctrine DBAL database connection instance. - * - * @return \Doctrine\DBAL\Connection - * @static - */ - public static function getDoctrineConnection() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getDoctrineConnection(); - } - /** - * Get the current PDO connection. - * - * @return \PDO - * @static - */ - public static function getPdo() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getPdo(); - } - /** - * Get the current PDO connection parameter without executing any reconnect logic. - * - * @return \PDO|\Closure|null - * @static - */ - public static function getRawPdo() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getRawPdo(); - } - /** - * Get the current PDO connection used for reading. - * - * @return \PDO - * @static - */ - public static function getReadPdo() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getReadPdo(); - } - /** - * Get the current read PDO connection parameter without executing any reconnect logic. - * - * @return \PDO|\Closure|null - * @static - */ - public static function getRawReadPdo() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getRawReadPdo(); - } - /** - * Set the PDO connection. - * - * @param \PDO|\Closure|null $pdo - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function setPdo($pdo) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->setPdo($pdo); - } - /** - * Set the PDO connection used for reading. - * - * @param \PDO|\Closure|null $pdo - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function setReadPdo($pdo) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->setReadPdo($pdo); - } - /** - * Get the database connection name. - * - * @return string|null - * @static - */ - public static function getName() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getName(); - } - /** - * Get an option from the configuration options. - * - * @param string|null $option - * @return mixed - * @static - */ - public static function getConfig($option = null) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getConfig($option); - } - /** - * Get the PDO driver name. - * - * @return string - * @static - */ - public static function getDriverName() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getDriverName(); - } - /** - * Get the query grammar used by the connection. - * - * @return \Illuminate\Database\Query\Grammars\Grammar - * @static - */ - public static function getQueryGrammar() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getQueryGrammar(); - } - /** - * Set the query grammar used by the connection. - * - * @param \Illuminate\Database\Query\Grammars\Grammar $grammar - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function setQueryGrammar($grammar) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->setQueryGrammar($grammar); - } - /** - * Get the schema grammar used by the connection. - * - * @return \Illuminate\Database\Schema\Grammars\Grammar - * @static - */ - public static function getSchemaGrammar() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getSchemaGrammar(); - } - /** - * Set the schema grammar used by the connection. - * - * @param \Illuminate\Database\Schema\Grammars\Grammar $grammar - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function setSchemaGrammar($grammar) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->setSchemaGrammar($grammar); - } - /** - * Get the query post processor used by the connection. - * - * @return \Illuminate\Database\Query\Processors\Processor - * @static - */ - public static function getPostProcessor() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getPostProcessor(); - } - /** - * Set the query post processor used by the connection. - * - * @param \Illuminate\Database\Query\Processors\Processor $processor - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function setPostProcessor($processor) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->setPostProcessor($processor); - } - /** - * Get the event dispatcher used by the connection. - * - * @return \Illuminate\Contracts\Events\Dispatcher - * @static - */ - public static function getEventDispatcher() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getEventDispatcher(); - } - /** - * Set the event dispatcher instance on the connection. - * - * @param \Illuminate\Contracts\Events\Dispatcher $events - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function setEventDispatcher($events) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->setEventDispatcher($events); - } - /** - * Unset the event dispatcher for this connection. - * - * @return void - * @static - */ - public static function unsetEventDispatcher() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->unsetEventDispatcher(); - } - /** - * Determine if the connection is in a "dry run". - * - * @return bool - * @static - */ - public static function pretending() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->pretending(); - } - /** - * Get the connection query log. - * - * @return array - * @static - */ - public static function getQueryLog() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getQueryLog(); - } - /** - * Clear the query log. - * - * @return void - * @static - */ - public static function flushQueryLog() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->flushQueryLog(); - } - /** - * Enable the query log on the connection. - * - * @return void - * @static - */ - public static function enableQueryLog() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->enableQueryLog(); - } - /** - * Disable the query log on the connection. - * - * @return void - * @static - */ - public static function disableQueryLog() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->disableQueryLog(); - } - /** - * Determine whether we're logging queries. - * - * @return bool - * @static - */ - public static function logging() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->logging(); - } - /** - * Get the name of the connected database. - * - * @return string - * @static - */ - public static function getDatabaseName() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getDatabaseName(); - } - /** - * Set the name of the connected database. - * - * @param string $database - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function setDatabaseName($database) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->setDatabaseName($database); - } - /** - * Get the table prefix for the connection. - * - * @return string - * @static - */ - public static function getTablePrefix() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getTablePrefix(); - } - /** - * Set the table prefix in use by the connection. - * - * @param string $prefix - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function setTablePrefix($prefix) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->setTablePrefix($prefix); - } - /** - * Set the table prefix and return the grammar. - * - * @param \Illuminate\Database\Grammar $grammar - * @return \Illuminate\Database\Grammar - * @static - */ - public static function withTablePrefix($grammar) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->withTablePrefix($grammar); - } - /** - * Register a connection resolver. - * - * @param string $driver - * @param \Closure $callback - * @return void - * @static - */ - public static function resolverFor($driver, $callback) - { //Method inherited from \Illuminate\Database\Connection - \Illuminate\Database\MySqlConnection::resolverFor($driver, $callback); - } - /** - * Get the connection resolver for the given driver. - * - * @param string $driver - * @return mixed - * @static - */ - public static function getResolver($driver) - { //Method inherited from \Illuminate\Database\Connection - return \Illuminate\Database\MySqlConnection::getResolver($driver); - } - /** - * Execute a Closure within a transaction. - * - * @param \Closure $callback - * @param int $attempts - * @return mixed - * @throws \Exception|\Throwable - * @static - */ - public static function transaction($callback, $attempts = 1) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->transaction($callback, $attempts); - } - /** - * Start a new database transaction. - * - * @return void - * @throws \Exception - * @static - */ - public static function beginTransaction() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->beginTransaction(); - } - /** - * Commit the active database transaction. - * - * @return void - * @static - */ - public static function commit() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->commit(); - } - /** - * Rollback the active database transaction. - * - * @param int|null $toLevel - * @return void - * @throws \Exception - * @static - */ - public static function rollBack($toLevel = null) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->rollBack($toLevel); - } - /** - * Get the number of active transactions. - * - * @return int - * @static - */ - public static function transactionLevel() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->transactionLevel(); - } - - } - /** - * - * - * @see \Illuminate\Events\Dispatcher - */ - class Event { - /** - * Register an event listener with the dispatcher. - * - * @param string|array $events - * @param \Closure|string $listener - * @return void - * @static - */ - public static function listen($events, $listener) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - $instance->listen($events, $listener); - } - /** - * Determine if a given event has listeners. - * - * @param string $eventName - * @return bool - * @static - */ - public static function hasListeners($eventName) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - return $instance->hasListeners($eventName); - } - /** - * Determine if the given event has any wildcard listeners. - * - * @param string $eventName - * @return bool - * @static - */ - public static function hasWildcardListeners($eventName) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - return $instance->hasWildcardListeners($eventName); - } - /** - * Register an event and payload to be fired later. - * - * @param string $event - * @param array $payload - * @return void - * @static - */ - public static function push($event, $payload = []) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - $instance->push($event, $payload); - } - /** - * Flush a set of pushed events. - * - * @param string $event - * @return void - * @static - */ - public static function flush($event) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - $instance->flush($event); - } - /** - * Register an event subscriber with the dispatcher. - * - * @param object|string $subscriber - * @return void - * @static - */ - public static function subscribe($subscriber) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - $instance->subscribe($subscriber); - } - /** - * Fire an event until the first non-null response is returned. - * - * @param string|object $event - * @param mixed $payload - * @return array|null - * @static - */ - public static function until($event, $payload = []) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - return $instance->until($event, $payload); - } - /** - * Fire an event and call the listeners. - * - * @param string|object $event - * @param mixed $payload - * @param bool $halt - * @return array|null - * @static - */ - public static function dispatch($event, $payload = [], $halt = false) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - return $instance->dispatch($event, $payload, $halt); - } - /** - * Get all of the listeners for a given event name. - * - * @param string $eventName - * @return array - * @static - */ - public static function getListeners($eventName) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - return $instance->getListeners($eventName); - } - /** - * Register an event listener with the dispatcher. - * - * @param \Closure|string $listener - * @param bool $wildcard - * @return \Closure - * @static - */ - public static function makeListener($listener, $wildcard = false) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - return $instance->makeListener($listener, $wildcard); - } - /** - * Create a class based listener using the IoC container. - * - * @param string $listener - * @param bool $wildcard - * @return \Closure - * @static - */ - public static function createClassListener($listener, $wildcard = false) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - return $instance->createClassListener($listener, $wildcard); - } - /** - * Remove a set of listeners from the dispatcher. - * - * @param string $event - * @return void - * @static - */ - public static function forget($event) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - $instance->forget($event); - } - /** - * Forget all of the pushed listeners. - * - * @return void - * @static - */ - public static function forgetPushed() - { - /** @var \Illuminate\Events\Dispatcher $instance */ - $instance->forgetPushed(); - } - /** - * Set the queue resolver implementation. - * - * @param callable $resolver - * @return \Illuminate\Events\Dispatcher - * @static - */ - public static function setQueueResolver($resolver) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - return $instance->setQueueResolver($resolver); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Events\Dispatcher::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Events\Dispatcher::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Events\Dispatcher::hasMacro($name); - } - /** - * Assert if an event was dispatched based on a truth-test callback. - * - * @param string $event - * @param callable|int|null $callback - * @return void - * @static - */ - public static function assertDispatched($event, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ - $instance->assertDispatched($event, $callback); - } - /** - * Assert if a event was dispatched a number of times. - * - * @param string $event - * @param int $times - * @return void - * @static - */ - public static function assertDispatchedTimes($event, $times = 1) - { - /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ - $instance->assertDispatchedTimes($event, $times); - } - /** - * Determine if an event was dispatched based on a truth-test callback. - * - * @param string $event - * @param callable|null $callback - * @return void - * @static - */ - public static function assertNotDispatched($event, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ - $instance->assertNotDispatched($event, $callback); - } - /** - * Get all of the events matching a truth-test callback. - * - * @param string $event - * @param callable|null $callback - * @return \Illuminate\Support\Collection - * @static - */ - public static function dispatched($event, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ - return $instance->dispatched($event, $callback); - } - /** - * Determine if the given event has been dispatched. - * - * @param string $event - * @return bool - * @static - */ - public static function hasDispatched($event) - { - /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ - return $instance->hasDispatched($event); - } - - } - /** - * - * - * @see \Illuminate\Filesystem\Filesystem - */ - class File { - /** - * Determine if a file or directory exists. - * - * @param string $path - * @return bool - * @static - */ - public static function exists($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->exists($path); - } - /** - * Determine if a file or directory is missing. - * - * @param string $path - * @return bool - * @static - */ - public static function missing($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->missing($path); - } - /** - * Get the contents of a file. - * - * @param string $path - * @param bool $lock - * @return string - * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException - * @static - */ - public static function get($path, $lock = false) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->get($path, $lock); - } - /** - * Get contents of a file with shared access. - * - * @param string $path - * @return string - * @static - */ - public static function sharedGet($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->sharedGet($path); - } - /** - * Get the returned value of a file. - * - * @param string $path - * @return mixed - * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException - * @static - */ - public static function getRequire($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->getRequire($path); - } - /** - * Require the given file once. - * - * @param string $file - * @return mixed - * @static - */ - public static function requireOnce($file) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->requireOnce($file); - } - /** - * Get the MD5 hash of the file at the given path. - * - * @param string $path - * @return string - * @static - */ - public static function hash($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->hash($path); - } - /** - * Write the contents of a file. - * - * @param string $path - * @param string $contents - * @param bool $lock - * @return int|bool - * @static - */ - public static function put($path, $contents, $lock = false) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->put($path, $contents, $lock); - } - /** - * Write the contents of a file, replacing it atomically if it already exists. - * - * @param string $path - * @param string $content - * @return void - * @static - */ - public static function replace($path, $content) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - $instance->replace($path, $content); - } - /** - * Prepend to a file. - * - * @param string $path - * @param string $data - * @return int - * @static - */ - public static function prepend($path, $data) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->prepend($path, $data); - } - /** - * Append to a file. - * - * @param string $path - * @param string $data - * @return int - * @static - */ - public static function append($path, $data) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->append($path, $data); - } - /** - * Get or set UNIX mode of a file or directory. - * - * @param string $path - * @param int|null $mode - * @return mixed - * @static - */ - public static function chmod($path, $mode = null) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->chmod($path, $mode); - } - /** - * Delete the file at a given path. - * - * @param string|array $paths - * @return bool - * @static - */ - public static function delete($paths) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->delete($paths); - } - /** - * Move a file to a new location. - * - * @param string $path - * @param string $target - * @return bool - * @static - */ - public static function move($path, $target) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->move($path, $target); - } - /** - * Copy a file to a new location. - * - * @param string $path - * @param string $target - * @return bool - * @static - */ - public static function copy($path, $target) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->copy($path, $target); - } - /** - * Create a symlink to the target file or directory. On Windows, a hard link is created if the target is a file. - * - * @param string $target - * @param string $link - * @return void - * @static - */ - public static function link($target, $link) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - $instance->link($target, $link); - } - /** - * Extract the file name from a file path. - * - * @param string $path - * @return string - * @static - */ - public static function name($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->name($path); - } - /** - * Extract the trailing name component from a file path. - * - * @param string $path - * @return string - * @static - */ - public static function basename($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->basename($path); - } - /** - * Extract the parent directory from a file path. - * - * @param string $path - * @return string - * @static - */ - public static function dirname($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->dirname($path); - } - /** - * Extract the file extension from a file path. - * - * @param string $path - * @return string - * @static - */ - public static function extension($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->extension($path); - } - /** - * Get the file type of a given file. - * - * @param string $path - * @return string - * @static - */ - public static function type($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->type($path); - } - /** - * Get the mime-type of a given file. - * - * @param string $path - * @return string|false - * @static - */ - public static function mimeType($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->mimeType($path); - } - /** - * Get the file size of a given file. - * - * @param string $path - * @return int - * @static - */ - public static function size($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->size($path); - } - /** - * Get the file's last modification time. - * - * @param string $path - * @return int - * @static - */ - public static function lastModified($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->lastModified($path); - } - /** - * Determine if the given path is a directory. - * - * @param string $directory - * @return bool - * @static - */ - public static function isDirectory($directory) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->isDirectory($directory); - } - /** - * Determine if the given path is readable. - * - * @param string $path - * @return bool - * @static - */ - public static function isReadable($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->isReadable($path); - } - /** - * Determine if the given path is writable. - * - * @param string $path - * @return bool - * @static - */ - public static function isWritable($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->isWritable($path); - } - /** - * Determine if the given path is a file. - * - * @param string $file - * @return bool - * @static - */ - public static function isFile($file) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->isFile($file); - } - /** - * Find path names matching a given pattern. - * - * @param string $pattern - * @param int $flags - * @return array - * @static - */ - public static function glob($pattern, $flags = 0) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->glob($pattern, $flags); - } - /** - * Get an array of all files in a directory. - * - * @param string $directory - * @param bool $hidden - * @return \Symfony\Component\Finder\SplFileInfo[] - * @static - */ - public static function files($directory, $hidden = false) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->files($directory, $hidden); - } - /** - * Get all of the files from the given directory (recursive). - * - * @param string $directory - * @param bool $hidden - * @return \Symfony\Component\Finder\SplFileInfo[] - * @static - */ - public static function allFiles($directory, $hidden = false) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->allFiles($directory, $hidden); - } - /** - * Get all of the directories within a given directory. - * - * @param string $directory - * @return array - * @static - */ - public static function directories($directory) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->directories($directory); - } - /** - * Ensure a directory exists. - * - * @param string $path - * @param int $mode - * @param bool $recursive - * @return void - * @static - */ - public static function ensureDirectoryExists($path, $mode = 493, $recursive = true) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - $instance->ensureDirectoryExists($path, $mode, $recursive); - } - /** - * Create a directory. - * - * @param string $path - * @param int $mode - * @param bool $recursive - * @param bool $force - * @return bool - * @static - */ - public static function makeDirectory($path, $mode = 493, $recursive = false, $force = false) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->makeDirectory($path, $mode, $recursive, $force); - } - /** - * Move a directory. - * - * @param string $from - * @param string $to - * @param bool $overwrite - * @return bool - * @static - */ - public static function moveDirectory($from, $to, $overwrite = false) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->moveDirectory($from, $to, $overwrite); - } - /** - * Copy a directory from one location to another. - * - * @param string $directory - * @param string $destination - * @param int|null $options - * @return bool - * @static - */ - public static function copyDirectory($directory, $destination, $options = null) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->copyDirectory($directory, $destination, $options); - } - /** - * Recursively delete a directory. - * - * The directory itself may be optionally preserved. - * - * @param string $directory - * @param bool $preserve - * @return bool - * @static - */ - public static function deleteDirectory($directory, $preserve = false) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->deleteDirectory($directory, $preserve); - } - /** - * Remove all of the directories within a given directory. - * - * @param string $directory - * @return bool - * @static - */ - public static function deleteDirectories($directory) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->deleteDirectories($directory); - } - /** - * Empty the specified directory of all files and folders. - * - * @param string $directory - * @return bool - * @static - */ - public static function cleanDirectory($directory) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->cleanDirectory($directory); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Filesystem\Filesystem::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Filesystem\Filesystem::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Filesystem\Filesystem::hasMacro($name); - } - - } - /** - * - * - * @see \Illuminate\Contracts\Auth\Access\Gate - */ - class Gate { - /** - * Determine if a given ability has been defined. - * - * @param string|array $ability - * @return bool - * @static - */ - public static function has($ability) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->has($ability); - } - /** - * Define a new ability. - * - * @param string $ability - * @param callable|string $callback - * @return \Illuminate\Auth\Access\Gate - * @throws \InvalidArgumentException - * @static - */ - public static function define($ability, $callback) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->define($ability, $callback); - } - /** - * Define abilities for a resource. - * - * @param string $name - * @param string $class - * @param array|null $abilities - * @return \Illuminate\Auth\Access\Gate - * @static - */ - public static function resource($name, $class, $abilities = null) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->resource($name, $class, $abilities); - } - /** - * Define a policy class for a given class type. - * - * @param string $class - * @param string $policy - * @return \Illuminate\Auth\Access\Gate - * @static - */ - public static function policy($class, $policy) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->policy($class, $policy); - } - /** - * Register a callback to run before all Gate checks. - * - * @param callable $callback - * @return \Illuminate\Auth\Access\Gate - * @static - */ - public static function before($callback) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->before($callback); - } - /** - * Register a callback to run after all Gate checks. - * - * @param callable $callback - * @return \Illuminate\Auth\Access\Gate - * @static - */ - public static function after($callback) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->after($callback); - } - /** - * Determine if the given ability should be granted for the current user. - * - * @param string $ability - * @param array|mixed $arguments - * @return bool - * @static - */ - public static function allows($ability, $arguments = []) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->allows($ability, $arguments); - } - /** - * Determine if the given ability should be denied for the current user. - * - * @param string $ability - * @param array|mixed $arguments - * @return bool - * @static - */ - public static function denies($ability, $arguments = []) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->denies($ability, $arguments); - } - /** - * Determine if all of the given abilities should be granted for the current user. - * - * @param \Illuminate\Auth\Access\iterable|string $abilities - * @param array|mixed $arguments - * @return bool - * @static - */ - public static function check($abilities, $arguments = []) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->check($abilities, $arguments); - } - /** - * Determine if any one of the given abilities should be granted for the current user. - * - * @param \Illuminate\Auth\Access\iterable|string $abilities - * @param array|mixed $arguments - * @return bool - * @static - */ - public static function any($abilities, $arguments = []) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->any($abilities, $arguments); - } - /** - * Determine if all of the given abilities should be denied for the current user. - * - * @param \Illuminate\Auth\Access\iterable|string $abilities - * @param array|mixed $arguments - * @return bool - * @static - */ - public static function none($abilities, $arguments = []) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->none($abilities, $arguments); - } - /** - * Determine if the given ability should be granted for the current user. - * - * @param string $ability - * @param array|mixed $arguments - * @return \Illuminate\Auth\Access\Response - * @throws \Illuminate\Auth\Access\AuthorizationException - * @static - */ - public static function authorize($ability, $arguments = []) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->authorize($ability, $arguments); - } - /** - * Inspect the user for the given ability. - * - * @param string $ability - * @param array|mixed $arguments - * @return \Illuminate\Auth\Access\Response - * @static - */ - public static function inspect($ability, $arguments = []) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->inspect($ability, $arguments); - } - /** - * Get the raw result from the authorization callback. - * - * @param string $ability - * @param array|mixed $arguments - * @return mixed - * @throws \Illuminate\Auth\Access\AuthorizationException - * @static - */ - public static function raw($ability, $arguments = []) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->raw($ability, $arguments); - } - /** - * Get a policy instance for a given class. - * - * @param object|string $class - * @return mixed - * @static - */ - public static function getPolicyFor($class) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->getPolicyFor($class); - } - /** - * Specify a callback to be used to guess policy names. - * - * @param callable $callback - * @return \Illuminate\Auth\Access\Gate - * @static - */ - public static function guessPolicyNamesUsing($callback) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->guessPolicyNamesUsing($callback); - } - /** - * Build a policy class instance of the given type. - * - * @param object|string $class - * @return mixed - * @throws \Illuminate\Contracts\Container\BindingResolutionException - * @static - */ - public static function resolvePolicy($class) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->resolvePolicy($class); - } - /** - * Get a gate instance for the given user. - * - * @param \Illuminate\Contracts\Auth\Authenticatable|mixed $user - * @return static - * @static - */ - public static function forUser($user) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->forUser($user); - } - /** - * Get all of the defined abilities. - * - * @return array - * @static - */ - public static function abilities() - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->abilities(); - } - /** - * Get all of the defined policies. - * - * @return array - * @static - */ - public static function policies() - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->policies(); - } - - } - /** - * - * - * @see \Illuminate\Hashing\HashManager - */ - class Hash { - /** - * Create an instance of the Bcrypt hash Driver. - * - * @return \Illuminate\Hashing\BcryptHasher - * @static - */ - public static function createBcryptDriver() - { - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->createBcryptDriver(); - } - /** - * Create an instance of the Argon2i hash Driver. - * - * @return \Illuminate\Hashing\ArgonHasher - * @static - */ - public static function createArgonDriver() - { - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->createArgonDriver(); - } - /** - * Create an instance of the Argon2id hash Driver. - * - * @return \Illuminate\Hashing\Argon2IdHasher - * @static - */ - public static function createArgon2idDriver() - { - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->createArgon2idDriver(); - } - /** - * Get information about the given hashed value. - * - * @param string $hashedValue - * @return array - * @static - */ - public static function info($hashedValue) - { - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->info($hashedValue); - } - /** - * Hash the given value. - * - * @param string $value - * @param array $options - * @return string - * @static - */ - public static function make($value, $options = []) - { - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->make($value, $options); - } - /** - * Check the given plain value against a hash. - * - * @param string $value - * @param string $hashedValue - * @param array $options - * @return bool - * @static - */ - public static function check($value, $hashedValue, $options = []) - { - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->check($value, $hashedValue, $options); - } - /** - * Check if the given hash has been hashed using the given options. - * - * @param string $hashedValue - * @param array $options - * @return bool - * @static - */ - public static function needsRehash($hashedValue, $options = []) - { - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->needsRehash($hashedValue, $options); - } - /** - * Get the default driver name. - * - * @return string - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Get a driver instance. - * - * @param string $driver - * @return mixed - * @throws \InvalidArgumentException - * @static - */ - public static function driver($driver = null) - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->driver($driver); - } - /** - * Register a custom driver creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return \Illuminate\Hashing\HashManager - * @static - */ - public static function extend($driver, $callback) - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->extend($driver, $callback); - } - /** - * Get all of the created "drivers". - * - * @return array - * @static - */ - public static function getDrivers() - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->getDrivers(); - } - - } - /** - * - * - * @see \Illuminate\Translation\Translator - */ - class Lang { - /** - * Determine if a translation exists for a given locale. - * - * @param string $key - * @param string|null $locale - * @return bool - * @static - */ - public static function hasForLocale($key, $locale = null) - { - /** @var \Illuminate\Translation\Translator $instance */ - return $instance->hasForLocale($key, $locale); - } - /** - * Determine if a translation exists. - * - * @param string $key - * @param string|null $locale - * @param bool $fallback - * @return bool - * @static - */ - public static function has($key, $locale = null, $fallback = true) - { - /** @var \Illuminate\Translation\Translator $instance */ - return $instance->has($key, $locale, $fallback); - } - /** - * Get the translation for the given key. - * - * @param string $key - * @param array $replace - * @param string|null $locale - * @param bool $fallback - * @return string|array - * @static - */ - public static function get($key, $replace = [], $locale = null, $fallback = true) - { - /** @var \Illuminate\Translation\Translator $instance */ - return $instance->get($key, $replace, $locale, $fallback); - } - /** - * Get a translation according to an integer value. - * - * @param string $key - * @param \Countable|int|array $number - * @param array $replace - * @param string|null $locale - * @return string - * @static - */ - public static function choice($key, $number, $replace = [], $locale = null) - { - /** @var \Illuminate\Translation\Translator $instance */ - return $instance->choice($key, $number, $replace, $locale); - } - /** - * Add translation lines to the given locale. - * - * @param array $lines - * @param string $locale - * @param string $namespace - * @return void - * @static - */ - public static function addLines($lines, $locale, $namespace = '*') - { - /** @var \Illuminate\Translation\Translator $instance */ - $instance->addLines($lines, $locale, $namespace); - } - /** - * Load the specified language group. - * - * @param string $namespace - * @param string $group - * @param string $locale - * @return void - * @static - */ - public static function load($namespace, $group, $locale) - { - /** @var \Illuminate\Translation\Translator $instance */ - $instance->load($namespace, $group, $locale); - } - /** - * Add a new namespace to the loader. - * - * @param string $namespace - * @param string $hint - * @return void - * @static - */ - public static function addNamespace($namespace, $hint) - { - /** @var \Illuminate\Translation\Translator $instance */ - $instance->addNamespace($namespace, $hint); - } - /** - * Add a new JSON path to the loader. - * - * @param string $path - * @return void - * @static - */ - public static function addJsonPath($path) - { - /** @var \Illuminate\Translation\Translator $instance */ - $instance->addJsonPath($path); - } - /** - * Parse a key into namespace, group, and item. - * - * @param string $key - * @return array - * @static - */ - public static function parseKey($key) - { - /** @var \Illuminate\Translation\Translator $instance */ - return $instance->parseKey($key); - } - /** - * Get the message selector instance. - * - * @return \Illuminate\Translation\MessageSelector - * @static - */ - public static function getSelector() - { - /** @var \Illuminate\Translation\Translator $instance */ - return $instance->getSelector(); - } - /** - * Set the message selector instance. - * - * @param \Illuminate\Translation\MessageSelector $selector - * @return void - * @static - */ - public static function setSelector($selector) - { - /** @var \Illuminate\Translation\Translator $instance */ - $instance->setSelector($selector); - } - /** - * Get the language line loader implementation. - * - * @return \Illuminate\Contracts\Translation\Loader - * @static - */ - public static function getLoader() - { - /** @var \Illuminate\Translation\Translator $instance */ - return $instance->getLoader(); - } - /** - * Get the default locale being used. - * - * @return string - * @static - */ - public static function locale() - { - /** @var \Illuminate\Translation\Translator $instance */ - return $instance->locale(); - } - /** - * Get the default locale being used. - * - * @return string - * @static - */ - public static function getLocale() - { - /** @var \Illuminate\Translation\Translator $instance */ - return $instance->getLocale(); - } - /** - * Set the default locale. - * - * @param string $locale - * @return void - * @static - */ - public static function setLocale($locale) - { - /** @var \Illuminate\Translation\Translator $instance */ - $instance->setLocale($locale); - } - /** - * Get the fallback locale being used. - * - * @return string - * @static - */ - public static function getFallback() - { - /** @var \Illuminate\Translation\Translator $instance */ - return $instance->getFallback(); - } - /** - * Set the fallback locale being used. - * - * @param string $fallback - * @return void - * @static - */ - public static function setFallback($fallback) - { - /** @var \Illuminate\Translation\Translator $instance */ - $instance->setFallback($fallback); - } - /** - * Set the loaded translation groups. - * - * @param array $loaded - * @return void - * @static - */ - public static function setLoaded($loaded) - { - /** @var \Illuminate\Translation\Translator $instance */ - $instance->setLoaded($loaded); - } - /** - * Set the parsed value of a key. - * - * @param string $key - * @param array $parsed - * @return void - * @static - */ - public static function setParsedKey($key, $parsed) - { //Method inherited from \Illuminate\Support\NamespacedItemResolver - /** @var \Illuminate\Translation\Translator $instance */ - $instance->setParsedKey($key, $parsed); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Translation\Translator::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Translation\Translator::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Translation\Translator::hasMacro($name); - } - - } - /** - * - * - * @see \Illuminate\Log\Logger - */ - class Log { - /** - * Create a new, on-demand aggregate logger instance. - * - * @param array $channels - * @param string|null $channel - * @return \Psr\Log\LoggerInterface - * @static - */ - public static function stack($channels, $channel = null) - { - /** @var \Illuminate\Log\LogManager $instance */ - return $instance->stack($channels, $channel); - } - /** - * Get a log channel instance. - * - * @param string|null $channel - * @return \Psr\Log\LoggerInterface - * @static - */ - public static function channel($channel = null) - { - /** @var \Illuminate\Log\LogManager $instance */ - return $instance->channel($channel); - } - /** - * Get a log driver instance. - * - * @param string|null $driver - * @return \Psr\Log\LoggerInterface - * @static - */ - public static function driver($driver = null) - { - /** @var \Illuminate\Log\LogManager $instance */ - return $instance->driver($driver); - } - /** - * - * - * @return array - * @static - */ - public static function getChannels() - { - /** @var \Illuminate\Log\LogManager $instance */ - return $instance->getChannels(); - } - /** - * Get the default log driver name. - * - * @return string - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Log\LogManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Set the default log driver name. - * - * @param string $name - * @return void - * @static - */ - public static function setDefaultDriver($name) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->setDefaultDriver($name); - } - /** - * Register a custom driver creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return \Illuminate\Log\LogManager - * @static - */ - public static function extend($driver, $callback) - { - /** @var \Illuminate\Log\LogManager $instance */ - return $instance->extend($driver, $callback); - } - /** - * Unset the given channel instance. - * - * @param string|null $driver - * @return \Illuminate\Log\LogManager - * @static - */ - public static function forgetChannel($driver = null) - { - /** @var \Illuminate\Log\LogManager $instance */ - return $instance->forgetChannel($driver); - } - /** - * System is unusable. - * - * @param string $message - * @param array $context - * @return void - * @static - */ - public static function emergency($message, $context = []) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->emergency($message, $context); - } - /** - * Action must be taken immediately. - * - * Example: Entire website down, database unavailable, etc. This should - * trigger the SMS alerts and wake you up. - * - * @param string $message - * @param array $context - * @return void - * @static - */ - public static function alert($message, $context = []) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->alert($message, $context); - } - /** - * Critical conditions. - * - * Example: Application component unavailable, unexpected exception. - * - * @param string $message - * @param array $context - * @return void - * @static - */ - public static function critical($message, $context = []) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->critical($message, $context); - } - /** - * Runtime errors that do not require immediate action but should typically - * be logged and monitored. - * - * @param string $message - * @param array $context - * @return void - * @static - */ - public static function error($message, $context = []) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->error($message, $context); - } - /** - * Exceptional occurrences that are not errors. - * - * Example: Use of deprecated APIs, poor use of an API, undesirable things - * that are not necessarily wrong. - * - * @param string $message - * @param array $context - * @return void - * @static - */ - public static function warning($message, $context = []) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->warning($message, $context); - } - /** - * Normal but significant events. - * - * @param string $message - * @param array $context - * @return void - * @static - */ - public static function notice($message, $context = []) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->notice($message, $context); - } - /** - * Interesting events. - * - * Example: User logs in, SQL logs. - * - * @param string $message - * @param array $context - * @return void - * @static - */ - public static function info($message, $context = []) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->info($message, $context); - } - /** - * Detailed debug information. - * - * @param string $message - * @param array $context - * @return void - * @static - */ - public static function debug($message, $context = []) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->debug($message, $context); - } - /** - * Logs with an arbitrary level. - * - * @param mixed $level - * @param string $message - * @param array $context - * @return void - * @static - */ - public static function log($level, $message, $context = []) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->log($level, $message, $context); - } - - } - /** - * - * - * @see \Illuminate\Mail\Mailer - * @see \Illuminate\Support\Testing\Fakes\MailFake - */ - class Mail { - /** - * Set the global from address and name. - * - * @param string $address - * @param string|null $name - * @return void - * @static - */ - public static function alwaysFrom($address, $name = null) - { - /** @var \Illuminate\Mail\Mailer $instance */ - $instance->alwaysFrom($address, $name); - } - /** - * Set the global reply-to address and name. - * - * @param string $address - * @param string|null $name - * @return void - * @static - */ - public static function alwaysReplyTo($address, $name = null) - { - /** @var \Illuminate\Mail\Mailer $instance */ - $instance->alwaysReplyTo($address, $name); - } - /** - * Set the global to address and name. - * - * @param string $address - * @param string|null $name - * @return void - * @static - */ - public static function alwaysTo($address, $name = null) - { - /** @var \Illuminate\Mail\Mailer $instance */ - $instance->alwaysTo($address, $name); - } - /** - * Begin the process of mailing a mailable class instance. - * - * @param mixed $users - * @return \Illuminate\Mail\PendingMail - * @static - */ - public static function to($users) - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->to($users); - } - /** - * Begin the process of mailing a mailable class instance. - * - * @param mixed $users - * @return \Illuminate\Mail\PendingMail - * @static - */ - public static function cc($users) - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->cc($users); - } - /** - * Begin the process of mailing a mailable class instance. - * - * @param mixed $users - * @return \Illuminate\Mail\PendingMail - * @static - */ - public static function bcc($users) - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->bcc($users); - } - /** - * Send a new message with only an HTML part. - * - * @param string $html - * @param mixed $callback - * @return void - * @static - */ - public static function html($html, $callback) - { - /** @var \Illuminate\Mail\Mailer $instance */ - $instance->html($html, $callback); - } - /** - * Send a new message with only a raw text part. - * - * @param string $text - * @param mixed $callback - * @return void - * @static - */ - public static function raw($text, $callback) - { - /** @var \Illuminate\Mail\Mailer $instance */ - $instance->raw($text, $callback); - } - /** - * Send a new message with only a plain part. - * - * @param string $view - * @param array $data - * @param mixed $callback - * @return void - * @static - */ - public static function plain($view, $data, $callback) - { - /** @var \Illuminate\Mail\Mailer $instance */ - $instance->plain($view, $data, $callback); - } - /** - * Render the given message as a view. - * - * @param string|array $view - * @param array $data - * @return string - * @static - */ - public static function render($view, $data = []) - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->render($view, $data); - } - /** - * Send a new message using a view. - * - * @param \Illuminate\Contracts\Mail\Mailable|string|array $view - * @param array $data - * @param \Closure|string|null $callback - * @return void - * @static - */ - public static function send($view, $data = [], $callback = null) - { - /** @var \Illuminate\Mail\Mailer $instance */ - $instance->send($view, $data, $callback); - } - /** - * Queue a new e-mail message for sending. - * - * @param \Illuminate\Contracts\Mail\Mailable|string|array $view - * @param string|null $queue - * @return mixed - * @throws \InvalidArgumentException - * @static - */ - public static function queue($view, $queue = null) - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->queue($view, $queue); - } - /** - * Queue a new e-mail message for sending on the given queue. - * - * @param string $queue - * @param \Illuminate\Contracts\Mail\Mailable $view - * @return mixed - * @static - */ - public static function onQueue($queue, $view) - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->onQueue($queue, $view); - } - /** - * Queue a new e-mail message for sending on the given queue. - * - * This method didn't match rest of framework's "onQueue" phrasing. Added "onQueue". - * - * @param string $queue - * @param \Illuminate\Contracts\Mail\Mailable $view - * @return mixed - * @static - */ - public static function queueOn($queue, $view) - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->queueOn($queue, $view); - } - /** - * Queue a new e-mail message for sending after (n) seconds. - * - * @param \DateTimeInterface|\DateInterval|int $delay - * @param \Illuminate\Contracts\Mail\Mailable $view - * @param string|null $queue - * @return mixed - * @throws \InvalidArgumentException - * @static - */ - public static function later($delay, $view, $queue = null) - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->later($delay, $view, $queue); - } - /** - * Queue a new e-mail message for sending after (n) seconds on the given queue. - * - * @param string $queue - * @param \DateTimeInterface|\DateInterval|int $delay - * @param \Illuminate\Contracts\Mail\Mailable $view - * @return mixed - * @static - */ - public static function laterOn($queue, $delay, $view) - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->laterOn($queue, $delay, $view); - } - /** - * Get the array of failed recipients. - * - * @return array - * @static - */ - public static function failures() - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->failures(); - } - /** - * Get the Swift Mailer instance. - * - * @return \Swift_Mailer - * @static - */ - public static function getSwiftMailer() - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->getSwiftMailer(); - } - /** - * Get the view factory instance. - * - * @return \Illuminate\Contracts\View\Factory - * @static - */ - public static function getViewFactory() - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->getViewFactory(); - } - /** - * Set the Swift Mailer instance. - * - * @param \Swift_Mailer $swift - * @return void - * @static - */ - public static function setSwiftMailer($swift) - { - /** @var \Illuminate\Mail\Mailer $instance */ - $instance->setSwiftMailer($swift); - } - /** - * Set the queue manager instance. - * - * @param \Illuminate\Contracts\Queue\Factory $queue - * @return \Illuminate\Mail\Mailer - * @static - */ - public static function setQueue($queue) - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->setQueue($queue); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Mail\Mailer::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Mail\Mailer::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Mail\Mailer::hasMacro($name); - } - /** - * Assert if a mailable was sent based on a truth-test callback. - * - * @param string $mailable - * @param callable|int|null $callback - * @return void - * @static - */ - public static function assertSent($mailable, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - $instance->assertSent($mailable, $callback); - } - /** - * Determine if a mailable was not sent based on a truth-test callback. - * - * @param string $mailable - * @param callable|null $callback - * @return void - * @static - */ - public static function assertNotSent($mailable, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - $instance->assertNotSent($mailable, $callback); - } - /** - * Assert that no mailables were sent. - * - * @return void - * @static - */ - public static function assertNothingSent() - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - $instance->assertNothingSent(); - } - /** - * Assert if a mailable was queued based on a truth-test callback. - * - * @param string $mailable - * @param callable|int|null $callback - * @return void - * @static - */ - public static function assertQueued($mailable, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - $instance->assertQueued($mailable, $callback); - } - /** - * Determine if a mailable was not queued based on a truth-test callback. - * - * @param string $mailable - * @param callable|null $callback - * @return void - * @static - */ - public static function assertNotQueued($mailable, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - $instance->assertNotQueued($mailable, $callback); - } - /** - * Assert that no mailables were queued. - * - * @return void - * @static - */ - public static function assertNothingQueued() - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - $instance->assertNothingQueued(); - } - /** - * Get all of the mailables matching a truth-test callback. - * - * @param string $mailable - * @param callable|null $callback - * @return \Illuminate\Support\Collection - * @static - */ - public static function sent($mailable, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - return $instance->sent($mailable, $callback); - } - /** - * Determine if the given mailable has been sent. - * - * @param string $mailable - * @return bool - * @static - */ - public static function hasSent($mailable) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - return $instance->hasSent($mailable); - } - /** - * Get all of the queued mailables matching a truth-test callback. - * - * @param string $mailable - * @param callable|null $callback - * @return \Illuminate\Support\Collection - * @static - */ - public static function queued($mailable, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - return $instance->queued($mailable, $callback); - } - /** - * Determine if the given mailable has been queued. - * - * @param string $mailable - * @return bool - * @static - */ - public static function hasQueued($mailable) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - return $instance->hasQueued($mailable); - } - - } - /** - * - * - * @see \Illuminate\Notifications\ChannelManager - */ - class Notification { - /** - * Send the given notification to the given notifiable entities. - * - * @param \Illuminate\Support\Collection|array|mixed $notifiables - * @param mixed $notification - * @return void - * @static - */ - public static function send($notifiables, $notification) - { - /** @var \Illuminate\Notifications\ChannelManager $instance */ - $instance->send($notifiables, $notification); - } - /** - * Send the given notification immediately. - * - * @param \Illuminate\Support\Collection|array|mixed $notifiables - * @param mixed $notification - * @param array|null $channels - * @return void - * @static - */ - public static function sendNow($notifiables, $notification, $channels = null) - { - /** @var \Illuminate\Notifications\ChannelManager $instance */ - $instance->sendNow($notifiables, $notification, $channels); - } - /** - * Get a channel instance. - * - * @param string|null $name - * @return mixed - * @static - */ - public static function channel($name = null) - { - /** @var \Illuminate\Notifications\ChannelManager $instance */ - return $instance->channel($name); - } - /** - * Get the default channel driver name. - * - * @return string - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Notifications\ChannelManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Get the default channel driver name. - * - * @return string - * @static - */ - public static function deliversVia() - { - /** @var \Illuminate\Notifications\ChannelManager $instance */ - return $instance->deliversVia(); - } - /** - * Set the default channel driver name. - * - * @param string $channel - * @return void - * @static - */ - public static function deliverVia($channel) - { - /** @var \Illuminate\Notifications\ChannelManager $instance */ - $instance->deliverVia($channel); - } - /** - * Set the locale of notifications. - * - * @param string $locale - * @return \Illuminate\Notifications\ChannelManager - * @static - */ - public static function locale($locale) - { - /** @var \Illuminate\Notifications\ChannelManager $instance */ - return $instance->locale($locale); - } - /** - * Get a driver instance. - * - * @param string $driver - * @return mixed - * @throws \InvalidArgumentException - * @static - */ - public static function driver($driver = null) - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Notifications\ChannelManager $instance */ - return $instance->driver($driver); - } - /** - * Register a custom driver creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return \Illuminate\Notifications\ChannelManager - * @static - */ - public static function extend($driver, $callback) - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Notifications\ChannelManager $instance */ - return $instance->extend($driver, $callback); - } - /** - * Get all of the created "drivers". - * - * @return array - * @static - */ - public static function getDrivers() - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Notifications\ChannelManager $instance */ - return $instance->getDrivers(); - } - /** - * Assert if a notification was sent based on a truth-test callback. - * - * @param mixed $notifiable - * @param string $notification - * @param callable|null $callback - * @return void - * @throws \Exception - * @static - */ - public static function assertSentTo($notifiable, $notification, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ - $instance->assertSentTo($notifiable, $notification, $callback); - } - /** - * Assert if a notification was sent a number of times. - * - * @param mixed $notifiable - * @param string $notification - * @param int $times - * @return void - * @static - */ - public static function assertSentToTimes($notifiable, $notification, $times = 1) - { - /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ - $instance->assertSentToTimes($notifiable, $notification, $times); - } - /** - * Determine if a notification was sent based on a truth-test callback. - * - * @param mixed $notifiable - * @param string $notification - * @param callable|null $callback - * @return void - * @throws \Exception - * @static - */ - public static function assertNotSentTo($notifiable, $notification, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ - $instance->assertNotSentTo($notifiable, $notification, $callback); - } - /** - * Assert that no notifications were sent. - * - * @return void - * @static - */ - public static function assertNothingSent() - { - /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ - $instance->assertNothingSent(); - } - /** - * Assert the total amount of times a notification was sent. - * - * @param int $expectedCount - * @param string $notification - * @return void - * @static - */ - public static function assertTimesSent($expectedCount, $notification) - { - /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ - $instance->assertTimesSent($expectedCount, $notification); - } - /** - * Get all of the notifications matching a truth-test callback. - * - * @param mixed $notifiable - * @param string $notification - * @param callable|null $callback - * @return \Illuminate\Support\Collection - * @static - */ - public static function sent($notifiable, $notification, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ - return $instance->sent($notifiable, $notification, $callback); - } - /** - * Determine if there are more notifications left to inspect. - * - * @param mixed $notifiable - * @param string $notification - * @return bool - * @static - */ - public static function hasSent($notifiable, $notification) - { - /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ - return $instance->hasSent($notifiable, $notification); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Support\Testing\Fakes\NotificationFake::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Support\Testing\Fakes\NotificationFake::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Support\Testing\Fakes\NotificationFake::hasMacro($name); - } - - } - /** - * - * - * @method static string sendResetLink(array $credentials) - * @method static mixed reset(array $credentials, \Closure $callback) - * @see \Illuminate\Auth\Passwords\PasswordBroker - */ - class Password { - /** - * Attempt to get the broker from the local cache. - * - * @param string|null $name - * @return \Illuminate\Contracts\Auth\PasswordBroker - * @static - */ - public static function broker($name = null) - { - /** @var \Illuminate\Auth\Passwords\PasswordBrokerManager $instance */ - return $instance->broker($name); - } - /** - * Get the default password broker name. - * - * @return string - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Auth\Passwords\PasswordBrokerManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Set the default password broker name. - * - * @param string $name - * @return void - * @static - */ - public static function setDefaultDriver($name) - { - /** @var \Illuminate\Auth\Passwords\PasswordBrokerManager $instance */ - $instance->setDefaultDriver($name); - } - - } - /** - * - * - * @see \Illuminate\Queue\QueueManager - * @see \Illuminate\Queue\Queue - */ - class Queue { - /** - * Register an event listener for the before job event. - * - * @param mixed $callback - * @return void - * @static - */ - public static function before($callback) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - $instance->before($callback); - } - /** - * Register an event listener for the after job event. - * - * @param mixed $callback - * @return void - * @static - */ - public static function after($callback) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - $instance->after($callback); - } - /** - * Register an event listener for the exception occurred job event. - * - * @param mixed $callback - * @return void - * @static - */ - public static function exceptionOccurred($callback) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - $instance->exceptionOccurred($callback); - } - /** - * Register an event listener for the daemon queue loop. - * - * @param mixed $callback - * @return void - * @static - */ - public static function looping($callback) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - $instance->looping($callback); - } - /** - * Register an event listener for the failed job event. - * - * @param mixed $callback - * @return void - * @static - */ - public static function failing($callback) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - $instance->failing($callback); - } - /** - * Register an event listener for the daemon queue stopping. - * - * @param mixed $callback - * @return void - * @static - */ - public static function stopping($callback) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - $instance->stopping($callback); - } - /** - * Determine if the driver is connected. - * - * @param string|null $name - * @return bool - * @static - */ - public static function connected($name = null) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - return $instance->connected($name); - } - /** - * Resolve a queue connection instance. - * - * @param string|null $name - * @return \Illuminate\Contracts\Queue\Queue - * @static - */ - public static function connection($name = null) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - return $instance->connection($name); - } - /** - * Add a queue connection resolver. - * - * @param string $driver - * @param \Closure $resolver - * @return void - * @static - */ - public static function extend($driver, $resolver) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - $instance->extend($driver, $resolver); - } - /** - * Add a queue connection resolver. - * - * @param string $driver - * @param \Closure $resolver - * @return void - * @static - */ - public static function addConnector($driver, $resolver) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - $instance->addConnector($driver, $resolver); - } - /** - * Get the name of the default queue connection. - * - * @return string - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Queue\QueueManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Set the name of the default queue connection. - * - * @param string $name - * @return void - * @static - */ - public static function setDefaultDriver($name) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - $instance->setDefaultDriver($name); - } - /** - * Get the full name for the given connection. - * - * @param string|null $connection - * @return string - * @static - */ - public static function getName($connection = null) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - return $instance->getName($connection); - } - /** - * Assert if a job was pushed based on a truth-test callback. - * - * @param string $job - * @param callable|int|null $callback - * @return void - * @static - */ - public static function assertPushed($job, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - $instance->assertPushed($job, $callback); - } - /** - * Assert if a job was pushed based on a truth-test callback. - * - * @param string $queue - * @param string $job - * @param callable|null $callback - * @return void - * @static - */ - public static function assertPushedOn($queue, $job, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - $instance->assertPushedOn($queue, $job, $callback); - } - /** - * Assert if a job was pushed with chained jobs based on a truth-test callback. - * - * @param string $job - * @param array $expectedChain - * @param callable|null $callback - * @return void - * @static - */ - public static function assertPushedWithChain($job, $expectedChain = [], $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - $instance->assertPushedWithChain($job, $expectedChain, $callback); - } - /** - * Assert if a job was pushed with an empty chain based on a truth-test callback. - * - * @param string $job - * @param callable|null $callback - * @return void - * @static - */ - public static function assertPushedWithoutChain($job, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - $instance->assertPushedWithoutChain($job, $callback); - } - /** - * Determine if a job was pushed based on a truth-test callback. - * - * @param string $job - * @param callable|null $callback - * @return void - * @static - */ - public static function assertNotPushed($job, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - $instance->assertNotPushed($job, $callback); - } - /** - * Assert that no jobs were pushed. - * - * @return void - * @static - */ - public static function assertNothingPushed() - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - $instance->assertNothingPushed(); - } - /** - * Get all of the jobs matching a truth-test callback. - * - * @param string $job - * @param callable|null $callback - * @return \Illuminate\Support\Collection - * @static - */ - public static function pushed($job, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->pushed($job, $callback); - } - /** - * Determine if there are any stored jobs for a given class. - * - * @param string $job - * @return bool - * @static - */ - public static function hasPushed($job) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->hasPushed($job); - } - /** - * Get the size of the queue. - * - * @param string|null $queue - * @return int - * @static - */ - public static function size($queue = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->size($queue); - } - /** - * Push a new job onto the queue. - * - * @param string $job - * @param mixed $data - * @param string|null $queue - * @return mixed - * @static - */ - public static function push($job, $data = '', $queue = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->push($job, $data, $queue); - } - /** - * Push a raw payload onto the queue. - * - * @param string $payload - * @param string|null $queue - * @param array $options - * @return mixed - * @static - */ - public static function pushRaw($payload, $queue = null, $options = []) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->pushRaw($payload, $queue, $options); - } - /** - * Push a new job onto the queue after a delay. - * - * @param \DateTimeInterface|\DateInterval|int $delay - * @param string $job - * @param mixed $data - * @param string|null $queue - * @return mixed - * @static - */ - public static function later($delay, $job, $data = '', $queue = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->later($delay, $job, $data, $queue); - } - /** - * Push a new job onto the queue. - * - * @param string $queue - * @param string $job - * @param mixed $data - * @return mixed - * @static - */ - public static function pushOn($queue, $job, $data = '') - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->pushOn($queue, $job, $data); - } - /** - * Push a new job onto the queue after a delay. - * - * @param string $queue - * @param \DateTimeInterface|\DateInterval|int $delay - * @param string $job - * @param mixed $data - * @return mixed - * @static - */ - public static function laterOn($queue, $delay, $job, $data = '') - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->laterOn($queue, $delay, $job, $data); - } - /** - * Pop the next job off of the queue. - * - * @param string|null $queue - * @return \Illuminate\Contracts\Queue\Job|null - * @static - */ - public static function pop($queue = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->pop($queue); - } - /** - * Push an array of jobs onto the queue. - * - * @param array $jobs - * @param mixed $data - * @param string|null $queue - * @return mixed - * @static - */ - public static function bulk($jobs, $data = '', $queue = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->bulk($jobs, $data, $queue); - } - /** - * Get the jobs that have been pushed. - * - * @return array - * @static - */ - public static function pushedJobs() - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->pushedJobs(); - } - /** - * Get the connection name for the queue. - * - * @return string - * @static - */ - public static function getConnectionName() - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->getConnectionName(); - } - /** - * Set the connection name for the queue. - * - * @param string $name - * @return \Illuminate\Support\Testing\Fakes\QueueFake - * @static - */ - public static function setConnectionName($name) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->setConnectionName($name); - } - /** - * Migrate the delayed jobs that are ready to the regular queue. - * - * @param string $from - * @param string $to - * @return array - * @static - */ - public static function migrateExpiredJobs($from, $to) - { - /** @var \Illuminate\Queue\RedisQueue $instance */ - return $instance->migrateExpiredJobs($from, $to); - } - /** - * Delete a reserved job from the queue. - * - * @param string $queue - * @param \Illuminate\Queue\Jobs\RedisJob $job - * @return void - * @static - */ - public static function deleteReserved($queue, $job) - { - /** @var \Illuminate\Queue\RedisQueue $instance */ - $instance->deleteReserved($queue, $job); - } - /** - * Delete a reserved job from the reserved queue and release it. - * - * @param string $queue - * @param \Illuminate\Queue\Jobs\RedisJob $job - * @param int $delay - * @return void - * @static - */ - public static function deleteAndRelease($queue, $job, $delay) - { - /** @var \Illuminate\Queue\RedisQueue $instance */ - $instance->deleteAndRelease($queue, $job, $delay); - } - /** - * Get the queue or return the default. - * - * @param string|null $queue - * @return string - * @static - */ - public static function getQueue($queue) - { - /** @var \Illuminate\Queue\RedisQueue $instance */ - return $instance->getQueue($queue); - } - /** - * Get the connection for the queue. - * - * @return \Illuminate\Redis\Connections\Connection - * @static - */ - public static function getConnection() - { - /** @var \Illuminate\Queue\RedisQueue $instance */ - return $instance->getConnection(); - } - /** - * Get the underlying Redis instance. - * - * @return \Illuminate\Contracts\Redis\Factory - * @static - */ - public static function getRedis() - { - /** @var \Illuminate\Queue\RedisQueue $instance */ - return $instance->getRedis(); - } - /** - * Get the retry delay for an object-based queue handler. - * - * @param mixed $job - * @return mixed - * @static - */ - public static function getJobRetryDelay($job) - { //Method inherited from \Illuminate\Queue\Queue - /** @var \Illuminate\Queue\RedisQueue $instance */ - return $instance->getJobRetryDelay($job); - } - /** - * Get the expiration timestamp for an object-based queue handler. - * - * @param mixed $job - * @return mixed - * @static - */ - public static function getJobExpiration($job) - { //Method inherited from \Illuminate\Queue\Queue - /** @var \Illuminate\Queue\RedisQueue $instance */ - return $instance->getJobExpiration($job); - } - /** - * Register a callback to be executed when creating job payloads. - * - * @param callable $callback - * @return void - * @static - */ - public static function createPayloadUsing($callback) - { //Method inherited from \Illuminate\Queue\Queue - \Illuminate\Queue\RedisQueue::createPayloadUsing($callback); - } - /** - * Set the IoC container instance. - * - * @param \Illuminate\Container\Container $container - * @return void - * @static - */ - public static function setContainer($container) - { //Method inherited from \Illuminate\Queue\Queue - /** @var \Illuminate\Queue\RedisQueue $instance */ - $instance->setContainer($container); - } - - } - /** - * - * - * @see \Illuminate\Routing\Redirector - */ - class Redirect { - /** - * Create a new redirect response to the "home" route. - * - * @param int $status - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function home($status = 302) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->home($status); - } - /** - * Create a new redirect response to the previous location. - * - * @param int $status - * @param array $headers - * @param mixed $fallback - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function back($status = 302, $headers = [], $fallback = false) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->back($status, $headers, $fallback); - } - /** - * Create a new redirect response to the current URI. - * - * @param int $status - * @param array $headers - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function refresh($status = 302, $headers = []) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->refresh($status, $headers); - } - /** - * Create a new redirect response, while putting the current URL in the session. - * - * @param string $path - * @param int $status - * @param array $headers - * @param bool|null $secure - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function guest($path, $status = 302, $headers = [], $secure = null) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->guest($path, $status, $headers, $secure); - } - /** - * Create a new redirect response to the previously intended location. - * - * @param string $default - * @param int $status - * @param array $headers - * @param bool|null $secure - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function intended($default = '/', $status = 302, $headers = [], $secure = null) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->intended($default, $status, $headers, $secure); - } - /** - * Set the intended url. - * - * @param string $url - * @return void - * @static - */ - public static function setIntendedUrl($url) - { - /** @var \Illuminate\Routing\Redirector $instance */ - $instance->setIntendedUrl($url); - } - /** - * Create a new redirect response to the given path. - * - * @param string $path - * @param int $status - * @param array $headers - * @param bool|null $secure - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function to($path, $status = 302, $headers = [], $secure = null) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->to($path, $status, $headers, $secure); - } - /** - * Create a new redirect response to an external URL (no validation). - * - * @param string $path - * @param int $status - * @param array $headers - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function away($path, $status = 302, $headers = []) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->away($path, $status, $headers); - } - /** - * Create a new redirect response to the given HTTPS path. - * - * @param string $path - * @param int $status - * @param array $headers - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function secure($path, $status = 302, $headers = []) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->secure($path, $status, $headers); - } - /** - * Create a new redirect response to a named route. - * - * @param string $route - * @param mixed $parameters - * @param int $status - * @param array $headers - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function route($route, $parameters = [], $status = 302, $headers = []) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->route($route, $parameters, $status, $headers); - } - /** - * Create a new redirect response to a controller action. - * - * @param string|array $action - * @param mixed $parameters - * @param int $status - * @param array $headers - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function action($action, $parameters = [], $status = 302, $headers = []) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->action($action, $parameters, $status, $headers); - } - /** - * Get the URL generator instance. - * - * @return \Illuminate\Routing\UrlGenerator - * @static - */ - public static function getUrlGenerator() - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->getUrlGenerator(); - } - /** - * Set the active session store. - * - * @param \Illuminate\Session\Store $session - * @return void - * @static - */ - public static function setSession($session) - { - /** @var \Illuminate\Routing\Redirector $instance */ - $instance->setSession($session); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Routing\Redirector::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Routing\Redirector::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Routing\Redirector::hasMacro($name); - } - - } - /** - * - * - * @method static \Illuminate\Redis\Limiters\ConcurrencyLimiterBuilder funnel(string $name) - * @method static \Illuminate\Redis\Limiters\DurationLimiterBuilder throttle(string $name) - * @see \Illuminate\Redis\RedisManager - * @see \Illuminate\Contracts\Redis\Factory - */ - class Redis { - /** - * Get a Redis connection by name. - * - * @param string|null $name - * @return \Illuminate\Redis\Connections\Connection - * @static - */ - public static function connection($name = null) - { - /** @var \Illuminate\Redis\RedisManager $instance */ - return $instance->connection($name); - } - /** - * Resolve the given connection by name. - * - * @param string|null $name - * @return \Illuminate\Redis\Connections\Connection - * @throws \InvalidArgumentException - * @static - */ - public static function resolve($name = null) - { - /** @var \Illuminate\Redis\RedisManager $instance */ - return $instance->resolve($name); - } - /** - * Return all of the created connections. - * - * @return array - * @static - */ - public static function connections() - { - /** @var \Illuminate\Redis\RedisManager $instance */ - return $instance->connections(); - } - /** - * Enable the firing of Redis command events. - * - * @return void - * @static - */ - public static function enableEvents() - { - /** @var \Illuminate\Redis\RedisManager $instance */ - $instance->enableEvents(); - } - /** - * Disable the firing of Redis command events. - * - * @return void - * @static - */ - public static function disableEvents() - { - /** @var \Illuminate\Redis\RedisManager $instance */ - $instance->disableEvents(); - } - /** - * Set the default driver. - * - * @param string $driver - * @return void - * @static - */ - public static function setDriver($driver) - { - /** @var \Illuminate\Redis\RedisManager $instance */ - $instance->setDriver($driver); - } - /** - * Register a custom driver creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return \Illuminate\Redis\RedisManager - * @static - */ - public static function extend($driver, $callback) - { - /** @var \Illuminate\Redis\RedisManager $instance */ - return $instance->extend($driver, $callback); - } - - } - /** - * - * - * @method static mixed filterFiles(mixed $files) - * @see \Illuminate\Http\Request - */ - class Request { - /** - * Create a new Illuminate HTTP request from server variables. - * - * @return static - * @static - */ - public static function capture() - { - return \Illuminate\Http\Request::capture(); - } - /** - * Return the Request instance. - * - * @return \Illuminate\Http\Request - * @static - */ - public static function instance() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->instance(); - } - /** - * Get the request method. - * - * @return string - * @static - */ - public static function method() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->method(); - } - /** - * Get the root URL for the application. - * - * @return string - * @static - */ - public static function root() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->root(); - } - /** - * Get the URL (no query string) for the request. - * - * @return string - * @static - */ - public static function url() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->url(); - } - /** - * Get the full URL for the request. - * - * @return string - * @static - */ - public static function fullUrl() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->fullUrl(); - } - /** - * Get the full URL for the request with the added query string parameters. - * - * @param array $query - * @return string - * @static - */ - public static function fullUrlWithQuery($query) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->fullUrlWithQuery($query); - } - /** - * Get the current path info for the request. - * - * @return string - * @static - */ - public static function path() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->path(); - } - /** - * Get the current decoded path info for the request. - * - * @return string - * @static - */ - public static function decodedPath() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->decodedPath(); - } - /** - * Get a segment from the URI (1 based index). - * - * @param int $index - * @param string|null $default - * @return string|null - * @static - */ - public static function segment($index, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->segment($index, $default); - } - /** - * Get all of the segments for the request path. - * - * @return array - * @static - */ - public static function segments() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->segments(); - } - /** - * Determine if the current request URI matches a pattern. - * - * @param mixed $patterns - * @return bool - * @static - */ - public static function is(...$patterns) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->is(...$patterns); - } - /** - * Determine if the route name matches a given pattern. - * - * @param mixed $patterns - * @return bool - * @static - */ - public static function routeIs(...$patterns) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->routeIs(...$patterns); - } - /** - * Determine if the current request URL and query string matches a pattern. - * - * @param mixed $patterns - * @return bool - * @static - */ - public static function fullUrlIs(...$patterns) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->fullUrlIs(...$patterns); - } - /** - * Determine if the request is the result of an AJAX call. - * - * @return bool - * @static - */ - public static function ajax() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->ajax(); - } - /** - * Determine if the request is the result of an PJAX call. - * - * @return bool - * @static - */ - public static function pjax() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->pjax(); - } - /** - * Determine if the request is the result of an prefetch call. - * - * @return bool - * @static - */ - public static function prefetch() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->prefetch(); - } - /** - * Determine if the request is over HTTPS. - * - * @return bool - * @static - */ - public static function secure() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->secure(); - } - /** - * Get the client IP address. - * - * @return string|null - * @static - */ - public static function ip() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->ip(); - } - /** - * Get the client IP addresses. - * - * @return array - * @static - */ - public static function ips() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->ips(); - } - /** - * Get the client user agent. - * - * @return string|null - * @static - */ - public static function userAgent() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->userAgent(); - } - /** - * Merge new input into the current request's input array. - * - * @param array $input - * @return \Illuminate\Http\Request - * @static - */ - public static function merge($input) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->merge($input); - } - /** - * Replace the input for the current request. - * - * @param array $input - * @return \Illuminate\Http\Request - * @static - */ - public static function replace($input) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->replace($input); - } - /** - * This method belongs to Symfony HttpFoundation and is not usually needed when using Laravel. - * - * Instead, you may use the "input" method. - * - * @param string $key - * @param mixed $default - * @return mixed - * @static - */ - public static function get($key, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->get($key, $default); - } - /** - * Get the JSON payload for the request. - * - * @param string|null $key - * @param mixed $default - * @return \Symfony\Component\HttpFoundation\ParameterBag|mixed - * @static - */ - public static function json($key = null, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->json($key, $default); - } - /** - * Create a new request instance from the given Laravel request. - * - * @param \Illuminate\Http\Request $from - * @param \Illuminate\Http\Request|null $to - * @return static - * @static - */ - public static function createFrom($from, $to = null) - { - return \Illuminate\Http\Request::createFrom($from, $to); - } - /** - * Create an Illuminate request from a Symfony instance. - * - * @param \Symfony\Component\HttpFoundation\Request $request - * @return static - * @static - */ - public static function createFromBase($request) - { - return \Illuminate\Http\Request::createFromBase($request); - } - /** - * Clones a request and overrides some of its parameters. - * - * @param array $query The GET parameters - * @param array $request The POST parameters - * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...) - * @param array $cookies The COOKIE parameters - * @param array $files The FILES parameters - * @param array $server The SERVER parameters - * @return static - * @static - */ - public static function duplicate($query = null, $request = null, $attributes = null, $cookies = null, $files = null, $server = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->duplicate($query, $request, $attributes, $cookies, $files, $server); - } - /** - * Get the session associated with the request. - * - * @return \Illuminate\Session\Store - * @throws \RuntimeException - * @static - */ - public static function session() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->session(); - } - /** - * Get the session associated with the request. - * - * @return \Illuminate\Session\Store|null - * @static - */ - public static function getSession() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->getSession(); - } - /** - * Set the session instance on the request. - * - * @param \Illuminate\Contracts\Session\Session $session - * @return void - * @static - */ - public static function setLaravelSession($session) - { - /** @var \Illuminate\Http\Request $instance */ - $instance->setLaravelSession($session); - } - /** - * Get the user making the request. - * - * @param string|null $guard - * @return mixed - * @static - */ - public static function user($guard = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->user($guard); - } - /** - * Get the route handling the request. - * - * @param string|null $param - * @param mixed $default - * @return \Illuminate\Routing\Route|object|string|null - * @static - */ - public static function route($param = null, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->route($param, $default); - } - /** - * Get a unique fingerprint for the request / route / IP address. - * - * @return string - * @throws \RuntimeException - * @static - */ - public static function fingerprint() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->fingerprint(); - } - /** - * Set the JSON payload for the request. - * - * @param \Symfony\Component\HttpFoundation\ParameterBag $json - * @return \Illuminate\Http\Request - * @static - */ - public static function setJson($json) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->setJson($json); - } - /** - * Get the user resolver callback. - * - * @return \Closure - * @static - */ - public static function getUserResolver() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->getUserResolver(); - } - /** - * Set the user resolver callback. - * - * @param \Closure $callback - * @return \Illuminate\Http\Request - * @static - */ - public static function setUserResolver($callback) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->setUserResolver($callback); - } - /** - * Get the route resolver callback. - * - * @return \Closure - * @static - */ - public static function getRouteResolver() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->getRouteResolver(); - } - /** - * Set the route resolver callback. - * - * @param \Closure $callback - * @return \Illuminate\Http\Request - * @static - */ - public static function setRouteResolver($callback) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->setRouteResolver($callback); - } - /** - * Get all of the input and files for the request. - * - * @return array - * @static - */ - public static function toArray() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->toArray(); - } - /** - * Determine if the given offset exists. - * - * @param string $offset - * @return bool - * @static - */ - public static function offsetExists($offset) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->offsetExists($offset); - } - /** - * Get the value at the given offset. - * - * @param string $offset - * @return mixed - * @static - */ - public static function offsetGet($offset) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->offsetGet($offset); - } - /** - * Set the value at the given offset. - * - * @param string $offset - * @param mixed $value - * @return void - * @static - */ - public static function offsetSet($offset, $value) - { - /** @var \Illuminate\Http\Request $instance */ - $instance->offsetSet($offset, $value); - } - /** - * Remove the value at the given offset. - * - * @param string $offset - * @return void - * @static - */ - public static function offsetUnset($offset) - { - /** @var \Illuminate\Http\Request $instance */ - $instance->offsetUnset($offset); - } - /** - * Sets the parameters for this request. - * - * This method also re-initializes all properties. - * - * @param array $query The GET parameters - * @param array $request The POST parameters - * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...) - * @param array $cookies The COOKIE parameters - * @param array $files The FILES parameters - * @param array $server The SERVER parameters - * @param string|resource|null $content The raw body data - * @static - */ - public static function initialize($query = [], $request = [], $attributes = [], $cookies = [], $files = [], $server = [], $content = null) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->initialize($query, $request, $attributes, $cookies, $files, $server, $content); - } - /** - * Creates a new request with values from PHP's super globals. - * - * @return static - * @static - */ - public static function createFromGlobals() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - return \Illuminate\Http\Request::createFromGlobals(); - } - /** - * Creates a Request based on a given URI and configuration. - * - * The information contained in the URI always take precedence - * over the other information (server and parameters). - * - * @param string $uri The URI - * @param string $method The HTTP method - * @param array $parameters The query (GET) or request (POST) parameters - * @param array $cookies The request cookies ($_COOKIE) - * @param array $files The request files ($_FILES) - * @param array $server The server parameters ($_SERVER) - * @param string|resource|null $content The raw body data - * @return static - * @static - */ - public static function create($uri, $method = 'GET', $parameters = [], $cookies = [], $files = [], $server = [], $content = null) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - return \Illuminate\Http\Request::create($uri, $method, $parameters, $cookies, $files, $server, $content); - } - /** - * Sets a callable able to create a Request instance. - * - * This is mainly useful when you need to override the Request class - * to keep BC with an existing system. It should not be used for any - * other purpose. - * - * @param callable|null $callable A PHP callable - * @static - */ - public static function setFactory($callable) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - return \Illuminate\Http\Request::setFactory($callable); - } - /** - * Overrides the PHP global variables according to this request instance. - * - * It overrides $_GET, $_POST, $_REQUEST, $_SERVER, $_COOKIE. - * $_FILES is never overridden, see rfc1867 - * - * @static - */ - public static function overrideGlobals() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->overrideGlobals(); - } - /** - * Sets a list of trusted proxies. - * - * You should only list the reverse proxies that you manage directly. - * - * @param array $proxies A list of trusted proxies, the string 'REMOTE_ADDR' will be replaced with $_SERVER['REMOTE_ADDR'] - * @param int $trustedHeaderSet A bit field of Request::HEADER_*, to set which headers to trust from your proxies - * @static - */ - public static function setTrustedProxies($proxies, $trustedHeaderSet) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - return \Illuminate\Http\Request::setTrustedProxies($proxies, $trustedHeaderSet); - } - /** - * Gets the list of trusted proxies. - * - * @return array An array of trusted proxies - * @static - */ - public static function getTrustedProxies() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - return \Illuminate\Http\Request::getTrustedProxies(); - } - /** - * Gets the set of trusted headers from trusted proxies. - * - * @return int A bit field of Request::HEADER_* that defines which headers are trusted from your proxies - * @static - */ - public static function getTrustedHeaderSet() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - return \Illuminate\Http\Request::getTrustedHeaderSet(); - } - /** - * Sets a list of trusted host patterns. - * - * You should only list the hosts you manage using regexs. - * - * @param array $hostPatterns A list of trusted host patterns - * @static - */ - public static function setTrustedHosts($hostPatterns) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - return \Illuminate\Http\Request::setTrustedHosts($hostPatterns); - } - /** - * Gets the list of trusted host patterns. - * - * @return array An array of trusted host patterns - * @static - */ - public static function getTrustedHosts() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - return \Illuminate\Http\Request::getTrustedHosts(); - } - /** - * Normalizes a query string. - * - * It builds a normalized query string, where keys/value pairs are alphabetized, - * have consistent escaping and unneeded delimiters are removed. - * - * @param string $qs Query string - * @return string A normalized query string for the Request - * @static - */ - public static function normalizeQueryString($qs) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - return \Illuminate\Http\Request::normalizeQueryString($qs); - } - /** - * Enables support for the _method request parameter to determine the intended HTTP method. - * - * Be warned that enabling this feature might lead to CSRF issues in your code. - * Check that you are using CSRF tokens when required. - * If the HTTP method parameter override is enabled, an html-form with method "POST" can be altered - * and used to send a "PUT" or "DELETE" request via the _method request parameter. - * If these methods are not protected against CSRF, this presents a possible vulnerability. - * - * The HTTP method can only be overridden when the real HTTP method is POST. - * - * @static - */ - public static function enableHttpMethodParameterOverride() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - return \Illuminate\Http\Request::enableHttpMethodParameterOverride(); - } - /** - * Checks whether support for the _method request parameter is enabled. - * - * @return bool True when the _method request parameter is enabled, false otherwise - * @static - */ - public static function getHttpMethodParameterOverride() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - return \Illuminate\Http\Request::getHttpMethodParameterOverride(); - } - /** - * Whether the request contains a Session which was started in one of the - * previous requests. - * - * @return bool - * @static - */ - public static function hasPreviousSession() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->hasPreviousSession(); - } - /** - * Whether the request contains a Session object. - * - * This method does not give any information about the state of the session object, - * like whether the session is started or not. It is just a way to check if this Request - * is associated with a Session instance. - * - * @return bool true when the Request contains a Session object, false otherwise - * @static - */ - public static function hasSession() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->hasSession(); - } - /** - * - * - * @static - */ - public static function setSession($session) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->setSession($session); - } - /** - * - * - * @internal - * @static - */ - public static function setSessionFactory($factory) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->setSessionFactory($factory); - } - /** - * Returns the client IP addresses. - * - * In the returned array the most trusted IP address is first, and the - * least trusted one last. The "real" client IP address is the last one, - * but this is also the least trusted one. Trusted proxies are stripped. - * - * Use this method carefully; you should use getClientIp() instead. - * - * @return array The client IP addresses - * @see getClientIp() - * @static - */ - public static function getClientIps() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getClientIps(); - } - /** - * Returns the client IP address. - * - * This method can read the client IP address from the "X-Forwarded-For" header - * when trusted proxies were set via "setTrustedProxies()". The "X-Forwarded-For" - * header value is a comma+space separated list of IP addresses, the left-most - * being the original client, and each successive proxy that passed the request - * adding the IP address where it received the request from. - * - * If your reverse proxy uses a different header name than "X-Forwarded-For", - * ("Client-Ip" for instance), configure it via the $trustedHeaderSet - * argument of the Request::setTrustedProxies() method instead. - * - * @return string|null The client IP address - * @see getClientIps() - * @see https://wikipedia.org/wiki/X-Forwarded-For - * @static - */ - public static function getClientIp() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getClientIp(); - } - /** - * Returns current script name. - * - * @return string - * @static - */ - public static function getScriptName() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getScriptName(); - } - /** - * Returns the path being requested relative to the executed script. - * - * The path info always starts with a /. - * - * Suppose this request is instantiated from /mysite on localhost: - * - * * http://localhost/mysite returns an empty string - * * http://localhost/mysite/about returns '/about' - * * http://localhost/mysite/enco%20ded returns '/enco%20ded' - * * http://localhost/mysite/about?var=1 returns '/about' - * - * @return string The raw path (i.e. not urldecoded) - * @static - */ - public static function getPathInfo() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getPathInfo(); - } - /** - * Returns the root path from which this request is executed. - * - * Suppose that an index.php file instantiates this request object: - * - * * http://localhost/index.php returns an empty string - * * http://localhost/index.php/page returns an empty string - * * http://localhost/web/index.php returns '/web' - * * http://localhost/we%20b/index.php returns '/we%20b' - * - * @return string The raw path (i.e. not urldecoded) - * @static - */ - public static function getBasePath() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getBasePath(); - } - /** - * Returns the root URL from which this request is executed. - * - * The base URL never ends with a /. - * - * This is similar to getBasePath(), except that it also includes the - * script filename (e.g. index.php) if one exists. - * - * @return string The raw URL (i.e. not urldecoded) - * @static - */ - public static function getBaseUrl() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getBaseUrl(); - } - /** - * Gets the request's scheme. - * - * @return string - * @static - */ - public static function getScheme() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getScheme(); - } - /** - * Returns the port on which the request is made. - * - * This method can read the client port from the "X-Forwarded-Port" header - * when trusted proxies were set via "setTrustedProxies()". - * - * The "X-Forwarded-Port" header must contain the client port. - * - * @return int|string can be a string if fetched from the server bag - * @static - */ - public static function getPort() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getPort(); - } - /** - * Returns the user. - * - * @return string|null - * @static - */ - public static function getUser() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getUser(); - } - /** - * Returns the password. - * - * @return string|null - * @static - */ - public static function getPassword() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getPassword(); - } - /** - * Gets the user info. - * - * @return string|null A user name if any and, optionally, scheme-specific information about how to gain authorization to access the server - * @static - */ - public static function getUserInfo() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getUserInfo(); - } - /** - * Returns the HTTP host being requested. - * - * The port name will be appended to the host if it's non-standard. - * - * @return string - * @static - */ - public static function getHttpHost() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getHttpHost(); - } - /** - * Returns the requested URI (path and query string). - * - * @return string The raw URI (i.e. not URI decoded) - * @static - */ - public static function getRequestUri() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getRequestUri(); - } - /** - * Gets the scheme and HTTP host. - * - * If the URL was called with basic authentication, the user - * and the password are not added to the generated string. - * - * @return string The scheme and HTTP host - * @static - */ - public static function getSchemeAndHttpHost() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getSchemeAndHttpHost(); - } - /** - * Generates a normalized URI (URL) for the Request. - * - * @return string A normalized URI (URL) for the Request - * @see getQueryString() - * @static - */ - public static function getUri() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getUri(); - } - /** - * Generates a normalized URI for the given path. - * - * @param string $path A path to use instead of the current one - * @return string The normalized URI for the path - * @static - */ - public static function getUriForPath($path) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getUriForPath($path); - } - /** - * Returns the path as relative reference from the current Request path. - * - * Only the URIs path component (no schema, host etc.) is relevant and must be given. - * Both paths must be absolute and not contain relative parts. - * Relative URLs from one resource to another are useful when generating self-contained downloadable document archives. - * Furthermore, they can be used to reduce the link size in documents. - * - * Example target paths, given a base path of "/a/b/c/d": - * - "/a/b/c/d" -> "" - * - "/a/b/c/" -> "./" - * - "/a/b/" -> "../" - * - "/a/b/c/other" -> "other" - * - "/a/x/y" -> "../../x/y" - * - * @param string $path The target path - * @return string The relative target path - * @static - */ - public static function getRelativeUriForPath($path) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getRelativeUriForPath($path); - } - /** - * Generates the normalized query string for the Request. - * - * It builds a normalized query string, where keys/value pairs are alphabetized - * and have consistent escaping. - * - * @return string|null A normalized query string for the Request - * @static - */ - public static function getQueryString() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getQueryString(); - } - /** - * Checks whether the request is secure or not. - * - * This method can read the client protocol from the "X-Forwarded-Proto" header - * when trusted proxies were set via "setTrustedProxies()". - * - * The "X-Forwarded-Proto" header must contain the protocol: "https" or "http". - * - * @return bool - * @static - */ - public static function isSecure() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->isSecure(); - } - /** - * Returns the host name. - * - * This method can read the client host name from the "X-Forwarded-Host" header - * when trusted proxies were set via "setTrustedProxies()". - * - * The "X-Forwarded-Host" header must contain the client host name. - * - * @return string - * @throws SuspiciousOperationException when the host name is invalid or not trusted - * @static - */ - public static function getHost() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getHost(); - } - /** - * Sets the request method. - * - * @param string $method - * @static - */ - public static function setMethod($method) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->setMethod($method); - } - /** - * Gets the request "intended" method. - * - * If the X-HTTP-Method-Override header is set, and if the method is a POST, - * then it is used to determine the "real" intended HTTP method. - * - * The _method request parameter can also be used to determine the HTTP method, - * but only if enableHttpMethodParameterOverride() has been called. - * - * The method is always an uppercased string. - * - * @return string The request method - * @see getRealMethod() - * @static - */ - public static function getMethod() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getMethod(); - } - /** - * Gets the "real" request method. - * - * @return string The request method - * @see getMethod() - * @static - */ - public static function getRealMethod() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getRealMethod(); - } - /** - * Gets the mime type associated with the format. - * - * @param string $format The format - * @return string|null The associated mime type (null if not found) - * @static - */ - public static function getMimeType($format) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getMimeType($format); - } - /** - * Gets the mime types associated with the format. - * - * @param string $format The format - * @return array The associated mime types - * @static - */ - public static function getMimeTypes($format) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - return \Illuminate\Http\Request::getMimeTypes($format); - } - /** - * Gets the format associated with the mime type. - * - * @param string $mimeType The associated mime type - * @return string|null The format (null if not found) - * @static - */ - public static function getFormat($mimeType) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getFormat($mimeType); - } - /** - * Associates a format with mime types. - * - * @param string $format The format - * @param string|array $mimeTypes The associated mime types (the preferred one must be the first as it will be used as the content type) - * @static - */ - public static function setFormat($format, $mimeTypes) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->setFormat($format, $mimeTypes); - } - /** - * Gets the request format. - * - * Here is the process to determine the format: - * - * * format defined by the user (with setRequestFormat()) - * * _format request attribute - * * $default - * - * @see getPreferredFormat - * @param string|null $default The default format - * @return string|null The request format - * @static - */ - public static function getRequestFormat($default = 'html') - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getRequestFormat($default); - } - /** - * Sets the request format. - * - * @param string $format The request format - * @static - */ - public static function setRequestFormat($format) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->setRequestFormat($format); - } - /** - * Gets the format associated with the request. - * - * @return string|null The format (null if no content type is present) - * @static - */ - public static function getContentType() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getContentType(); - } - /** - * Sets the default locale. - * - * @param string $locale - * @static - */ - public static function setDefaultLocale($locale) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->setDefaultLocale($locale); - } - /** - * Get the default locale. - * - * @return string - * @static - */ - public static function getDefaultLocale() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getDefaultLocale(); - } - /** - * Sets the locale. - * - * @param string $locale - * @static - */ - public static function setLocale($locale) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->setLocale($locale); - } - /** - * Get the locale. - * - * @return string - * @static - */ - public static function getLocale() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getLocale(); - } - /** - * Checks if the request method is of specified type. - * - * @param string $method Uppercase request method (GET, POST etc) - * @return bool - * @static - */ - public static function isMethod($method) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->isMethod($method); - } - /** - * Checks whether or not the method is safe. - * - * @see https://tools.ietf.org/html/rfc7231#section-4.2.1 - * @return bool - * @static - */ - public static function isMethodSafe() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->isMethodSafe(); - } - /** - * Checks whether or not the method is idempotent. - * - * @return bool - * @static - */ - public static function isMethodIdempotent() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->isMethodIdempotent(); - } - /** - * Checks whether the method is cacheable or not. - * - * @see https://tools.ietf.org/html/rfc7231#section-4.2.3 - * @return bool True for GET and HEAD, false otherwise - * @static - */ - public static function isMethodCacheable() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->isMethodCacheable(); - } - /** - * Returns the protocol version. - * - * If the application is behind a proxy, the protocol version used in the - * requests between the client and the proxy and between the proxy and the - * server might be different. This returns the former (from the "Via" header) - * if the proxy is trusted (see "setTrustedProxies()"), otherwise it returns - * the latter (from the "SERVER_PROTOCOL" server parameter). - * - * @return string|null - * @static - */ - public static function getProtocolVersion() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getProtocolVersion(); - } - /** - * Returns the request body content. - * - * @param bool $asResource If true, a resource will be returned - * @return string|resource The request body content or a resource to read the body stream - * @static - */ - public static function getContent($asResource = false) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getContent($asResource); - } - /** - * Gets the Etags. - * - * @return array The entity tags - * @static - */ - public static function getETags() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getETags(); - } - /** - * - * - * @return bool - * @static - */ - public static function isNoCache() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->isNoCache(); - } - /** - * Gets the preferred format for the response by inspecting, in the following order: - * * the request format set using setRequestFormat - * * the values of the Accept HTTP header. - * - * Note that if you use this method, you should send the "Vary: Accept" header - * in the response to prevent any issues with intermediary HTTP caches. - * - * @static - */ - public static function getPreferredFormat($default = 'html') - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getPreferredFormat($default); - } - /** - * Returns the preferred language. - * - * @param string[] $locales An array of ordered available locales - * @return string|null The preferred locale - * @static - */ - public static function getPreferredLanguage($locales = null) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getPreferredLanguage($locales); - } - /** - * Gets a list of languages acceptable by the client browser. - * - * @return array Languages ordered in the user browser preferences - * @static - */ - public static function getLanguages() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getLanguages(); - } - /** - * Gets a list of charsets acceptable by the client browser. - * - * @return array List of charsets in preferable order - * @static - */ - public static function getCharsets() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getCharsets(); - } - /** - * Gets a list of encodings acceptable by the client browser. - * - * @return array List of encodings in preferable order - * @static - */ - public static function getEncodings() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getEncodings(); - } - /** - * Gets a list of content types acceptable by the client browser. - * - * @return array List of content types in preferable order - * @static - */ - public static function getAcceptableContentTypes() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getAcceptableContentTypes(); - } - /** - * Returns true if the request is an XMLHttpRequest. - * - * It works if your JavaScript library sets an X-Requested-With HTTP header. - * It is known to work with common JavaScript frameworks: - * - * @see https://wikipedia.org/wiki/List_of_Ajax_frameworks#JavaScript - * @return bool true if the request is an XMLHttpRequest, false otherwise - * @static - */ - public static function isXmlHttpRequest() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->isXmlHttpRequest(); - } - /** - * Indicates whether this request originated from a trusted proxy. - * - * This can be useful to determine whether or not to trust the - * contents of a proxy-specific header. - * - * @return bool true if the request came from a trusted proxy, false otherwise - * @static - */ - public static function isFromTrustedProxy() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->isFromTrustedProxy(); - } - /** - * Determine if the given content types match. - * - * @param string $actual - * @param string $type - * @return bool - * @static - */ - public static function matchesType($actual, $type) - { - return \Illuminate\Http\Request::matchesType($actual, $type); - } - /** - * Determine if the request is sending JSON. - * - * @return bool - * @static - */ - public static function isJson() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->isJson(); - } - /** - * Determine if the current request probably expects a JSON response. - * - * @return bool - * @static - */ - public static function expectsJson() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->expectsJson(); - } - /** - * Determine if the current request is asking for JSON. - * - * @return bool - * @static - */ - public static function wantsJson() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->wantsJson(); - } - /** - * Determines whether the current requests accepts a given content type. - * - * @param string|array $contentTypes - * @return bool - * @static - */ - public static function accepts($contentTypes) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->accepts($contentTypes); - } - /** - * Return the most suitable content type from the given array based on content negotiation. - * - * @param string|array $contentTypes - * @return string|null - * @static - */ - public static function prefers($contentTypes) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->prefers($contentTypes); - } - /** - * Determine if the current request accepts any content type. - * - * @return bool - * @static - */ - public static function acceptsAnyContentType() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->acceptsAnyContentType(); - } - /** - * Determines whether a request accepts JSON. - * - * @return bool - * @static - */ - public static function acceptsJson() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->acceptsJson(); - } - /** - * Determines whether a request accepts HTML. - * - * @return bool - * @static - */ - public static function acceptsHtml() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->acceptsHtml(); - } - /** - * Get the data format expected in the response. - * - * @param string $default - * @return string - * @static - */ - public static function format($default = 'html') - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->format($default); - } - /** - * Retrieve an old input item. - * - * @param string|null $key - * @param string|array|null $default - * @return string|array - * @static - */ - public static function old($key = null, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->old($key, $default); - } - /** - * Flash the input for the current request to the session. - * - * @return void - * @static - */ - public static function flash() - { - /** @var \Illuminate\Http\Request $instance */ - $instance->flash(); - } - /** - * Flash only some of the input to the session. - * - * @param array|mixed $keys - * @return void - * @static - */ - public static function flashOnly($keys) - { - /** @var \Illuminate\Http\Request $instance */ - $instance->flashOnly($keys); - } - /** - * Flash only some of the input to the session. - * - * @param array|mixed $keys - * @return void - * @static - */ - public static function flashExcept($keys) - { - /** @var \Illuminate\Http\Request $instance */ - $instance->flashExcept($keys); - } - /** - * Flush all of the old input from the session. - * - * @return void - * @static - */ - public static function flush() - { - /** @var \Illuminate\Http\Request $instance */ - $instance->flush(); - } - /** - * Retrieve a server variable from the request. - * - * @param string|null $key - * @param string|array|null $default - * @return string|array|null - * @static - */ - public static function server($key = null, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->server($key, $default); - } - /** - * Determine if a header is set on the request. - * - * @param string $key - * @return bool - * @static - */ - public static function hasHeader($key) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->hasHeader($key); - } - /** - * Retrieve a header from the request. - * - * @param string|null $key - * @param string|array|null $default - * @return string|array|null - * @static - */ - public static function header($key = null, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->header($key, $default); - } - /** - * Get the bearer token from the request headers. - * - * @return string|null - * @static - */ - public static function bearerToken() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->bearerToken(); - } - /** - * Determine if the request contains a given input item key. - * - * @param string|array $key - * @return bool - * @static - */ - public static function exists($key) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->exists($key); - } - /** - * Determine if the request contains a given input item key. - * - * @param string|array $key - * @return bool - * @static - */ - public static function has($key) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->has($key); - } - /** - * Determine if the request contains any of the given inputs. - * - * @param string|array $keys - * @return bool - * @static - */ - public static function hasAny($keys) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->hasAny($keys); - } - /** - * Determine if the request contains a non-empty value for an input item. - * - * @param string|array $key - * @return bool - * @static - */ - public static function filled($key) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->filled($key); - } - /** - * Determine if the request contains a non-empty value for any of the given inputs. - * - * @param string|array $keys - * @return bool - * @static - */ - public static function anyFilled($keys) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->anyFilled($keys); - } - /** - * Determine if the request is missing a given input item key. - * - * @param string|array $key - * @return bool - * @static - */ - public static function missing($key) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->missing($key); - } - /** - * Get the keys for all of the input and files. - * - * @return array - * @static - */ - public static function keys() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->keys(); - } - /** - * Get all of the input and files for the request. - * - * @param array|mixed|null $keys - * @return array - * @static - */ - public static function all($keys = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->all($keys); - } - /** - * Retrieve an input item from the request. - * - * @param string|null $key - * @param mixed $default - * @return mixed - * @static - */ - public static function input($key = null, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->input($key, $default); - } - /** - * Retrieve input as a boolean value. - * - * Returns true when value is "1", "true", "on", and "yes". Otherwise, returns false. - * - * @param string|null $key - * @param bool $default - * @return bool - * @static - */ - public static function boolean($key = null, $default = false) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->boolean($key, $default); - } - /** - * Get a subset containing the provided keys with values from the input data. - * - * @param array|mixed $keys - * @return array - * @static - */ - public static function only($keys) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->only($keys); - } - /** - * Get all of the input except for a specified array of items. - * - * @param array|mixed $keys - * @return array - * @static - */ - public static function except($keys) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->except($keys); - } - /** - * Retrieve a query string item from the request. - * - * @param string|null $key - * @param string|array|null $default - * @return string|array|null - * @static - */ - public static function query($key = null, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->query($key, $default); - } - /** - * Retrieve a request payload item from the request. - * - * @param string|null $key - * @param string|array|null $default - * @return string|array|null - * @static - */ - public static function post($key = null, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->post($key, $default); - } - /** - * Determine if a cookie is set on the request. - * - * @param string $key - * @return bool - * @static - */ - public static function hasCookie($key) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->hasCookie($key); - } - /** - * Retrieve a cookie from the request. - * - * @param string|null $key - * @param string|array|null $default - * @return string|array|null - * @static - */ - public static function cookie($key = null, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->cookie($key, $default); - } - /** - * Get an array of all of the files on the request. - * - * @return array - * @static - */ - public static function allFiles() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->allFiles(); - } - /** - * Determine if the uploaded data contains a file. - * - * @param string $key - * @return bool - * @static - */ - public static function hasFile($key) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->hasFile($key); - } - /** - * Retrieve a file from the request. - * - * @param string|null $key - * @param mixed $default - * @return \Illuminate\Http\UploadedFile|\Illuminate\Http\UploadedFile[]|array|null - * @static - */ - public static function file($key = null, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->file($key, $default); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Http\Request::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Http\Request::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Http\Request::hasMacro($name); - } - /** - * - * - * @static - */ - public static function validate($rules, ...$params) - { - return \Illuminate\Http\Request::validate($rules, ...$params); - } - /** - * - * - * @static - */ - public static function validateWithBag($errorBag, $rules, ...$params) - { - return \Illuminate\Http\Request::validateWithBag($errorBag, $rules, ...$params); - } - /** - * - * - * @static - */ - public static function hasValidSignature($absolute = true) - { - return \Illuminate\Http\Request::hasValidSignature($absolute); - } - - } - /** - * - * - * @see \Illuminate\Contracts\Routing\ResponseFactory - */ - class Response { - /** - * Create a new response instance. - * - * @param string $content - * @param int $status - * @param array $headers - * @return \Illuminate\Http\Response - * @static - */ - public static function make($content = '', $status = 200, $headers = []) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->make($content, $status, $headers); - } - /** - * Create a new "no content" response. - * - * @param int $status - * @param array $headers - * @return \Illuminate\Http\Response - * @static - */ - public static function noContent($status = 204, $headers = []) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->noContent($status, $headers); - } - /** - * Create a new response for a given view. - * - * @param string|array $view - * @param array $data - * @param int $status - * @param array $headers - * @return \Illuminate\Http\Response - * @static - */ - public static function view($view, $data = [], $status = 200, $headers = []) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->view($view, $data, $status, $headers); - } - /** - * Create a new JSON response instance. - * - * @param mixed $data - * @param int $status - * @param array $headers - * @param int $options - * @return \Illuminate\Http\JsonResponse - * @static - */ - public static function json($data = [], $status = 200, $headers = [], $options = 0) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->json($data, $status, $headers, $options); - } - /** - * Create a new JSONP response instance. - * - * @param string $callback - * @param mixed $data - * @param int $status - * @param array $headers - * @param int $options - * @return \Illuminate\Http\JsonResponse - * @static - */ - public static function jsonp($callback, $data = [], $status = 200, $headers = [], $options = 0) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->jsonp($callback, $data, $status, $headers, $options); - } - /** - * Create a new streamed response instance. - * - * @param \Closure $callback - * @param int $status - * @param array $headers - * @return \Symfony\Component\HttpFoundation\StreamedResponse - * @static - */ - public static function stream($callback, $status = 200, $headers = []) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->stream($callback, $status, $headers); - } - /** - * Create a new streamed response instance as a file download. - * - * @param \Closure $callback - * @param string|null $name - * @param array $headers - * @param string|null $disposition - * @return \Symfony\Component\HttpFoundation\StreamedResponse - * @static - */ - public static function streamDownload($callback, $name = null, $headers = [], $disposition = 'attachment') - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->streamDownload($callback, $name, $headers, $disposition); - } - /** - * Create a new file download response. - * - * @param \SplFileInfo|string $file - * @param string|null $name - * @param array $headers - * @param string|null $disposition - * @return \Symfony\Component\HttpFoundation\BinaryFileResponse - * @static - */ - public static function download($file, $name = null, $headers = [], $disposition = 'attachment') - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->download($file, $name, $headers, $disposition); - } - /** - * Return the raw contents of a binary file. - * - * @param \SplFileInfo|string $file - * @param array $headers - * @return \Symfony\Component\HttpFoundation\BinaryFileResponse - * @static - */ - public static function file($file, $headers = []) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->file($file, $headers); - } - /** - * Create a new redirect response to the given path. - * - * @param string $path - * @param int $status - * @param array $headers - * @param bool|null $secure - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function redirectTo($path, $status = 302, $headers = [], $secure = null) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->redirectTo($path, $status, $headers, $secure); - } - /** - * Create a new redirect response to a named route. - * - * @param string $route - * @param array $parameters - * @param int $status - * @param array $headers - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function redirectToRoute($route, $parameters = [], $status = 302, $headers = []) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->redirectToRoute($route, $parameters, $status, $headers); - } - /** - * Create a new redirect response to a controller action. - * - * @param string $action - * @param array $parameters - * @param int $status - * @param array $headers - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function redirectToAction($action, $parameters = [], $status = 302, $headers = []) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->redirectToAction($action, $parameters, $status, $headers); - } - /** - * Create a new redirect response, while putting the current URL in the session. - * - * @param string $path - * @param int $status - * @param array $headers - * @param bool|null $secure - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function redirectGuest($path, $status = 302, $headers = [], $secure = null) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->redirectGuest($path, $status, $headers, $secure); - } - /** - * Create a new redirect response to the previously intended location. - * - * @param string $default - * @param int $status - * @param array $headers - * @param bool|null $secure - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function redirectToIntended($default = '/', $status = 302, $headers = [], $secure = null) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->redirectToIntended($default, $status, $headers, $secure); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Routing\ResponseFactory::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Routing\ResponseFactory::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Routing\ResponseFactory::hasMacro($name); - } - - } - /** - * - * - * @method static \Illuminate\Routing\RouteRegistrar prefix(string $prefix) - * @method static \Illuminate\Routing\RouteRegistrar where(array $where) - * @method static \Illuminate\Routing\RouteRegistrar middleware(array|string|null $middleware) - * @method static \Illuminate\Routing\RouteRegistrar as(string $value) - * @method static \Illuminate\Routing\RouteRegistrar domain(string $value) - * @method static \Illuminate\Routing\RouteRegistrar name(string $value) - * @method static \Illuminate\Routing\RouteRegistrar namespace(string $value) - * @see \Illuminate\Routing\Router - */ - class Route { - /** - * Register a new GET route with the router. - * - * @param string $uri - * @param \Closure|array|string|callable|null $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function get($uri, $action = null) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->get($uri, $action); - } - /** - * Register a new POST route with the router. - * - * @param string $uri - * @param \Closure|array|string|callable|null $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function post($uri, $action = null) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->post($uri, $action); - } - /** - * Register a new PUT route with the router. - * - * @param string $uri - * @param \Closure|array|string|callable|null $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function put($uri, $action = null) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->put($uri, $action); - } - /** - * Register a new PATCH route with the router. - * - * @param string $uri - * @param \Closure|array|string|callable|null $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function patch($uri, $action = null) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->patch($uri, $action); - } - /** - * Register a new DELETE route with the router. - * - * @param string $uri - * @param \Closure|array|string|callable|null $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function delete($uri, $action = null) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->delete($uri, $action); - } - /** - * Register a new OPTIONS route with the router. - * - * @param string $uri - * @param \Closure|array|string|callable|null $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function options($uri, $action = null) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->options($uri, $action); - } - /** - * Register a new route responding to all verbs. - * - * @param string $uri - * @param \Closure|array|string|callable|null $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function any($uri, $action = null) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->any($uri, $action); - } - /** - * Register a new Fallback route with the router. - * - * @param \Closure|array|string|callable|null $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function fallback($action) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->fallback($action); - } - /** - * Create a redirect from one URI to another. - * - * @param string $uri - * @param string $destination - * @param int $status - * @return \Illuminate\Routing\Route - * @static - */ - public static function redirect($uri, $destination, $status = 302) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->redirect($uri, $destination, $status); - } - /** - * Create a permanent redirect from one URI to another. - * - * @param string $uri - * @param string $destination - * @return \Illuminate\Routing\Route - * @static - */ - public static function permanentRedirect($uri, $destination) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->permanentRedirect($uri, $destination); - } - /** - * Register a new route that returns a view. - * - * @param string $uri - * @param string $view - * @param array $data - * @return \Illuminate\Routing\Route - * @static - */ - public static function view($uri, $view, $data = []) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->view($uri, $view, $data); - } - /** - * Register a new route with the given verbs. - * - * @param array|string $methods - * @param string $uri - * @param \Closure|array|string|callable|null $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function match($methods, $uri, $action = null) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->match($methods, $uri, $action); - } - /** - * Register an array of resource controllers. - * - * @param array $resources - * @param array $options - * @return void - * @static - */ - public static function resources($resources, $options = []) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->resources($resources, $options); - } - /** - * Route a resource to a controller. - * - * @param string $name - * @param string $controller - * @param array $options - * @return \Illuminate\Routing\PendingResourceRegistration - * @static - */ - public static function resource($name, $controller, $options = []) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->resource($name, $controller, $options); - } - /** - * Register an array of API resource controllers. - * - * @param array $resources - * @param array $options - * @return void - * @static - */ - public static function apiResources($resources, $options = []) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->apiResources($resources, $options); - } - /** - * Route an API resource to a controller. - * - * @param string $name - * @param string $controller - * @param array $options - * @return \Illuminate\Routing\PendingResourceRegistration - * @static - */ - public static function apiResource($name, $controller, $options = []) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->apiResource($name, $controller, $options); - } - /** - * Create a route group with shared attributes. - * - * @param array $attributes - * @param \Closure|string $routes - * @return void - * @static - */ - public static function group($attributes, $routes) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->group($attributes, $routes); - } - /** - * Merge the given array with the last group stack. - * - * @param array $new - * @return array - * @static - */ - public static function mergeWithLastGroup($new) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->mergeWithLastGroup($new); - } - /** - * Get the prefix from the last group on the stack. - * - * @return string - * @static - */ - public static function getLastGroupPrefix() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->getLastGroupPrefix(); - } - /** - * Add a route to the underlying route collection. - * - * @param array|string $methods - * @param string $uri - * @param \Closure|array|string|callable|null $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function addRoute($methods, $uri, $action) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->addRoute($methods, $uri, $action); - } - /** - * Return the response returned by the given route. - * - * @param string $name - * @return \Symfony\Component\HttpFoundation\Response - * @static - */ - public static function respondWithRoute($name) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->respondWithRoute($name); - } - /** - * Dispatch the request to the application. - * - * @param \Illuminate\Http\Request $request - * @return \Symfony\Component\HttpFoundation\Response - * @static - */ - public static function dispatch($request) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->dispatch($request); - } - /** - * Dispatch the request to a route and return the response. - * - * @param \Illuminate\Http\Request $request - * @return \Symfony\Component\HttpFoundation\Response - * @static - */ - public static function dispatchToRoute($request) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->dispatchToRoute($request); - } - /** - * Gather the middleware for the given route with resolved class names. - * - * @param \Illuminate\Routing\Route $route - * @return array - * @static - */ - public static function gatherRouteMiddleware($route) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->gatherRouteMiddleware($route); - } - /** - * Create a response instance from the given value. - * - * @param \Symfony\Component\HttpFoundation\Request $request - * @param mixed $response - * @return \Symfony\Component\HttpFoundation\Response - * @static - */ - public static function prepareResponse($request, $response) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->prepareResponse($request, $response); - } - /** - * Static version of prepareResponse. - * - * @param \Symfony\Component\HttpFoundation\Request $request - * @param mixed $response - * @return \Symfony\Component\HttpFoundation\Response - * @static - */ - public static function toResponse($request, $response) - { - return \Illuminate\Routing\Router::toResponse($request, $response); - } - /** - * Substitute the route bindings onto the route. - * - * @param \Illuminate\Routing\Route $route - * @return \Illuminate\Routing\Route - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - * @static - */ - public static function substituteBindings($route) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->substituteBindings($route); - } - /** - * Substitute the implicit Eloquent model bindings for the route. - * - * @param \Illuminate\Routing\Route $route - * @return void - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - * @static - */ - public static function substituteImplicitBindings($route) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->substituteImplicitBindings($route); - } - /** - * Register a route matched event listener. - * - * @param string|callable $callback - * @return void - * @static - */ - public static function matched($callback) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->matched($callback); - } - /** - * Get all of the defined middleware short-hand names. - * - * @return array - * @static - */ - public static function getMiddleware() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->getMiddleware(); - } - /** - * Register a short-hand name for a middleware. - * - * @param string $name - * @param string $class - * @return \Illuminate\Routing\Router - * @static - */ - public static function aliasMiddleware($name, $class) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->aliasMiddleware($name, $class); - } - /** - * Check if a middlewareGroup with the given name exists. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMiddlewareGroup($name) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->hasMiddlewareGroup($name); - } - /** - * Get all of the defined middleware groups. - * - * @return array - * @static - */ - public static function getMiddlewareGroups() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->getMiddlewareGroups(); - } - /** - * Register a group of middleware. - * - * @param string $name - * @param array $middleware - * @return \Illuminate\Routing\Router - * @static - */ - public static function middlewareGroup($name, $middleware) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->middlewareGroup($name, $middleware); - } - /** - * Add a middleware to the beginning of a middleware group. - * - * If the middleware is already in the group, it will not be added again. - * - * @param string $group - * @param string $middleware - * @return \Illuminate\Routing\Router - * @static - */ - public static function prependMiddlewareToGroup($group, $middleware) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->prependMiddlewareToGroup($group, $middleware); - } - /** - * Add a middleware to the end of a middleware group. - * - * If the middleware is already in the group, it will not be added again. - * - * @param string $group - * @param string $middleware - * @return \Illuminate\Routing\Router - * @static - */ - public static function pushMiddlewareToGroup($group, $middleware) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->pushMiddlewareToGroup($group, $middleware); - } - /** - * Add a new route parameter binder. - * - * @param string $key - * @param string|callable $binder - * @return void - * @static - */ - public static function bind($key, $binder) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->bind($key, $binder); - } - /** - * Register a model binder for a wildcard. - * - * @param string $key - * @param string $class - * @param \Closure|null $callback - * @return void - * @static - */ - public static function model($key, $class, $callback = null) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->model($key, $class, $callback); - } - /** - * Get the binding callback for a given binding. - * - * @param string $key - * @return \Closure|null - * @static - */ - public static function getBindingCallback($key) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->getBindingCallback($key); - } - /** - * Get the global "where" patterns. - * - * @return array - * @static - */ - public static function getPatterns() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->getPatterns(); - } - /** - * Set a global where pattern on all routes. - * - * @param string $key - * @param string $pattern - * @return void - * @static - */ - public static function pattern($key, $pattern) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->pattern($key, $pattern); - } - /** - * Set a group of global where patterns on all routes. - * - * @param array $patterns - * @return void - * @static - */ - public static function patterns($patterns) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->patterns($patterns); - } - /** - * Determine if the router currently has a group stack. - * - * @return bool - * @static - */ - public static function hasGroupStack() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->hasGroupStack(); - } - /** - * Get the current group stack for the router. - * - * @return array - * @static - */ - public static function getGroupStack() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->getGroupStack(); - } - /** - * Get a route parameter for the current route. - * - * @param string $key - * @param string|null $default - * @return mixed - * @static - */ - public static function input($key, $default = null) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->input($key, $default); - } - /** - * Get the request currently being dispatched. - * - * @return \Illuminate\Http\Request - * @static - */ - public static function getCurrentRequest() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->getCurrentRequest(); - } - /** - * Get the currently dispatched route instance. - * - * @return \Illuminate\Routing\Route - * @static - */ - public static function getCurrentRoute() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->getCurrentRoute(); - } - /** - * Get the currently dispatched route instance. - * - * @return \Illuminate\Routing\Route|null - * @static - */ - public static function current() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->current(); - } - /** - * Check if a route with the given name exists. - * - * @param string $name - * @return bool - * @static - */ - public static function has($name) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->has($name); - } - /** - * Get the current route name. - * - * @return string|null - * @static - */ - public static function currentRouteName() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->currentRouteName(); - } - /** - * Alias for the "currentRouteNamed" method. - * - * @param mixed $patterns - * @return bool - * @static - */ - public static function is(...$patterns) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->is(...$patterns); - } - /** - * Determine if the current route matches a pattern. - * - * @param mixed $patterns - * @return bool - * @static - */ - public static function currentRouteNamed(...$patterns) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->currentRouteNamed(...$patterns); - } - /** - * Get the current route action. - * - * @return string|null - * @static - */ - public static function currentRouteAction() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->currentRouteAction(); - } - /** - * Alias for the "currentRouteUses" method. - * - * @param array $patterns - * @return bool - * @static - */ - public static function uses(...$patterns) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->uses(...$patterns); - } - /** - * Determine if the current route action matches a given action. - * - * @param string $action - * @return bool - * @static - */ - public static function currentRouteUses($action) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->currentRouteUses($action); - } - /** - * Register the typical authentication routes for an application. - * - * @param array $options - * @return void - * @static - */ - public static function auth($options = []) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->auth($options); - } - /** - * Register the typical reset password routes for an application. - * - * @return void - * @static - */ - public static function resetPassword() - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->resetPassword(); - } - /** - * Register the typical confirm password routes for an application. - * - * @return void - * @static - */ - public static function confirmPassword() - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->confirmPassword(); - } - /** - * Register the typical email verification routes for an application. - * - * @return void - * @static - */ - public static function emailVerification() - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->emailVerification(); - } - /** - * Set the unmapped global resource parameters to singular. - * - * @param bool $singular - * @return void - * @static - */ - public static function singularResourceParameters($singular = true) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->singularResourceParameters($singular); - } - /** - * Set the global resource parameter mapping. - * - * @param array $parameters - * @return void - * @static - */ - public static function resourceParameters($parameters = []) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->resourceParameters($parameters); - } - /** - * Get or set the verbs used in the resource URIs. - * - * @param array $verbs - * @return array|null - * @static - */ - public static function resourceVerbs($verbs = []) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->resourceVerbs($verbs); - } - /** - * Get the underlying route collection. - * - * @return \Illuminate\Routing\RouteCollection - * @static - */ - public static function getRoutes() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->getRoutes(); - } - /** - * Set the route collection instance. - * - * @param \Illuminate\Routing\RouteCollection $routes - * @return void - * @static - */ - public static function setRoutes($routes) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->setRoutes($routes); - } - /** - * Remove any duplicate middleware from the given array. - * - * @param array $middleware - * @return array - * @static - */ - public static function uniqueMiddleware($middleware) - { - return \Illuminate\Routing\Router::uniqueMiddleware($middleware); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Routing\Router::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Routing\Router::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Routing\Router::hasMacro($name); - } - /** - * Dynamically handle calls to the class. - * - * @param string $method - * @param array $parameters - * @return mixed - * @throws \BadMethodCallException - * @static - */ - public static function macroCall($method, $parameters) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->macroCall($method, $parameters); - } - - } - /** - * - * - * @see \Illuminate\Database\Schema\Builder - */ - class Schema { - /** - * Determine if the given table exists. - * - * @param string $table - * @return bool - * @static - */ - public static function hasTable($table) - { - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->hasTable($table); - } - /** - * Get the column listing for a given table. - * - * @param string $table - * @return array - * @static - */ - public static function getColumnListing($table) - { - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->getColumnListing($table); - } - /** - * Drop all tables from the database. - * - * @return void - * @static - */ - public static function dropAllTables() - { - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->dropAllTables(); - } - /** - * Drop all views from the database. - * - * @return void - * @static - */ - public static function dropAllViews() - { - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->dropAllViews(); - } - /** - * Get all of the table names for the database. - * - * @return array - * @static - */ - public static function getAllTables() - { - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->getAllTables(); - } - /** - * Get all of the view names for the database. - * - * @return array - * @static - */ - public static function getAllViews() - { - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->getAllViews(); - } - /** - * Set the default string length for migrations. - * - * @param int $length - * @return void - * @static - */ - public static function defaultStringLength($length) - { //Method inherited from \Illuminate\Database\Schema\Builder - \Illuminate\Database\Schema\MySqlBuilder::defaultStringLength($length); - } - /** - * Determine if the given table has a given column. - * - * @param string $table - * @param string $column - * @return bool - * @static - */ - public static function hasColumn($table, $column) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->hasColumn($table, $column); - } - /** - * Determine if the given table has given columns. - * - * @param string $table - * @param array $columns - * @return bool - * @static - */ - public static function hasColumns($table, $columns) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->hasColumns($table, $columns); - } - /** - * Get the data type for the given column name. - * - * @param string $table - * @param string $column - * @return string - * @static - */ - public static function getColumnType($table, $column) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->getColumnType($table, $column); - } - /** - * Modify a table on the schema. - * - * @param string $table - * @param \Closure $callback - * @return void - * @static - */ - public static function table($table, $callback) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->table($table, $callback); - } - /** - * Create a new table on the schema. - * - * @param string $table - * @param \Closure $callback - * @return void - * @static - */ - public static function create($table, $callback) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->create($table, $callback); - } - /** - * Drop a table from the schema. - * - * @param string $table - * @return void - * @static - */ - public static function drop($table) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->drop($table); - } - /** - * Drop a table from the schema if it exists. - * - * @param string $table - * @return void - * @static - */ - public static function dropIfExists($table) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->dropIfExists($table); - } - /** - * Drop all types from the database. - * - * @return void - * @throws \LogicException - * @static - */ - public static function dropAllTypes() - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->dropAllTypes(); - } - /** - * Rename a table on the schema. - * - * @param string $from - * @param string $to - * @return void - * @static - */ - public static function rename($from, $to) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->rename($from, $to); - } - /** - * Enable foreign key constraints. - * - * @return bool - * @static - */ - public static function enableForeignKeyConstraints() - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->enableForeignKeyConstraints(); - } - /** - * Disable foreign key constraints. - * - * @return bool - * @static - */ - public static function disableForeignKeyConstraints() - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->disableForeignKeyConstraints(); - } - /** - * Register a custom Doctrine mapping type. - * - * @param string $class - * @param string $name - * @param string $type - * @return void - * @throws \Doctrine\DBAL\DBALException - * @throws \RuntimeException - * @static - */ - public static function registerCustomDoctrineType($class, $name, $type) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->registerCustomDoctrineType($class, $name, $type); - } - /** - * Get the database connection instance. - * - * @return \Illuminate\Database\Connection - * @static - */ - public static function getConnection() - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->getConnection(); - } - /** - * Set the database connection instance. - * - * @param \Illuminate\Database\Connection $connection - * @return \Illuminate\Database\Schema\MySqlBuilder - * @static - */ - public static function setConnection($connection) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->setConnection($connection); - } - /** - * Set the Schema Blueprint resolver callback. - * - * @param \Closure $resolver - * @return void - * @static - */ - public static function blueprintResolver($resolver) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->blueprintResolver($resolver); - } - - } - /** - * - * - * @see \Illuminate\Session\SessionManager - * @see \Illuminate\Session\Store - */ - class Session { - /** - * Get the session configuration. - * - * @return array - * @static - */ - public static function getSessionConfig() - { - /** @var \Illuminate\Session\SessionManager $instance */ - return $instance->getSessionConfig(); - } - /** - * Get the default session driver name. - * - * @return string - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Session\SessionManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Set the default session driver name. - * - * @param string $name - * @return void - * @static - */ - public static function setDefaultDriver($name) - { - /** @var \Illuminate\Session\SessionManager $instance */ - $instance->setDefaultDriver($name); - } - /** - * Get a driver instance. - * - * @param string $driver - * @return mixed - * @throws \InvalidArgumentException - * @static - */ - public static function driver($driver = null) - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Session\SessionManager $instance */ - return $instance->driver($driver); - } - /** - * Register a custom driver creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return \Illuminate\Session\SessionManager - * @static - */ - public static function extend($driver, $callback) - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Session\SessionManager $instance */ - return $instance->extend($driver, $callback); - } - /** - * Get all of the created "drivers". - * - * @return array - * @static - */ - public static function getDrivers() - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Session\SessionManager $instance */ - return $instance->getDrivers(); - } - /** - * Start the session, reading the data from a handler. - * - * @return bool - * @static - */ - public static function start() - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->start(); - } - /** - * Save the session data to storage. - * - * @return void - * @static - */ - public static function save() - { - /** @var \Illuminate\Session\Store $instance */ - $instance->save(); - } - /** - * Age the flash data for the session. - * - * @return void - * @static - */ - public static function ageFlashData() - { - /** @var \Illuminate\Session\Store $instance */ - $instance->ageFlashData(); - } - /** - * Get all of the session data. - * - * @return array - * @static - */ - public static function all() - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->all(); - } - /** - * Get a subset of the session data. - * - * @param array $keys - * @return array - * @static - */ - public static function only($keys) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->only($keys); - } - /** - * Checks if a key exists. - * - * @param string|array $key - * @return bool - * @static - */ - public static function exists($key) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->exists($key); - } - /** - * Checks if a key is present and not null. - * - * @param string|array $key - * @return bool - * @static - */ - public static function has($key) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->has($key); - } - /** - * Get an item from the session. - * - * @param string $key - * @param mixed $default - * @return mixed - * @static - */ - public static function get($key, $default = null) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->get($key, $default); - } - /** - * Get the value of a given key and then forget it. - * - * @param string $key - * @param string|null $default - * @return mixed - * @static - */ - public static function pull($key, $default = null) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->pull($key, $default); - } - /** - * Determine if the session contains old input. - * - * @param string|null $key - * @return bool - * @static - */ - public static function hasOldInput($key = null) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->hasOldInput($key); - } - /** - * Get the requested item from the flashed input array. - * - * @param string|null $key - * @param mixed $default - * @return mixed - * @static - */ - public static function getOldInput($key = null, $default = null) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->getOldInput($key, $default); - } - /** - * Replace the given session attributes entirely. - * - * @param array $attributes - * @return void - * @static - */ - public static function replace($attributes) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->replace($attributes); - } - /** - * Put a key / value pair or array of key / value pairs in the session. - * - * @param string|array $key - * @param mixed $value - * @return void - * @static - */ - public static function put($key, $value = null) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->put($key, $value); - } - /** - * Get an item from the session, or store the default value. - * - * @param string $key - * @param \Closure $callback - * @return mixed - * @static - */ - public static function remember($key, $callback) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->remember($key, $callback); - } - /** - * Push a value onto a session array. - * - * @param string $key - * @param mixed $value - * @return void - * @static - */ - public static function push($key, $value) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->push($key, $value); - } - /** - * Increment the value of an item in the session. - * - * @param string $key - * @param int $amount - * @return mixed - * @static - */ - public static function increment($key, $amount = 1) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->increment($key, $amount); - } - /** - * Decrement the value of an item in the session. - * - * @param string $key - * @param int $amount - * @return int - * @static - */ - public static function decrement($key, $amount = 1) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->decrement($key, $amount); - } - /** - * Flash a key / value pair to the session. - * - * @param string $key - * @param mixed $value - * @return void - * @static - */ - public static function flash($key, $value = true) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->flash($key, $value); - } - /** - * Flash a key / value pair to the session for immediate use. - * - * @param string $key - * @param mixed $value - * @return void - * @static - */ - public static function now($key, $value) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->now($key, $value); - } - /** - * Reflash all of the session flash data. - * - * @return void - * @static - */ - public static function reflash() - { - /** @var \Illuminate\Session\Store $instance */ - $instance->reflash(); - } - /** - * Reflash a subset of the current flash data. - * - * @param array|mixed $keys - * @return void - * @static - */ - public static function keep($keys = null) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->keep($keys); - } - /** - * Flash an input array to the session. - * - * @param array $value - * @return void - * @static - */ - public static function flashInput($value) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->flashInput($value); - } - /** - * Remove an item from the session, returning its value. - * - * @param string $key - * @return mixed - * @static - */ - public static function remove($key) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->remove($key); - } - /** - * Remove one or many items from the session. - * - * @param string|array $keys - * @return void - * @static - */ - public static function forget($keys) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->forget($keys); - } - /** - * Remove all of the items from the session. - * - * @return void - * @static - */ - public static function flush() - { - /** @var \Illuminate\Session\Store $instance */ - $instance->flush(); - } - /** - * Flush the session data and regenerate the ID. - * - * @return bool - * @static - */ - public static function invalidate() - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->invalidate(); - } - /** - * Generate a new session identifier. - * - * @param bool $destroy - * @return bool - * @static - */ - public static function regenerate($destroy = false) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->regenerate($destroy); - } - /** - * Generate a new session ID for the session. - * - * @param bool $destroy - * @return bool - * @static - */ - public static function migrate($destroy = false) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->migrate($destroy); - } - /** - * Determine if the session has been started. - * - * @return bool - * @static - */ - public static function isStarted() - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->isStarted(); - } - /** - * Get the name of the session. - * - * @return string - * @static - */ - public static function getName() - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->getName(); - } - /** - * Set the name of the session. - * - * @param string $name - * @return void - * @static - */ - public static function setName($name) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->setName($name); - } - /** - * Get the current session ID. - * - * @return string - * @static - */ - public static function getId() - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->getId(); - } - /** - * Set the session ID. - * - * @param string $id - * @return void - * @static - */ - public static function setId($id) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->setId($id); - } - /** - * Determine if this is a valid session ID. - * - * @param string $id - * @return bool - * @static - */ - public static function isValidId($id) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->isValidId($id); - } - /** - * Set the existence of the session on the handler if applicable. - * - * @param bool $value - * @return void - * @static - */ - public static function setExists($value) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->setExists($value); - } - /** - * Get the CSRF token value. - * - * @return string - * @static - */ - public static function token() - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->token(); - } - /** - * Regenerate the CSRF token value. - * - * @return void - * @static - */ - public static function regenerateToken() - { - /** @var \Illuminate\Session\Store $instance */ - $instance->regenerateToken(); - } - /** - * Get the previous URL from the session. - * - * @return string|null - * @static - */ - public static function previousUrl() - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->previousUrl(); - } - /** - * Set the "previous" URL in the session. - * - * @param string $url - * @return void - * @static - */ - public static function setPreviousUrl($url) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->setPreviousUrl($url); - } - /** - * Get the underlying session handler implementation. - * - * @return \SessionHandlerInterface - * @static - */ - public static function getHandler() - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->getHandler(); - } - /** - * Determine if the session handler needs a request. - * - * @return bool - * @static - */ - public static function handlerNeedsRequest() - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->handlerNeedsRequest(); - } - /** - * Set the request on the handler instance. - * - * @param \Illuminate\Http\Request $request - * @return void - * @static - */ - public static function setRequestOnHandler($request) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->setRequestOnHandler($request); - } - - } - /** - * - * - * @see \Illuminate\Filesystem\FilesystemManager - */ - class Storage { - /** - * Get a filesystem instance. - * - * @param string|null $name - * @return \Illuminate\Filesystem\FilesystemAdapter - * @static - */ - public static function drive($name = null) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->drive($name); - } - /** - * Get a filesystem instance. - * - * @param string|null $name - * @return \Illuminate\Filesystem\FilesystemAdapter - * @static - */ - public static function disk($name = null) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->disk($name); - } - /** - * Get a default cloud filesystem instance. - * - * @return \Illuminate\Filesystem\FilesystemAdapter - * @static - */ - public static function cloud() - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->cloud(); - } - /** - * Create an instance of the local driver. - * - * @param array $config - * @return \Illuminate\Filesystem\FilesystemAdapter - * @static - */ - public static function createLocalDriver($config) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->createLocalDriver($config); - } - /** - * Create an instance of the ftp driver. - * - * @param array $config - * @return \Illuminate\Filesystem\FilesystemAdapter - * @static - */ - public static function createFtpDriver($config) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->createFtpDriver($config); - } - /** - * Create an instance of the sftp driver. - * - * @param array $config - * @return \Illuminate\Filesystem\FilesystemAdapter - * @static - */ - public static function createSftpDriver($config) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->createSftpDriver($config); - } - /** - * Create an instance of the Amazon S3 driver. - * - * @param array $config - * @return \Illuminate\Contracts\Filesystem\Cloud - * @static - */ - public static function createS3Driver($config) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->createS3Driver($config); - } - /** - * Set the given disk instance. - * - * @param string $name - * @param mixed $disk - * @return \Illuminate\Filesystem\FilesystemManager - * @static - */ - public static function set($name, $disk) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->set($name, $disk); - } - /** - * Get the default driver name. - * - * @return string - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Get the default cloud driver name. - * - * @return string - * @static - */ - public static function getDefaultCloudDriver() - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->getDefaultCloudDriver(); - } - /** - * Unset the given disk instances. - * - * @param array|string $disk - * @return \Illuminate\Filesystem\FilesystemManager - * @static - */ - public static function forgetDisk($disk) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->forgetDisk($disk); - } - /** - * Register a custom driver creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return \Illuminate\Filesystem\FilesystemManager - * @static - */ - public static function extend($driver, $callback) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->extend($driver, $callback); - } - /** - * Assert that the given file exists. - * - * @param string|array $path - * @return \Illuminate\Filesystem\FilesystemAdapter - * @static - */ - public static function assertExists($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->assertExists($path); - } - /** - * Assert that the given file does not exist. - * - * @param string|array $path - * @return \Illuminate\Filesystem\FilesystemAdapter - * @static - */ - public static function assertMissing($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->assertMissing($path); - } - /** - * Determine if a file exists. - * - * @param string $path - * @return bool - * @static - */ - public static function exists($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->exists($path); - } - /** - * Determine if a file or directory is missing. - * - * @param string $path - * @return bool - * @static - */ - public static function missing($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->missing($path); - } - /** - * Get the full path for the file at the given "short" path. - * - * @param string $path - * @return string - * @static - */ - public static function path($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->path($path); - } - /** - * Get the contents of a file. - * - * @param string $path - * @return string - * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException - * @static - */ - public static function get($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->get($path); - } - /** - * Create a streamed response for a given file. - * - * @param string $path - * @param string|null $name - * @param array|null $headers - * @param string|null $disposition - * @return \Symfony\Component\HttpFoundation\StreamedResponse - * @static - */ - public static function response($path, $name = null, $headers = [], $disposition = 'inline') - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->response($path, $name, $headers, $disposition); - } - /** - * Create a streamed download response for a given file. - * - * @param string $path - * @param string|null $name - * @param array|null $headers - * @return \Symfony\Component\HttpFoundation\StreamedResponse - * @static - */ - public static function download($path, $name = null, $headers = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->download($path, $name, $headers); - } - /** - * Write the contents of a file. - * - * @param string $path - * @param string|resource $contents - * @param mixed $options - * @return bool - * @static - */ - public static function put($path, $contents, $options = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->put($path, $contents, $options); - } - /** - * Store the uploaded file on the disk. - * - * @param string $path - * @param \Illuminate\Http\File|\Illuminate\Http\UploadedFile|string $file - * @param mixed $options - * @return string|false - * @static - */ - public static function putFile($path, $file, $options = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->putFile($path, $file, $options); - } - /** - * Store the uploaded file on the disk with a given name. - * - * @param string $path - * @param \Illuminate\Http\File|\Illuminate\Http\UploadedFile|string $file - * @param string $name - * @param mixed $options - * @return string|false - * @static - */ - public static function putFileAs($path, $file, $name, $options = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->putFileAs($path, $file, $name, $options); - } - /** - * Get the visibility for the given path. - * - * @param string $path - * @return string - * @static - */ - public static function getVisibility($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->getVisibility($path); - } - /** - * Set the visibility for the given path. - * - * @param string $path - * @param string $visibility - * @return bool - * @static - */ - public static function setVisibility($path, $visibility) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->setVisibility($path, $visibility); - } - /** - * Prepend to a file. - * - * @param string $path - * @param string $data - * @param string $separator - * @return bool - * @static - */ - public static function prepend($path, $data, $separator = ' -') - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->prepend($path, $data, $separator); - } - /** - * Append to a file. - * - * @param string $path - * @param string $data - * @param string $separator - * @return bool - * @static - */ - public static function append($path, $data, $separator = ' -') - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->append($path, $data, $separator); - } - /** - * Delete the file at a given path. - * - * @param string|array $paths - * @return bool - * @static - */ - public static function delete($paths) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->delete($paths); - } - /** - * Copy a file to a new location. - * - * @param string $from - * @param string $to - * @return bool - * @static - */ - public static function copy($from, $to) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->copy($from, $to); - } - /** - * Move a file to a new location. - * - * @param string $from - * @param string $to - * @return bool - * @static - */ - public static function move($from, $to) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->move($from, $to); - } - /** - * Get the file size of a given file. - * - * @param string $path - * @return int - * @static - */ - public static function size($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->size($path); - } - /** - * Get the mime-type of a given file. - * - * @param string $path - * @return string|false - * @static - */ - public static function mimeType($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->mimeType($path); - } - /** - * Get the file's last modification time. - * - * @param string $path - * @return int - * @static - */ - public static function lastModified($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->lastModified($path); - } - /** - * Get the URL for the file at the given path. - * - * @param string $path - * @return string - * @throws \RuntimeException - * @static - */ - public static function url($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->url($path); - } - /** - * Get a resource to read the file. - * - * @param string $path - * @return resource|null The path resource or null on failure. - * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException - * @static - */ - public static function readStream($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->readStream($path); - } - /** - * Write a new file using a stream. - * - * @param string $path - * @param resource $resource - * @param array $options - * @return bool - * @throws \InvalidArgumentException If $resource is not a file handle. - * @throws \Illuminate\Contracts\Filesystem\FileExistsException - * @static - */ - public static function writeStream($path, $resource, $options = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->writeStream($path, $resource, $options); - } - /** - * Get a temporary URL for the file at the given path. - * - * @param string $path - * @param \DateTimeInterface $expiration - * @param array $options - * @return string - * @throws \RuntimeException - * @static - */ - public static function temporaryUrl($path, $expiration, $options = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->temporaryUrl($path, $expiration, $options); - } - /** - * Get a temporary URL for the file at the given path. - * - * @param \League\Flysystem\AwsS3v3\AwsS3Adapter $adapter - * @param string $path - * @param \DateTimeInterface $expiration - * @param array $options - * @return string - * @static - */ - public static function getAwsTemporaryUrl($adapter, $path, $expiration, $options) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->getAwsTemporaryUrl($adapter, $path, $expiration, $options); - } - /** - * Get an array of all files in a directory. - * - * @param string|null $directory - * @param bool $recursive - * @return array - * @static - */ - public static function files($directory = null, $recursive = false) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->files($directory, $recursive); - } - /** - * Get all of the files from the given directory (recursive). - * - * @param string|null $directory - * @return array - * @static - */ - public static function allFiles($directory = null) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->allFiles($directory); - } - /** - * Get all of the directories within a given directory. - * - * @param string|null $directory - * @param bool $recursive - * @return array - * @static - */ - public static function directories($directory = null, $recursive = false) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->directories($directory, $recursive); - } - /** - * Get all (recursive) of the directories within a given directory. - * - * @param string|null $directory - * @return array - * @static - */ - public static function allDirectories($directory = null) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->allDirectories($directory); - } - /** - * Create a directory. - * - * @param string $path - * @return bool - * @static - */ - public static function makeDirectory($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->makeDirectory($path); - } - /** - * Recursively delete a directory. - * - * @param string $directory - * @return bool - * @static - */ - public static function deleteDirectory($directory) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->deleteDirectory($directory); - } - /** - * Flush the Flysystem cache. - * - * @return void - * @static - */ - public static function flushCache() - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - $instance->flushCache(); - } - /** - * Get the Flysystem driver. - * - * @return \League\Flysystem\FilesystemInterface - * @static - */ - public static function getDriver() - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->getDriver(); - } - - } - /** - * - * - * @see \Illuminate\Routing\UrlGenerator - */ - class URL { - /** - * Get the full URL for the current request. - * - * @return string - * @static - */ - public static function full() - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->full(); - } - /** - * Get the current URL for the request. - * - * @return string - * @static - */ - public static function current() - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->current(); - } - /** - * Get the URL for the previous request. - * - * @param mixed $fallback - * @return string - * @static - */ - public static function previous($fallback = false) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->previous($fallback); - } - /** - * Generate an absolute URL to the given path. - * - * @param string $path - * @param mixed $extra - * @param bool|null $secure - * @return string - * @static - */ - public static function to($path, $extra = [], $secure = null) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->to($path, $extra, $secure); - } - /** - * Generate a secure, absolute URL to the given path. - * - * @param string $path - * @param array $parameters - * @return string - * @static - */ - public static function secure($path, $parameters = []) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->secure($path, $parameters); - } - /** - * Generate the URL to an application asset. - * - * @param string $path - * @param bool|null $secure - * @return string - * @static - */ - public static function asset($path, $secure = null) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->asset($path, $secure); - } - /** - * Generate the URL to a secure asset. - * - * @param string $path - * @return string - * @static - */ - public static function secureAsset($path) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->secureAsset($path); - } - /** - * Generate the URL to an asset from a custom root domain such as CDN, etc. - * - * @param string $root - * @param string $path - * @param bool|null $secure - * @return string - * @static - */ - public static function assetFrom($root, $path, $secure = null) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->assetFrom($root, $path, $secure); - } - /** - * Get the default scheme for a raw URL. - * - * @param bool|null $secure - * @return string - * @static - */ - public static function formatScheme($secure = null) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->formatScheme($secure); - } - /** - * Create a signed route URL for a named route. - * - * @param string $name - * @param mixed $parameters - * @param \DateTimeInterface|\DateInterval|int|null $expiration - * @param bool $absolute - * @return string - * @throws \InvalidArgumentException - * @static - */ - public static function signedRoute($name, $parameters = [], $expiration = null, $absolute = true) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->signedRoute($name, $parameters, $expiration, $absolute); - } - /** - * Create a temporary signed route URL for a named route. - * - * @param string $name - * @param \DateTimeInterface|\DateInterval|int $expiration - * @param array $parameters - * @param bool $absolute - * @return string - * @static - */ - public static function temporarySignedRoute($name, $expiration, $parameters = [], $absolute = true) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->temporarySignedRoute($name, $expiration, $parameters, $absolute); - } - /** - * Determine if the given request has a valid signature. - * - * @param \Illuminate\Http\Request $request - * @param bool $absolute - * @return bool - * @static - */ - public static function hasValidSignature($request, $absolute = true) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->hasValidSignature($request, $absolute); - } - /** - * Determine if the signature from the given request matches the URL. - * - * @param \Illuminate\Http\Request $request - * @param bool $absolute - * @return bool - * @static - */ - public static function hasCorrectSignature($request, $absolute = true) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->hasCorrectSignature($request, $absolute); - } - /** - * Determine if the expires timestamp from the given request is not from the past. - * - * @param \Illuminate\Http\Request $request - * @return bool - * @static - */ - public static function signatureHasNotExpired($request) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->signatureHasNotExpired($request); - } - /** - * Get the URL to a named route. - * - * @param string $name - * @param mixed $parameters - * @param bool $absolute - * @return string - * @throws \Symfony\Component\Routing\Exception\RouteNotFoundException - * @static - */ - public static function route($name, $parameters = [], $absolute = true) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->route($name, $parameters, $absolute); - } - /** - * Get the URL for a given route instance. - * - * @param \Illuminate\Routing\Route $route - * @param mixed $parameters - * @param bool $absolute - * @return string - * @throws \Illuminate\Routing\Exceptions\UrlGenerationException - * @static - */ - public static function toRoute($route, $parameters, $absolute) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->toRoute($route, $parameters, $absolute); - } - /** - * Get the URL to a controller action. - * - * @param string|array $action - * @param mixed $parameters - * @param bool $absolute - * @return string - * @throws \InvalidArgumentException - * @static - */ - public static function action($action, $parameters = [], $absolute = true) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->action($action, $parameters, $absolute); - } - /** - * Format the array of URL parameters. - * - * @param mixed|array $parameters - * @return array - * @static - */ - public static function formatParameters($parameters) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->formatParameters($parameters); - } - /** - * Get the base URL for the request. - * - * @param string $scheme - * @param string|null $root - * @return string - * @static - */ - public static function formatRoot($scheme, $root = null) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->formatRoot($scheme, $root); - } - /** - * Format the given URL segments into a single URL. - * - * @param string $root - * @param string $path - * @param \Illuminate\Routing\Route|null $route - * @return string - * @static - */ - public static function format($root, $path, $route = null) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->format($root, $path, $route); - } - /** - * Determine if the given path is a valid URL. - * - * @param string $path - * @return bool - * @static - */ - public static function isValidUrl($path) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->isValidUrl($path); - } - /** - * Set the default named parameters used by the URL generator. - * - * @param array $defaults - * @return void - * @static - */ - public static function defaults($defaults) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - $instance->defaults($defaults); - } - /** - * Get the default named parameters used by the URL generator. - * - * @return array - * @static - */ - public static function getDefaultParameters() - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->getDefaultParameters(); - } - /** - * Force the scheme for URLs. - * - * @param string $scheme - * @return void - * @static - */ - public static function forceScheme($scheme) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - $instance->forceScheme($scheme); - } - /** - * Set the forced root URL. - * - * @param string $root - * @return void - * @static - */ - public static function forceRootUrl($root) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - $instance->forceRootUrl($root); - } - /** - * Set a callback to be used to format the host of generated URLs. - * - * @param \Closure $callback - * @return \Illuminate\Routing\UrlGenerator - * @static - */ - public static function formatHostUsing($callback) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->formatHostUsing($callback); - } - /** - * Set a callback to be used to format the path of generated URLs. - * - * @param \Closure $callback - * @return \Illuminate\Routing\UrlGenerator - * @static - */ - public static function formatPathUsing($callback) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->formatPathUsing($callback); - } - /** - * Get the path formatter being used by the URL generator. - * - * @return \Closure - * @static - */ - public static function pathFormatter() - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->pathFormatter(); - } - /** - * Get the request instance. - * - * @return \Illuminate\Http\Request - * @static - */ - public static function getRequest() - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->getRequest(); - } - /** - * Set the current request instance. - * - * @param \Illuminate\Http\Request $request - * @return void - * @static - */ - public static function setRequest($request) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - $instance->setRequest($request); - } - /** - * Set the route collection. - * - * @param \Illuminate\Routing\RouteCollection $routes - * @return \Illuminate\Routing\UrlGenerator - * @static - */ - public static function setRoutes($routes) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->setRoutes($routes); - } - /** - * Set the session resolver for the generator. - * - * @param callable $sessionResolver - * @return \Illuminate\Routing\UrlGenerator - * @static - */ - public static function setSessionResolver($sessionResolver) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->setSessionResolver($sessionResolver); - } - /** - * Set the encryption key resolver. - * - * @param callable $keyResolver - * @return \Illuminate\Routing\UrlGenerator - * @static - */ - public static function setKeyResolver($keyResolver) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->setKeyResolver($keyResolver); - } - /** - * Set the root controller namespace. - * - * @param string $rootNamespace - * @return \Illuminate\Routing\UrlGenerator - * @static - */ - public static function setRootControllerNamespace($rootNamespace) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->setRootControllerNamespace($rootNamespace); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Routing\UrlGenerator::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Routing\UrlGenerator::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Routing\UrlGenerator::hasMacro($name); - } - - } - /** - * - * - * @see \Illuminate\Validation\Factory - */ - class Validator { - /** - * Create a new Validator instance. - * - * @param array $data - * @param array $rules - * @param array $messages - * @param array $customAttributes - * @return \Illuminate\Validation\Validator - * @static - */ - public static function make($data, $rules, $messages = [], $customAttributes = []) - { - /** @var \Illuminate\Validation\Factory $instance */ - return $instance->make($data, $rules, $messages, $customAttributes); - } - /** - * Validate the given data against the provided rules. - * - * @param array $data - * @param array $rules - * @param array $messages - * @param array $customAttributes - * @return array - * @throws \Illuminate\Validation\ValidationException - * @static - */ - public static function validate($data, $rules, $messages = [], $customAttributes = []) - { - /** @var \Illuminate\Validation\Factory $instance */ - return $instance->validate($data, $rules, $messages, $customAttributes); - } - /** - * Register a custom validator extension. - * - * @param string $rule - * @param \Closure|string $extension - * @param string|null $message - * @return void - * @static - */ - public static function extend($rule, $extension, $message = null) - { - /** @var \Illuminate\Validation\Factory $instance */ - $instance->extend($rule, $extension, $message); - } - /** - * Register a custom implicit validator extension. - * - * @param string $rule - * @param \Closure|string $extension - * @param string|null $message - * @return void - * @static - */ - public static function extendImplicit($rule, $extension, $message = null) - { - /** @var \Illuminate\Validation\Factory $instance */ - $instance->extendImplicit($rule, $extension, $message); - } - /** - * Register a custom dependent validator extension. - * - * @param string $rule - * @param \Closure|string $extension - * @param string|null $message - * @return void - * @static - */ - public static function extendDependent($rule, $extension, $message = null) - { - /** @var \Illuminate\Validation\Factory $instance */ - $instance->extendDependent($rule, $extension, $message); - } - /** - * Register a custom validator message replacer. - * - * @param string $rule - * @param \Closure|string $replacer - * @return void - * @static - */ - public static function replacer($rule, $replacer) - { - /** @var \Illuminate\Validation\Factory $instance */ - $instance->replacer($rule, $replacer); - } - /** - * Set the Validator instance resolver. - * - * @param \Closure $resolver - * @return void - * @static - */ - public static function resolver($resolver) - { - /** @var \Illuminate\Validation\Factory $instance */ - $instance->resolver($resolver); - } - /** - * Get the Translator implementation. - * - * @return \Illuminate\Contracts\Translation\Translator - * @static - */ - public static function getTranslator() - { - /** @var \Illuminate\Validation\Factory $instance */ - return $instance->getTranslator(); - } - /** - * Get the Presence Verifier implementation. - * - * @return \Illuminate\Validation\PresenceVerifierInterface - * @static - */ - public static function getPresenceVerifier() - { - /** @var \Illuminate\Validation\Factory $instance */ - return $instance->getPresenceVerifier(); - } - /** - * Set the Presence Verifier implementation. - * - * @param \Illuminate\Validation\PresenceVerifierInterface $presenceVerifier - * @return void - * @static - */ - public static function setPresenceVerifier($presenceVerifier) - { - /** @var \Illuminate\Validation\Factory $instance */ - $instance->setPresenceVerifier($presenceVerifier); - } - - } - /** - * - * - * @see \Illuminate\View\Factory - */ - class View { - /** - * Get the evaluated view contents for the given view. - * - * @param string $path - * @param \Illuminate\Contracts\Support\Arrayable|array $data - * @param array $mergeData - * @return \Illuminate\Contracts\View\View - * @static - */ - public static function file($path, $data = [], $mergeData = []) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->file($path, $data, $mergeData); - } - /** - * Get the evaluated view contents for the given view. - * - * @param string $view - * @param \Illuminate\Contracts\Support\Arrayable|array $data - * @param array $mergeData - * @return \Illuminate\Contracts\View\View - * @static - */ - public static function make($view, $data = [], $mergeData = []) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->make($view, $data, $mergeData); - } - /** - * Get the first view that actually exists from the given list. - * - * @param array $views - * @param \Illuminate\Contracts\Support\Arrayable|array $data - * @param array $mergeData - * @return \Illuminate\Contracts\View\View - * @throws \InvalidArgumentException - * @static - */ - public static function first($views, $data = [], $mergeData = []) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->first($views, $data, $mergeData); - } - /** - * Get the rendered content of the view based on a given condition. - * - * @param bool $condition - * @param string $view - * @param \Illuminate\Contracts\Support\Arrayable|array $data - * @param array $mergeData - * @return string - * @static - */ - public static function renderWhen($condition, $view, $data = [], $mergeData = []) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->renderWhen($condition, $view, $data, $mergeData); - } - /** - * Get the rendered contents of a partial from a loop. - * - * @param string $view - * @param array $data - * @param string $iterator - * @param string $empty - * @return string - * @static - */ - public static function renderEach($view, $data, $iterator, $empty = 'raw|') - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->renderEach($view, $data, $iterator, $empty); - } - /** - * Determine if a given view exists. - * - * @param string $view - * @return bool - * @static - */ - public static function exists($view) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->exists($view); - } - /** - * Get the appropriate view engine for the given path. - * - * @param string $path - * @return \Illuminate\Contracts\View\Engine - * @throws \InvalidArgumentException - * @static - */ - public static function getEngineFromPath($path) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getEngineFromPath($path); - } - /** - * Add a piece of shared data to the environment. - * - * @param array|string $key - * @param mixed|null $value - * @return mixed - * @static - */ - public static function share($key, $value = null) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->share($key, $value); - } - /** - * Increment the rendering counter. - * - * @return void - * @static - */ - public static function incrementRender() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->incrementRender(); - } - /** - * Decrement the rendering counter. - * - * @return void - * @static - */ - public static function decrementRender() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->decrementRender(); - } - /** - * Check if there are no active render operations. - * - * @return bool - * @static - */ - public static function doneRendering() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->doneRendering(); - } - /** - * Add a location to the array of view locations. - * - * @param string $location - * @return void - * @static - */ - public static function addLocation($location) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->addLocation($location); - } - /** - * Add a new namespace to the loader. - * - * @param string $namespace - * @param string|array $hints - * @return \Illuminate\View\Factory - * @static - */ - public static function addNamespace($namespace, $hints) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->addNamespace($namespace, $hints); - } - /** - * Prepend a new namespace to the loader. - * - * @param string $namespace - * @param string|array $hints - * @return \Illuminate\View\Factory - * @static - */ - public static function prependNamespace($namespace, $hints) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->prependNamespace($namespace, $hints); - } - /** - * Replace the namespace hints for the given namespace. - * - * @param string $namespace - * @param string|array $hints - * @return \Illuminate\View\Factory - * @static - */ - public static function replaceNamespace($namespace, $hints) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->replaceNamespace($namespace, $hints); - } - /** - * Register a valid view extension and its engine. - * - * @param string $extension - * @param string $engine - * @param \Closure|null $resolver - * @return void - * @static - */ - public static function addExtension($extension, $engine, $resolver = null) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->addExtension($extension, $engine, $resolver); - } - /** - * Flush all of the factory state like sections and stacks. - * - * @return void - * @static - */ - public static function flushState() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->flushState(); - } - /** - * Flush all of the section contents if done rendering. - * - * @return void - * @static - */ - public static function flushStateIfDoneRendering() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->flushStateIfDoneRendering(); - } - /** - * Get the extension to engine bindings. - * - * @return array - * @static - */ - public static function getExtensions() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getExtensions(); - } - /** - * Get the engine resolver instance. - * - * @return \Illuminate\View\Engines\EngineResolver - * @static - */ - public static function getEngineResolver() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getEngineResolver(); - } - /** - * Get the view finder instance. - * - * @return \Illuminate\View\ViewFinderInterface - * @static - */ - public static function getFinder() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getFinder(); - } - /** - * Set the view finder instance. - * - * @param \Illuminate\View\ViewFinderInterface $finder - * @return void - * @static - */ - public static function setFinder($finder) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->setFinder($finder); - } - /** - * Flush the cache of views located by the finder. - * - * @return void - * @static - */ - public static function flushFinderCache() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->flushFinderCache(); - } - /** - * Get the event dispatcher instance. - * - * @return \Illuminate\Contracts\Events\Dispatcher - * @static - */ - public static function getDispatcher() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getDispatcher(); - } - /** - * Set the event dispatcher instance. - * - * @param \Illuminate\Contracts\Events\Dispatcher $events - * @return void - * @static - */ - public static function setDispatcher($events) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->setDispatcher($events); - } - /** - * Get the IoC container instance. - * - * @return \Illuminate\Contracts\Container\Container - * @static - */ - public static function getContainer() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getContainer(); - } - /** - * Set the IoC container instance. - * - * @param \Illuminate\Contracts\Container\Container $container - * @return void - * @static - */ - public static function setContainer($container) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->setContainer($container); - } - /** - * Get an item from the shared data. - * - * @param string $key - * @param mixed $default - * @return mixed - * @static - */ - public static function shared($key, $default = null) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->shared($key, $default); - } - /** - * Get all of the shared data for the environment. - * - * @return array - * @static - */ - public static function getShared() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getShared(); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\View\Factory::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\View\Factory::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\View\Factory::hasMacro($name); - } - /** - * Start a component rendering process. - * - * @param string $name - * @param array $data - * @return void - * @static - */ - public static function startComponent($name, $data = []) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->startComponent($name, $data); - } - /** - * Get the first view that actually exists from the given list, and start a component. - * - * @param array $names - * @param array $data - * @return void - * @static - */ - public static function startComponentFirst($names, $data = []) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->startComponentFirst($names, $data); - } - /** - * Render the current component. - * - * @return string - * @static - */ - public static function renderComponent() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->renderComponent(); - } - /** - * Start the slot rendering process. - * - * @param string $name - * @param string|null $content - * @return void - * @static - */ - public static function slot($name, $content = null) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->slot($name, $content); - } - /** - * Save the slot content for rendering. - * - * @return void - * @static - */ - public static function endSlot() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->endSlot(); - } - /** - * Register a view creator event. - * - * @param array|string $views - * @param \Closure|string $callback - * @return array - * @static - */ - public static function creator($views, $callback) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->creator($views, $callback); - } - /** - * Register multiple view composers via an array. - * - * @param array $composers - * @return array - * @static - */ - public static function composers($composers) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->composers($composers); - } - /** - * Register a view composer event. - * - * @param array|string $views - * @param \Closure|string $callback - * @return array - * @static - */ - public static function composer($views, $callback) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->composer($views, $callback); - } - /** - * Call the composer for a given view. - * - * @param \Illuminate\Contracts\View\View $view - * @return void - * @static - */ - public static function callComposer($view) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->callComposer($view); - } - /** - * Call the creator for a given view. - * - * @param \Illuminate\Contracts\View\View $view - * @return void - * @static - */ - public static function callCreator($view) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->callCreator($view); - } - /** - * Start injecting content into a section. - * - * @param string $section - * @param string|null $content - * @return void - * @static - */ - public static function startSection($section, $content = null) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->startSection($section, $content); - } - /** - * Inject inline content into a section. - * - * @param string $section - * @param string $content - * @return void - * @static - */ - public static function inject($section, $content) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->inject($section, $content); - } - /** - * Stop injecting content into a section and return its contents. - * - * @return string - * @static - */ - public static function yieldSection() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->yieldSection(); - } - /** - * Stop injecting content into a section. - * - * @param bool $overwrite - * @return string - * @throws \InvalidArgumentException - * @static - */ - public static function stopSection($overwrite = false) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->stopSection($overwrite); - } - /** - * Stop injecting content into a section and append it. - * - * @return string - * @throws \InvalidArgumentException - * @static - */ - public static function appendSection() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->appendSection(); - } - /** - * Get the string contents of a section. - * - * @param string $section - * @param string $default - * @return string - * @static - */ - public static function yieldContent($section, $default = '') - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->yieldContent($section, $default); - } - /** - * Get the parent placeholder for the current request. - * - * @param string $section - * @return string - * @static - */ - public static function parentPlaceholder($section = '') - { - return \Illuminate\View\Factory::parentPlaceholder($section); - } - /** - * Check if section exists. - * - * @param string $name - * @return bool - * @static - */ - public static function hasSection($name) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->hasSection($name); - } - /** - * Get the contents of a section. - * - * @param string $name - * @param string|null $default - * @return mixed - * @static - */ - public static function getSection($name, $default = null) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getSection($name, $default); - } - /** - * Get the entire array of sections. - * - * @return array - * @static - */ - public static function getSections() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getSections(); - } - /** - * Flush all of the sections. - * - * @return void - * @static - */ - public static function flushSections() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->flushSections(); - } - /** - * Add new loop to the stack. - * - * @param \Countable|array $data - * @return void - * @static - */ - public static function addLoop($data) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->addLoop($data); - } - /** - * Increment the top loop's indices. - * - * @return void - * @static - */ - public static function incrementLoopIndices() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->incrementLoopIndices(); - } - /** - * Pop a loop from the top of the loop stack. - * - * @return void - * @static - */ - public static function popLoop() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->popLoop(); - } - /** - * Get an instance of the last loop in the stack. - * - * @return \stdClass|null - * @static - */ - public static function getLastLoop() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getLastLoop(); - } - /** - * Get the entire loop stack. - * - * @return array - * @static - */ - public static function getLoopStack() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getLoopStack(); - } - /** - * Start injecting content into a push section. - * - * @param string $section - * @param string $content - * @return void - * @static - */ - public static function startPush($section, $content = '') - { - /** @var \Illuminate\View\Factory $instance */ - $instance->startPush($section, $content); - } - /** - * Stop injecting content into a push section. - * - * @return string - * @throws \InvalidArgumentException - * @static - */ - public static function stopPush() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->stopPush(); - } - /** - * Start prepending content into a push section. - * - * @param string $section - * @param string $content - * @return void - * @static - */ - public static function startPrepend($section, $content = '') - { - /** @var \Illuminate\View\Factory $instance */ - $instance->startPrepend($section, $content); - } - /** - * Stop prepending content into a push section. - * - * @return string - * @throws \InvalidArgumentException - * @static - */ - public static function stopPrepend() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->stopPrepend(); - } - /** - * Get the string contents of a push section. - * - * @param string $section - * @param string $default - * @return string - * @static - */ - public static function yieldPushContent($section, $default = '') - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->yieldPushContent($section, $default); - } - /** - * Flush all of the stacks. - * - * @return void - * @static - */ - public static function flushStacks() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->flushStacks(); - } - /** - * Start a translation block. - * - * @param array $replacements - * @return void - * @static - */ - public static function startTranslation($replacements = []) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->startTranslation($replacements); - } - /** - * Render the current translation. - * - * @return string - * @static - */ - public static function renderTranslation() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->renderTranslation(); - } - - } - -} - - namespace Illuminate\Support { - /** - * - * - */ - class Arr { - - } - /** - * - * - */ - class Str { - - } - -} - - namespace Facade\Ignition\Facades { - /** - * Class Flare. - * - * @see \Facade\FlareClient\Flare - */ - class Flare { - /** - * - * - * @static - */ - public static function register($apiKey, $apiSecret = null, $contextDetector = null, $container = null) - { - return \Facade\FlareClient\Flare::register($apiKey, $apiSecret, $contextDetector, $container); - } - /** - * - * - * @static - */ - public static function determineVersionUsing($determineVersionCallable) - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->determineVersionUsing($determineVersionCallable); - } - /** - * - * - * @static - */ - public static function reportErrorLevels($reportErrorLevels) - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->reportErrorLevels($reportErrorLevels); - } - /** - * - * - * @static - */ - public static function filterExceptionsUsing($filterExceptionsCallable) - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->filterExceptionsUsing($filterExceptionsCallable); - } - /** - * - * - * @return null|string - * @static - */ - public static function version() - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->version(); - } - /** - * - * - * @static - */ - public static function getMiddleware() - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->getMiddleware(); - } - /** - * - * - * @static - */ - public static function registerFlareHandlers() - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->registerFlareHandlers(); - } - /** - * - * - * @static - */ - public static function registerExceptionHandler() - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->registerExceptionHandler(); - } - /** - * - * - * @static - */ - public static function registerErrorHandler() - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->registerErrorHandler(); - } - /** - * - * - * @static - */ - public static function registerMiddleware($callable) - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->registerMiddleware($callable); - } - /** - * - * - * @static - */ - public static function getMiddlewares() - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->getMiddlewares(); - } - /** - * - * - * @static - */ - public static function glow($name, $messageLevel = 'info', $metaData = []) - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->glow($name, $messageLevel, $metaData); - } - /** - * - * - * @static - */ - public static function handleException($throwable) - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->handleException($throwable); - } - /** - * - * - * @static - */ - public static function handleError($code, $message, $file = '', $line = 0) - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->handleError($code, $message, $file, $line); - } - /** - * - * - * @static - */ - public static function applicationPath($applicationPath) - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->applicationPath($applicationPath); - } - /** - * - * - * @static - */ - public static function report($throwable, $callback = null) - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->report($throwable, $callback); - } - /** - * - * - * @static - */ - public static function reportMessage($message, $logLevel, $callback = null) - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->reportMessage($message, $logLevel, $callback); - } - /** - * - * - * @static - */ - public static function sendTestReport($throwable) - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->sendTestReport($throwable); - } - /** - * - * - * @static - */ - public static function reset() - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->reset(); - } - /** - * - * - * @static - */ - public static function anonymizeIp() - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->anonymizeIp(); - } - /** - * - * - * @static - */ - public static function censorRequestBodyFields($fieldNames) - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->censorRequestBodyFields($fieldNames); - } - /** - * - * - * @static - */ - public static function createReport($throwable) - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->createReport($throwable); - } - /** - * - * - * @static - */ - public static function createReportFromMessage($message, $logLevel) - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->createReportFromMessage($message, $logLevel); - } - /** - * - * - * @static - */ - public static function stage($stage) - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->stage($stage); - } - /** - * - * - * @static - */ - public static function messageLevel($messageLevel) - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->messageLevel($messageLevel); - } - /** - * - * - * @static - */ - public static function getGroup($groupName = 'context', $default = []) - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->getGroup($groupName, $default); - } - /** - * - * - * @static - */ - public static function context($key, $value) - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->context($key, $value); - } - /** - * - * - * @static - */ - public static function group($groupName, $properties) - { - /** @var \Facade\FlareClient\Flare $instance */ - return $instance->group($groupName, $properties); - } - - } - -} - - namespace Intervention\Image\Facades { - /** - * - * - */ - class Image { - /** - * Overrides configuration settings - * - * @param array $config - * @return self - * @static - */ - public static function configure($config = []) - { - /** @var \Intervention\Image\ImageManager $instance */ - return $instance->configure($config); - } - /** - * Initiates an Image instance from different input types - * - * @param mixed $data - * @return \Intervention\Image\Image - * @static - */ - public static function make($data) - { - /** @var \Intervention\Image\ImageManager $instance */ - return $instance->make($data); - } - /** - * Creates an empty image canvas - * - * @param int $width - * @param int $height - * @param mixed $background - * @return \Intervention\Image\Image - * @static - */ - public static function canvas($width, $height, $background = null) - { - /** @var \Intervention\Image\ImageManager $instance */ - return $instance->canvas($width, $height, $background); - } - /** - * Create new cached image and run callback - * (requires additional package intervention/imagecache) - * - * @param \Closure $callback - * @param int $lifetime - * @param boolean $returnObj - * @return \Image - * @static - */ - public static function cache($callback, $lifetime = null, $returnObj = false) - { - /** @var \Intervention\Image\ImageManager $instance */ - return $instance->cache($callback, $lifetime, $returnObj); - } - - } - -} - - namespace Laravel\Socialite\Facades { - /** - * - * - * @see \Laravel\Socialite\SocialiteManager - */ - class Socialite { - /** - * Get a driver instance. - * - * @param string $driver - * @return mixed - * @static - */ - public static function with($driver) - { - /** @var \Laravel\Socialite\SocialiteManager $instance */ - return $instance->with($driver); - } - /** - * Build an OAuth 2 provider instance. - * - * @param string $provider - * @param array $config - * @return \Laravel\Socialite\Two\AbstractProvider - * @static - */ - public static function buildProvider($provider, $config) - { - /** @var \Laravel\Socialite\SocialiteManager $instance */ - return $instance->buildProvider($provider, $config); - } - /** - * Format the server configuration. - * - * @param array $config - * @return array - * @static - */ - public static function formatConfig($config) - { - /** @var \Laravel\Socialite\SocialiteManager $instance */ - return $instance->formatConfig($config); - } - /** - * Forget all of the resolved driver instances. - * - * @return \Laravel\Socialite\SocialiteManager - * @static - */ - public static function forgetDrivers() - { - /** @var \Laravel\Socialite\SocialiteManager $instance */ - return $instance->forgetDrivers(); - } - /** - * Set the container instance used by the manager. - * - * @param \Illuminate\Contracts\Container\Container $container - * @return \Laravel\Socialite\SocialiteManager - * @static - */ - public static function setContainer($container) - { - /** @var \Laravel\Socialite\SocialiteManager $instance */ - return $instance->setContainer($container); - } - /** - * Get the default driver name. - * - * @return string - * @throws \InvalidArgumentException - * @static - */ - public static function getDefaultDriver() - { - /** @var \Laravel\Socialite\SocialiteManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Get a driver instance. - * - * @param string $driver - * @return mixed - * @throws \InvalidArgumentException - * @static - */ - public static function driver($driver = null) - { //Method inherited from \Illuminate\Support\Manager - /** @var \Laravel\Socialite\SocialiteManager $instance */ - return $instance->driver($driver); - } - /** - * Register a custom driver creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return \Laravel\Socialite\SocialiteManager - * @static - */ - public static function extend($driver, $callback) - { //Method inherited from \Illuminate\Support\Manager - /** @var \Laravel\Socialite\SocialiteManager $instance */ - return $instance->extend($driver, $callback); - } - /** - * Get all of the created "drivers". - * - * @return array - * @static - */ - public static function getDrivers() - { //Method inherited from \Illuminate\Support\Manager - /** @var \Laravel\Socialite\SocialiteManager $instance */ - return $instance->getDrivers(); - } - - } - -} - - namespace Mews\Captcha\Facades { - /** - * - * - * @see \Mews\Captcha\Captcha - */ - class Captcha { - /** - * Create captcha image - * - * @param string $config - * @param bool $api - * @return array|mixed - * @throws Exception - * @static - */ - public static function create($config = 'default', $api = false) - { - /** @var \Mews\Captcha\Captcha $instance */ - return $instance->create($config, $api); - } - /** - * Captcha check - * - * @param string $value - * @return bool - * @static - */ - public static function check($value) - { - /** @var \Mews\Captcha\Captcha $instance */ - return $instance->check($value); - } - /** - * Captcha check - * - * @param string $value - * @param string $key - * @return bool - * @static - */ - public static function check_api($value, $key) - { - /** @var \Mews\Captcha\Captcha $instance */ - return $instance->check_api($value, $key); - } - /** - * Generate captcha image source - * - * @param string $config - * @return string - * @static - */ - public static function src($config = 'default') - { - /** @var \Mews\Captcha\Captcha $instance */ - return $instance->src($config); - } - /** - * Generate captcha image html tag - * - * @param string $config - * @param array $attrs $attrs -> HTML attributes supplied to the image tag where key is the attribute and the value is the attribute value - * @return string - * @static - */ - public static function img($config = 'default', $attrs = []) - { - /** @var \Mews\Captcha\Captcha $instance */ - return $instance->img($config, $attrs); - } - - } - -} - - namespace Overtrue\LaravelWeChat { - /** - * Class Facade. - * - * @author overtrue - */ - class Facade { - /** - * - * - * @return string - * @static - */ - public static function getId() - { //Method inherited from \EasyWeChat\Kernel\ServiceContainer - /** @var \EasyWeChat\OfficialAccount\Application $instance */ - return $instance->getId(); - } - /** - * - * - * @return array - * @static - */ - public static function getConfig() - { //Method inherited from \EasyWeChat\Kernel\ServiceContainer - /** @var \EasyWeChat\OfficialAccount\Application $instance */ - return $instance->getConfig(); - } - /** - * Return all providers. - * - * @return array - * @static - */ - public static function getProviders() - { //Method inherited from \EasyWeChat\Kernel\ServiceContainer - /** @var \EasyWeChat\OfficialAccount\Application $instance */ - return $instance->getProviders(); - } - /** - * - * - * @param string $id - * @param mixed $value - * @static - */ - public static function rebind($id, $value) - { //Method inherited from \EasyWeChat\Kernel\ServiceContainer - /** @var \EasyWeChat\OfficialAccount\Application $instance */ - return $instance->rebind($id, $value); - } - /** - * - * - * @static - */ - public static function registerProviders($providers) - { //Method inherited from \EasyWeChat\Kernel\ServiceContainer - /** @var \EasyWeChat\OfficialAccount\Application $instance */ - return $instance->registerProviders($providers); - } - /** - * Sets a parameter or an object. - * - * Objects must be defined as Closures. - * - * Allowing any PHP callable leads to difficult to debug problems - * as function names (strings) are callable (creating a function with - * the same name as an existing parameter would break your container). - * - * @param string $id The unique identifier for the parameter or object - * @param mixed $value The value of the parameter or a closure to define an object - * @return void - * @throws FrozenServiceException Prevent override of a frozen service - * @static - */ - public static function offsetSet($id, $value) - { //Method inherited from \Pimple\Container - /** @var \EasyWeChat\OfficialAccount\Application $instance */ - $instance->offsetSet($id, $value); - } - /** - * Gets a parameter or an object. - * - * @param string $id The unique identifier for the parameter or object - * @return mixed The value of the parameter or an object - * @throws UnknownIdentifierException If the identifier is not defined - * @static - */ - public static function offsetGet($id) - { //Method inherited from \Pimple\Container - /** @var \EasyWeChat\OfficialAccount\Application $instance */ - return $instance->offsetGet($id); - } - /** - * Checks if a parameter or an object is set. - * - * @param string $id The unique identifier for the parameter or object - * @return bool - * @static - */ - public static function offsetExists($id) - { //Method inherited from \Pimple\Container - /** @var \EasyWeChat\OfficialAccount\Application $instance */ - return $instance->offsetExists($id); - } - /** - * Unsets a parameter or an object. - * - * @param string $id The unique identifier for the parameter or object - * @return void - * @static - */ - public static function offsetUnset($id) - { //Method inherited from \Pimple\Container - /** @var \EasyWeChat\OfficialAccount\Application $instance */ - $instance->offsetUnset($id); - } - /** - * Marks a callable as being a factory service. - * - * @param callable $callable A service definition to be used as a factory - * @return callable The passed callable - * @throws ExpectedInvokableException Service definition has to be a closure or an invokable object - * @static - */ - public static function factory($callable) - { //Method inherited from \Pimple\Container - /** @var \EasyWeChat\OfficialAccount\Application $instance */ - return $instance->factory($callable); - } - /** - * Protects a callable from being interpreted as a service. - * - * This is useful when you want to store a callable as a parameter. - * - * @param callable $callable A callable to protect from being evaluated - * @return callable The passed callable - * @throws ExpectedInvokableException Service definition has to be a closure or an invokable object - * @static - */ - public static function protect($callable) - { //Method inherited from \Pimple\Container - /** @var \EasyWeChat\OfficialAccount\Application $instance */ - return $instance->protect($callable); - } - /** - * Gets a parameter or the closure defining an object. - * - * @param string $id The unique identifier for the parameter or object - * @return mixed The value of the parameter or the closure defining an object - * @throws UnknownIdentifierException If the identifier is not defined - * @static - */ - public static function raw($id) - { //Method inherited from \Pimple\Container - /** @var \EasyWeChat\OfficialAccount\Application $instance */ - return $instance->raw($id); - } - /** - * Extends an object definition. - * - * Useful when you want to extend an existing object definition, - * without necessarily loading that object. - * - * @param string $id The unique identifier for the object - * @param callable $callable A service definition to extend the original - * @return callable The wrapped callable - * @throws UnknownIdentifierException If the identifier is not defined - * @throws FrozenServiceException If the service is frozen - * @throws InvalidServiceIdentifierException If the identifier belongs to a parameter - * @throws ExpectedInvokableException If the extension callable is not a closure or an invokable object - * @static - */ - public static function extend($id, $callable) - { //Method inherited from \Pimple\Container - /** @var \EasyWeChat\OfficialAccount\Application $instance */ - return $instance->extend($id, $callable); - } - /** - * Returns all defined value names. - * - * @return array An array of value names - * @static - */ - public static function keys() - { //Method inherited from \Pimple\Container - /** @var \EasyWeChat\OfficialAccount\Application $instance */ - return $instance->keys(); - } - /** - * Registers a service provider. - * - * @param array $values An array of values that customizes the provider - * @return static - * @static - */ - public static function register($provider, $values = []) - { //Method inherited from \Pimple\Container - /** @var \EasyWeChat\OfficialAccount\Application $instance */ - return $instance->register($provider, $values); - } - /** - * - * - * @return bool - * @static - */ - public static function shouldDelegate($id) - { //Method inherited from \EasyWeChat\Kernel\ServiceContainer - /** @var \EasyWeChat\OfficialAccount\Application $instance */ - return $instance->shouldDelegate($id); - } - /** - * - * - * @return \EasyWeChat\OfficialAccount\Application - * @static - */ - public static function shouldntDelegate() - { //Method inherited from \EasyWeChat\Kernel\ServiceContainer - /** @var \EasyWeChat\OfficialAccount\Application $instance */ - return $instance->shouldntDelegate(); - } - /** - * - * - * @param string $id - * @return \EasyWeChatComposer\Delegation - * @static - */ - public static function delegateTo($id) - { //Method inherited from \EasyWeChat\Kernel\ServiceContainer - /** @var \EasyWeChat\OfficialAccount\Application $instance */ - return $instance->delegateTo($id); - } - - } - -} - - -namespace { - class App extends \Illuminate\Support\Facades\App {} - class Arr extends \Illuminate\Support\Arr {} - class Artisan extends \Illuminate\Support\Facades\Artisan {} - class Auth extends \Illuminate\Support\Facades\Auth {} - class Blade extends \Illuminate\Support\Facades\Blade {} - class Broadcast extends \Illuminate\Support\Facades\Broadcast {} - class Bus extends \Illuminate\Support\Facades\Bus {} - class Cache extends \Illuminate\Support\Facades\Cache {} - class Config extends \Illuminate\Support\Facades\Config {} - class Cookie extends \Illuminate\Support\Facades\Cookie {} - class Crypt extends \Illuminate\Support\Facades\Crypt {} - class DB extends \Illuminate\Support\Facades\DB {} - class Eloquent extends \Illuminate\Database\Eloquent\Model { - /** - * Create and return an un-saved model instance. - * - * @param array $attributes - * @return \Illuminate\Database\Eloquent\Model|static - * @static - */ - public static function make($attributes = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->make($attributes); - } - - /** - * Register a new global scope. - * - * @param string $identifier - * @param \Illuminate\Database\Eloquent\Scope|\Closure $scope - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function withGlobalScope($identifier, $scope) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->withGlobalScope($identifier, $scope); - } - - /** - * Remove a registered global scope. - * - * @param \Illuminate\Database\Eloquent\Scope|string $scope - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function withoutGlobalScope($scope) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->withoutGlobalScope($scope); - } - - /** - * Remove all or passed registered global scopes. - * - * @param array|null $scopes - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function withoutGlobalScopes($scopes = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->withoutGlobalScopes($scopes); - } - - /** - * Get an array of global scopes that were removed from the query. - * - * @return array - * @static - */ - public static function removedScopes() - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->removedScopes(); - } - - /** - * Add a where clause on the primary key to the query. - * - * @param mixed $id - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function whereKey($id) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->whereKey($id); - } - - /** - * Add a where clause on the primary key to the query. - * - * @param mixed $id - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function whereKeyNot($id) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->whereKeyNot($id); - } - - /** - * Add a basic where clause to the query. - * - * @param \Closure|string|array|\Illuminate\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @param string $boolean - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function where($column, $operator = null, $value = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->where($column, $operator, $value, $boolean); - } - - /** - * Add a basic where clause to the query, and return the first result. - * - * @param \Closure|string|array|\Illuminate\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @param string $boolean - * @return \Illuminate\Database\Eloquent\Model|static - * @static - */ - public static function firstWhere($column, $operator = null, $value = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->firstWhere($column, $operator, $value, $boolean); - } - - /** - * Add an "or where" clause to the query. - * - * @param \Closure|array|string|\Illuminate\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orWhere($column, $operator = null, $value = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orWhere($column, $operator, $value); - } - - /** - * Add an "order by" clause for a timestamp to the query. - * - * @param string|\Illuminate\Database\Query\Expression $column - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function latest($column = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->latest($column); - } - - /** - * Add an "order by" clause for a timestamp to the query. - * - * @param string|\Illuminate\Database\Query\Expression $column - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function oldest($column = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->oldest($column); - } - - /** - * Create a collection of models from plain arrays. - * - * @param array $items - * @return \Illuminate\Database\Eloquent\Collection - * @static - */ - public static function hydrate($items) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->hydrate($items); - } - - /** - * Create a collection of models from a raw query. - * - * @param string $query - * @param array $bindings - * @return \Illuminate\Database\Eloquent\Collection - * @static - */ - public static function fromQuery($query, $bindings = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->fromQuery($query, $bindings); - } - - /** - * Find a model by its primary key. - * - * @param mixed $id - * @param array $columns - * @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection|static[]|static|null - * @static - */ - public static function find($id, $columns = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->find($id, $columns); - } - - /** - * Find multiple models by their primary keys. - * - * @param \Illuminate\Contracts\Support\Arrayable|array $ids - * @param array $columns - * @return \Illuminate\Database\Eloquent\Collection - * @static - */ - public static function findMany($ids, $columns = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->findMany($ids, $columns); - } - - /** - * Find a model by its primary key or throw an exception. - * - * @param mixed $id - * @param array $columns - * @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection|static|static[] - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - * @static - */ - public static function findOrFail($id, $columns = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->findOrFail($id, $columns); - } - - /** - * Find a model by its primary key or return fresh model instance. - * - * @param mixed $id - * @param array $columns - * @return \Illuminate\Database\Eloquent\Model|static - * @static - */ - public static function findOrNew($id, $columns = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->findOrNew($id, $columns); - } - - /** - * Get the first record matching the attributes or instantiate it. - * - * @param array $attributes - * @param array $values - * @return \Illuminate\Database\Eloquent\Model|static - * @static - */ - public static function firstOrNew($attributes, $values = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->firstOrNew($attributes, $values); - } - - /** - * Get the first record matching the attributes or create it. - * - * @param array $attributes - * @param array $values - * @return \Illuminate\Database\Eloquent\Model|static - * @static - */ - public static function firstOrCreate($attributes, $values = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->firstOrCreate($attributes, $values); - } - - /** - * Create or update a record matching the attributes, and fill it with values. - * - * @param array $attributes - * @param array $values - * @return \Illuminate\Database\Eloquent\Model|static - * @static - */ - public static function updateOrCreate($attributes, $values = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->updateOrCreate($attributes, $values); - } - - /** - * Execute the query and get the first result or throw an exception. - * - * @param array $columns - * @return \Illuminate\Database\Eloquent\Model|static - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - * @static - */ - public static function firstOrFail($columns = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->firstOrFail($columns); - } - - /** - * Execute the query and get the first result or call a callback. - * - * @param \Closure|array $columns - * @param \Closure|null $callback - * @return \Illuminate\Database\Eloquent\Model|static|mixed - * @static - */ - public static function firstOr($columns = [], $callback = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->firstOr($columns, $callback); - } - - /** - * Get a single column's value from the first result of a query. - * - * @param string|\Illuminate\Database\Query\Expression $column - * @return mixed - * @static - */ - public static function value($column) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->value($column); - } - - /** - * Execute the query as a "select" statement. - * - * @param array|string $columns - * @return \Illuminate\Database\Eloquent\Collection|static[] - * @static - */ - public static function get($columns = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->get($columns); - } - - /** - * Get the hydrated models without eager loading. - * - * @param array|string $columns - * @return \Illuminate\Database\Eloquent\Model[]|static[] - * @static - */ - public static function getModels($columns = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->getModels($columns); - } - - /** - * Eager load the relationships for the models. - * - * @param array $models - * @return array - * @static - */ - public static function eagerLoadRelations($models) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->eagerLoadRelations($models); - } - - /** - * Get a lazy collection for the given query. - * - * @return \Illuminate\Support\LazyCollection - * @static - */ - public static function cursor() - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->cursor(); - } - - /** - * Get an array with the values of a given column. - * - * @param string|\Illuminate\Database\Query\Expression $column - * @param string|null $key - * @return \Illuminate\Support\Collection - * @static - */ - public static function pluck($column, $key = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->pluck($column, $key); - } - - /** - * Paginate the given query. - * - * @param int|null $perPage - * @param array $columns - * @param string $pageName - * @param int|null $page - * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator - * @throws \InvalidArgumentException - * @static - */ - public static function paginate($perPage = null, $columns = [], $pageName = 'page', $page = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->paginate($perPage, $columns, $pageName, $page); - } - - /** - * Paginate the given query into a simple paginator. - * - * @param int|null $perPage - * @param array $columns - * @param string $pageName - * @param int|null $page - * @return \Illuminate\Contracts\Pagination\Paginator - * @static - */ - public static function simplePaginate($perPage = null, $columns = [], $pageName = 'page', $page = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->simplePaginate($perPage, $columns, $pageName, $page); - } - - /** - * Save a new model and return the instance. - * - * @param array $attributes - * @return \Illuminate\Database\Eloquent\Model|$this - * @static - */ - public static function create($attributes = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->create($attributes); - } - - /** - * Save a new model and return the instance. Allow mass-assignment. - * - * @param array $attributes - * @return \Illuminate\Database\Eloquent\Model|$this - * @static - */ - public static function forceCreate($attributes) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->forceCreate($attributes); - } - - /** - * Register a replacement for the default delete function. - * - * @param \Closure $callback - * @return void - * @static - */ - public static function onDelete($callback) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - $instance->onDelete($callback); - } - - /** - * Call the given local model scopes. - * - * @param array|string $scopes - * @return static|mixed - * @static - */ - public static function scopes($scopes) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->scopes($scopes); - } - - /** - * Apply the scopes to the Eloquent builder instance and return it. - * - * @return static - * @static - */ - public static function applyScopes() - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->applyScopes(); - } - - /** - * Prevent the specified relations from being eager loaded. - * - * @param mixed $relations - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function without($relations) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->without($relations); - } - - /** - * Create a new instance of the model being queried. - * - * @param array $attributes - * @return \Illuminate\Database\Eloquent\Model|static - * @static - */ - public static function newModelInstance($attributes = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->newModelInstance($attributes); - } - - /** - * Get the underlying query builder instance. - * - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function getQuery() - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->getQuery(); - } - - /** - * Set the underlying query builder instance. - * - * @param \Illuminate\Database\Query\Builder $query - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function setQuery($query) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->setQuery($query); - } - - /** - * Get a base query builder instance. - * - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function toBase() - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->toBase(); - } - - /** - * Get the relationships being eagerly loaded. - * - * @return array - * @static - */ - public static function getEagerLoads() - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->getEagerLoads(); - } - - /** - * Set the relationships being eagerly loaded. - * - * @param array $eagerLoad - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function setEagerLoads($eagerLoad) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->setEagerLoads($eagerLoad); - } - - /** - * Get the model instance being queried. - * - * @return \Illuminate\Database\Eloquent\Model|static - * @static - */ - public static function getModel() - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->getModel(); - } - - /** - * Set a model instance for the model being queried. - * - * @param \Illuminate\Database\Eloquent\Model $model - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function setModel($model) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->setModel($model); - } - - /** - * Get the given macro by name. - * - * @param string $name - * @return \Closure - * @static - */ - public static function getMacro($name) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->getMacro($name); - } - - /** - * Checks if a macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->hasMacro($name); - } - - /** - * Get the given global macro by name. - * - * @param string $name - * @return \Closure - * @static - */ - public static function getGlobalMacro($name) - { - return \Illuminate\Database\Eloquent\Builder::getGlobalMacro($name); - } - - /** - * Checks if a global macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasGlobalMacro($name) - { - return \Illuminate\Database\Eloquent\Builder::hasGlobalMacro($name); - } - - /** - * Chunk the results of the query. - * - * @param int $count - * @param callable $callback - * @return bool - * @static - */ - public static function chunk($count, $callback) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->chunk($count, $callback); - } - - /** - * Execute a callback over each item while chunking. - * - * @param callable $callback - * @param int $count - * @return bool - * @static - */ - public static function each($callback, $count = 1000) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->each($callback, $count); - } - - /** - * Chunk the results of a query by comparing IDs. - * - * @param int $count - * @param callable $callback - * @param string|null $column - * @param string|null $alias - * @return bool - * @static - */ - public static function chunkById($count, $callback, $column = null, $alias = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->chunkById($count, $callback, $column, $alias); - } - - /** - * Execute a callback over each item while chunking by id. - * - * @param callable $callback - * @param int $count - * @param string|null $column - * @param string|null $alias - * @return bool - * @static - */ - public static function eachById($callback, $count = 1000, $column = null, $alias = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->eachById($callback, $count, $column, $alias); - } - - /** - * Execute the query and get the first result. - * - * @param array|string $columns - * @return \Illuminate\Database\Eloquent\Model|object|static|null - * @static - */ - public static function first($columns = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->first($columns); - } - - /** - * Apply the callback's query changes if the given "value" is true. - * - * @param mixed $value - * @param callable $callback - * @param callable|null $default - * @return mixed|$this - * @static - */ - public static function when($value, $callback, $default = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->when($value, $callback, $default); - } - - /** - * Pass the query to a given callback. - * - * @param callable $callback - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function tap($callback) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->tap($callback); - } - - /** - * Apply the callback's query changes if the given "value" is false. - * - * @param mixed $value - * @param callable $callback - * @param callable|null $default - * @return mixed|$this - * @static - */ - public static function unless($value, $callback, $default = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->unless($value, $callback, $default); - } - - /** - * Add a relationship count / exists condition to the query. - * - * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation - * @param string $operator - * @param int $count - * @param string $boolean - * @param \Closure|null $callback - * @return \Illuminate\Database\Eloquent\Builder|static - * @throws \RuntimeException - * @static - */ - public static function has($relation, $operator = '>=', $count = 1, $boolean = 'and', $callback = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->has($relation, $operator, $count, $boolean, $callback); - } - - /** - * Add a relationship count / exists condition to the query with an "or". - * - * @param string $relation - * @param string $operator - * @param int $count - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orHas($relation, $operator = '>=', $count = 1) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orHas($relation, $operator, $count); - } - - /** - * Add a relationship count / exists condition to the query. - * - * @param string $relation - * @param string $boolean - * @param \Closure|null $callback - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function doesntHave($relation, $boolean = 'and', $callback = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->doesntHave($relation, $boolean, $callback); - } - - /** - * Add a relationship count / exists condition to the query with an "or". - * - * @param string $relation - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orDoesntHave($relation) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orDoesntHave($relation); - } - - /** - * Add a relationship count / exists condition to the query with where clauses. - * - * @param string $relation - * @param \Closure|null $callback - * @param string $operator - * @param int $count - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function whereHas($relation, $callback = null, $operator = '>=', $count = 1) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->whereHas($relation, $callback, $operator, $count); - } - - /** - * Add a relationship count / exists condition to the query with where clauses and an "or". - * - * @param string $relation - * @param \Closure $callback - * @param string $operator - * @param int $count - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orWhereHas($relation, $callback = null, $operator = '>=', $count = 1) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orWhereHas($relation, $callback, $operator, $count); - } - - /** - * Add a relationship count / exists condition to the query with where clauses. - * - * @param string $relation - * @param \Closure|null $callback - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function whereDoesntHave($relation, $callback = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->whereDoesntHave($relation, $callback); - } - - /** - * Add a relationship count / exists condition to the query with where clauses and an "or". - * - * @param string $relation - * @param \Closure $callback - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orWhereDoesntHave($relation, $callback = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orWhereDoesntHave($relation, $callback); - } - - /** - * Add a polymorphic relationship count / exists condition to the query. - * - * @param string $relation - * @param string|array $types - * @param string $operator - * @param int $count - * @param string $boolean - * @param \Closure|null $callback - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function hasMorph($relation, $types, $operator = '>=', $count = 1, $boolean = 'and', $callback = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->hasMorph($relation, $types, $operator, $count, $boolean, $callback); - } - - /** - * Add a polymorphic relationship count / exists condition to the query with an "or". - * - * @param string $relation - * @param string|array $types - * @param string $operator - * @param int $count - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orHasMorph($relation, $types, $operator = '>=', $count = 1) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orHasMorph($relation, $types, $operator, $count); - } - - /** - * Add a polymorphic relationship count / exists condition to the query. - * - * @param string $relation - * @param string|array $types - * @param string $boolean - * @param \Closure|null $callback - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function doesntHaveMorph($relation, $types, $boolean = 'and', $callback = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->doesntHaveMorph($relation, $types, $boolean, $callback); - } - - /** - * Add a polymorphic relationship count / exists condition to the query with an "or". - * - * @param string $relation - * @param string|array $types - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orDoesntHaveMorph($relation, $types) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orDoesntHaveMorph($relation, $types); - } - - /** - * Add a polymorphic relationship count / exists condition to the query with where clauses. - * - * @param string $relation - * @param string|array $types - * @param \Closure|null $callback - * @param string $operator - * @param int $count - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function whereHasMorph($relation, $types, $callback = null, $operator = '>=', $count = 1) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->whereHasMorph($relation, $types, $callback, $operator, $count); - } - - /** - * Add a polymorphic relationship count / exists condition to the query with where clauses and an "or". - * - * @param string $relation - * @param string|array $types - * @param \Closure $callback - * @param string $operator - * @param int $count - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orWhereHasMorph($relation, $types, $callback = null, $operator = '>=', $count = 1) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orWhereHasMorph($relation, $types, $callback, $operator, $count); - } - - /** - * Add a polymorphic relationship count / exists condition to the query with where clauses. - * - * @param string $relation - * @param string|array $types - * @param \Closure|null $callback - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function whereDoesntHaveMorph($relation, $types, $callback = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->whereDoesntHaveMorph($relation, $types, $callback); - } - - /** - * Add a polymorphic relationship count / exists condition to the query with where clauses and an "or". - * - * @param string $relation - * @param string|array $types - * @param \Closure $callback - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orWhereDoesntHaveMorph($relation, $types, $callback = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orWhereDoesntHaveMorph($relation, $types, $callback); - } - - /** - * Add subselect queries to count the relations. - * - * @param mixed $relations - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function withCount($relations) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->withCount($relations); - } - - /** - * Merge the where constraints from another query to the current query. - * - * @param \Illuminate\Database\Eloquent\Builder $from - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function mergeConstraintsFrom($from) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->mergeConstraintsFrom($from); - } - - /** - * Set the columns to be selected. - * - * @param array|mixed $columns - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function select($columns = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->select($columns); - } - - /** - * Add a subselect expression to the query. - * - * @param \Closure|$this|string $query - * @param string $as - * @return \Illuminate\Database\Query\Builder|static - * @throws \InvalidArgumentException - * @static - */ - public static function selectSub($query, $as) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->selectSub($query, $as); - } - - /** - * Add a new "raw" select expression to the query. - * - * @param string $expression - * @param array $bindings - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function selectRaw($expression, $bindings = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->selectRaw($expression, $bindings); - } - - /** - * Makes "from" fetch from a subquery. - * - * @param \Closure|\Illuminate\Database\Query\Builder|string $query - * @param string $as - * @return \Illuminate\Database\Query\Builder|static - * @throws \InvalidArgumentException - * @static - */ - public static function fromSub($query, $as) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->fromSub($query, $as); - } - - /** - * Add a raw from clause to the query. - * - * @param string $expression - * @param mixed $bindings - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function fromRaw($expression, $bindings = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->fromRaw($expression, $bindings); - } - - /** - * Add a new select column to the query. - * - * @param array|mixed $column - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function addSelect($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->addSelect($column); - } - - /** - * Force the query to only return distinct results. - * - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function distinct() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->distinct(); - } - - /** - * Set the table which the query is targeting. - * - * @param \Closure|\Illuminate\Database\Query\Builder|string $table - * @param string|null $as - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function from($table, $as = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->from($table, $as); - } - - /** - * Add a join clause to the query. - * - * @param string $table - * @param \Closure|string $first - * @param string|null $operator - * @param string|null $second - * @param string $type - * @param bool $where - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function join($table, $first, $operator = null, $second = null, $type = 'inner', $where = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->join($table, $first, $operator, $second, $type, $where); - } - - /** - * Add a "join where" clause to the query. - * - * @param string $table - * @param \Closure|string $first - * @param string $operator - * @param string $second - * @param string $type - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function joinWhere($table, $first, $operator, $second, $type = 'inner') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->joinWhere($table, $first, $operator, $second, $type); - } - - /** - * Add a subquery join clause to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|string $query - * @param string $as - * @param \Closure|string $first - * @param string|null $operator - * @param string|null $second - * @param string $type - * @param bool $where - * @return \Illuminate\Database\Query\Builder|static - * @throws \InvalidArgumentException - * @static - */ - public static function joinSub($query, $as, $first, $operator = null, $second = null, $type = 'inner', $where = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->joinSub($query, $as, $first, $operator, $second, $type, $where); - } - - /** - * Add a left join to the query. - * - * @param string $table - * @param \Closure|string $first - * @param string|null $operator - * @param string|null $second - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function leftJoin($table, $first, $operator = null, $second = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->leftJoin($table, $first, $operator, $second); - } - - /** - * Add a "join where" clause to the query. - * - * @param string $table - * @param \Closure|string $first - * @param string $operator - * @param string $second - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function leftJoinWhere($table, $first, $operator, $second) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->leftJoinWhere($table, $first, $operator, $second); - } - - /** - * Add a subquery left join to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|string $query - * @param string $as - * @param \Closure|string $first - * @param string|null $operator - * @param string|null $second - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function leftJoinSub($query, $as, $first, $operator = null, $second = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->leftJoinSub($query, $as, $first, $operator, $second); - } - - /** - * Add a right join to the query. - * - * @param string $table - * @param \Closure|string $first - * @param string|null $operator - * @param string|null $second - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function rightJoin($table, $first, $operator = null, $second = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->rightJoin($table, $first, $operator, $second); - } - - /** - * Add a "right join where" clause to the query. - * - * @param string $table - * @param \Closure|string $first - * @param string $operator - * @param string $second - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function rightJoinWhere($table, $first, $operator, $second) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->rightJoinWhere($table, $first, $operator, $second); - } - - /** - * Add a subquery right join to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|string $query - * @param string $as - * @param \Closure|string $first - * @param string|null $operator - * @param string|null $second - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function rightJoinSub($query, $as, $first, $operator = null, $second = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->rightJoinSub($query, $as, $first, $operator, $second); - } - - /** - * Add a "cross join" clause to the query. - * - * @param string $table - * @param \Closure|string|null $first - * @param string|null $operator - * @param string|null $second - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function crossJoin($table, $first = null, $operator = null, $second = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->crossJoin($table, $first, $operator, $second); - } - - /** - * Merge an array of where clauses and bindings. - * - * @param array $wheres - * @param array $bindings - * @return void - * @static - */ - public static function mergeWheres($wheres, $bindings) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - $instance->mergeWheres($wheres, $bindings); - } - - /** - * Prepare the value and operator for a where clause. - * - * @param string $value - * @param string $operator - * @param bool $useDefault - * @return array - * @throws \InvalidArgumentException - * @static - */ - public static function prepareValueAndOperator($value, $operator, $useDefault = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->prepareValueAndOperator($value, $operator, $useDefault); - } - - /** - * Add a "where" clause comparing two columns to the query. - * - * @param string|array $first - * @param string|null $operator - * @param string|null $second - * @param string|null $boolean - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function whereColumn($first, $operator = null, $second = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereColumn($first, $operator, $second, $boolean); - } - - /** - * Add an "or where" clause comparing two columns to the query. - * - * @param string|array $first - * @param string|null $operator - * @param string|null $second - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function orWhereColumn($first, $operator = null, $second = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereColumn($first, $operator, $second); - } - - /** - * Add a raw where clause to the query. - * - * @param string $sql - * @param mixed $bindings - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereRaw($sql, $bindings = [], $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereRaw($sql, $bindings, $boolean); - } - - /** - * Add a raw or where clause to the query. - * - * @param string $sql - * @param mixed $bindings - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function orWhereRaw($sql, $bindings = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereRaw($sql, $bindings); - } - - /** - * Add a "where in" clause to the query. - * - * @param string $column - * @param mixed $values - * @param string $boolean - * @param bool $not - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereIn($column, $values, $boolean = 'and', $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereIn($column, $values, $boolean, $not); - } - - /** - * Add an "or where in" clause to the query. - * - * @param string $column - * @param mixed $values - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function orWhereIn($column, $values) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereIn($column, $values); - } - - /** - * Add a "where not in" clause to the query. - * - * @param string $column - * @param mixed $values - * @param string $boolean - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function whereNotIn($column, $values, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereNotIn($column, $values, $boolean); - } - - /** - * Add an "or where not in" clause to the query. - * - * @param string $column - * @param mixed $values - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function orWhereNotIn($column, $values) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereNotIn($column, $values); - } - - /** - * Add a "where in raw" clause for integer values to the query. - * - * @param string $column - * @param \Illuminate\Contracts\Support\Arrayable|array $values - * @param string $boolean - * @param bool $not - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereIntegerInRaw($column, $values, $boolean = 'and', $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereIntegerInRaw($column, $values, $boolean, $not); - } - - /** - * Add a "where not in raw" clause for integer values to the query. - * - * @param string $column - * @param \Illuminate\Contracts\Support\Arrayable|array $values - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereIntegerNotInRaw($column, $values, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereIntegerNotInRaw($column, $values, $boolean); - } - - /** - * Add a "where null" clause to the query. - * - * @param string|array $columns - * @param string $boolean - * @param bool $not - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereNull($columns, $boolean = 'and', $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereNull($columns, $boolean, $not); - } - - /** - * Add an "or where null" clause to the query. - * - * @param string $column - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function orWhereNull($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereNull($column); - } - - /** - * Add a "where not null" clause to the query. - * - * @param string|array $columns - * @param string $boolean - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function whereNotNull($columns, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereNotNull($columns, $boolean); - } - - /** - * Add a where between statement to the query. - * - * @param string $column - * @param array $values - * @param string $boolean - * @param bool $not - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereBetween($column, $values, $boolean = 'and', $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereBetween($column, $values, $boolean, $not); - } - - /** - * Add an or where between statement to the query. - * - * @param string $column - * @param array $values - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function orWhereBetween($column, $values) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereBetween($column, $values); - } - - /** - * Add a where not between statement to the query. - * - * @param string $column - * @param array $values - * @param string $boolean - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function whereNotBetween($column, $values, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereNotBetween($column, $values, $boolean); - } - - /** - * Add an or where not between statement to the query. - * - * @param string $column - * @param array $values - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function orWhereNotBetween($column, $values) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereNotBetween($column, $values); - } - - /** - * Add an "or where not null" clause to the query. - * - * @param string $column - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function orWhereNotNull($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereNotNull($column); - } - - /** - * Add a "where date" statement to the query. - * - * @param string $column - * @param string $operator - * @param \DateTimeInterface|string|null $value - * @param string $boolean - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function whereDate($column, $operator, $value = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereDate($column, $operator, $value, $boolean); - } - - /** - * Add an "or where date" statement to the query. - * - * @param string $column - * @param string $operator - * @param \DateTimeInterface|string|null $value - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function orWhereDate($column, $operator, $value = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereDate($column, $operator, $value); - } - - /** - * Add a "where time" statement to the query. - * - * @param string $column - * @param string $operator - * @param \DateTimeInterface|string|null $value - * @param string $boolean - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function whereTime($column, $operator, $value = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereTime($column, $operator, $value, $boolean); - } - - /** - * Add an "or where time" statement to the query. - * - * @param string $column - * @param string $operator - * @param \DateTimeInterface|string|null $value - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function orWhereTime($column, $operator, $value = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereTime($column, $operator, $value); - } - - /** - * Add a "where day" statement to the query. - * - * @param string $column - * @param string $operator - * @param \DateTimeInterface|string|null $value - * @param string $boolean - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function whereDay($column, $operator, $value = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereDay($column, $operator, $value, $boolean); - } - - /** - * Add an "or where day" statement to the query. - * - * @param string $column - * @param string $operator - * @param \DateTimeInterface|string|null $value - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function orWhereDay($column, $operator, $value = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereDay($column, $operator, $value); - } - - /** - * Add a "where month" statement to the query. - * - * @param string $column - * @param string $operator - * @param \DateTimeInterface|string|null $value - * @param string $boolean - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function whereMonth($column, $operator, $value = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereMonth($column, $operator, $value, $boolean); - } - - /** - * Add an "or where month" statement to the query. - * - * @param string $column - * @param string $operator - * @param \DateTimeInterface|string|null $value - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function orWhereMonth($column, $operator, $value = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereMonth($column, $operator, $value); - } - - /** - * Add a "where year" statement to the query. - * - * @param string $column - * @param string $operator - * @param \DateTimeInterface|string|int|null $value - * @param string $boolean - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function whereYear($column, $operator, $value = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereYear($column, $operator, $value, $boolean); - } - - /** - * Add an "or where year" statement to the query. - * - * @param string $column - * @param string $operator - * @param \DateTimeInterface|string|int|null $value - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function orWhereYear($column, $operator, $value = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereYear($column, $operator, $value); - } - - /** - * Add a nested where statement to the query. - * - * @param \Closure $callback - * @param string $boolean - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function whereNested($callback, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereNested($callback, $boolean); - } - - /** - * Create a new query instance for nested where condition. - * - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function forNestedWhere() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->forNestedWhere(); - } - - /** - * Add another query builder as a nested where to the query builder. - * - * @param \Illuminate\Database\Query\Builder|static $query - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function addNestedWhereQuery($query, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->addNestedWhereQuery($query, $boolean); - } - - /** - * Add an exists clause to the query. - * - * @param \Closure $callback - * @param string $boolean - * @param bool $not - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereExists($callback, $boolean = 'and', $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereExists($callback, $boolean, $not); - } - - /** - * Add an or exists clause to the query. - * - * @param \Closure $callback - * @param bool $not - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function orWhereExists($callback, $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereExists($callback, $not); - } - - /** - * Add a where not exists clause to the query. - * - * @param \Closure $callback - * @param string $boolean - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function whereNotExists($callback, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereNotExists($callback, $boolean); - } - - /** - * Add a where not exists clause to the query. - * - * @param \Closure $callback - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function orWhereNotExists($callback) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereNotExists($callback); - } - - /** - * Add an exists clause to the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param string $boolean - * @param bool $not - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function addWhereExistsQuery($query, $boolean = 'and', $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->addWhereExistsQuery($query, $boolean, $not); - } - - /** - * Adds a where condition using row values. - * - * @param array $columns - * @param string $operator - * @param array $values - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @throws \InvalidArgumentException - * @static - */ - public static function whereRowValues($columns, $operator, $values, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereRowValues($columns, $operator, $values, $boolean); - } - - /** - * Adds a or where condition using row values. - * - * @param array $columns - * @param string $operator - * @param array $values - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereRowValues($columns, $operator, $values) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereRowValues($columns, $operator, $values); - } - - /** - * Add a "where JSON contains" clause to the query. - * - * @param string $column - * @param mixed $value - * @param string $boolean - * @param bool $not - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereJsonContains($column, $value, $boolean = 'and', $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereJsonContains($column, $value, $boolean, $not); - } - - /** - * Add a "or where JSON contains" clause to the query. - * - * @param string $column - * @param mixed $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereJsonContains($column, $value) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereJsonContains($column, $value); - } - - /** - * Add a "where JSON not contains" clause to the query. - * - * @param string $column - * @param mixed $value - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereJsonDoesntContain($column, $value, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereJsonDoesntContain($column, $value, $boolean); - } - - /** - * Add a "or where JSON not contains" clause to the query. - * - * @param string $column - * @param mixed $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereJsonDoesntContain($column, $value) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereJsonDoesntContain($column, $value); - } - - /** - * Add a "where JSON length" clause to the query. - * - * @param string $column - * @param mixed $operator - * @param mixed $value - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereJsonLength($column, $operator, $value = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereJsonLength($column, $operator, $value, $boolean); - } - - /** - * Add a "or where JSON length" clause to the query. - * - * @param string $column - * @param mixed $operator - * @param mixed $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereJsonLength($column, $operator, $value = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereJsonLength($column, $operator, $value); - } - - /** - * Handles dynamic "where" clauses to the query. - * - * @param string $method - * @param array $parameters - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function dynamicWhere($method, $parameters) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->dynamicWhere($method, $parameters); - } - - /** - * Add a "group by" clause to the query. - * - * @param array|string $groups - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function groupBy(...$groups) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->groupBy(...$groups); - } - - /** - * Add a raw groupBy clause to the query. - * - * @param string $sql - * @param array $bindings - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function groupByRaw($sql, $bindings = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->groupByRaw($sql, $bindings); - } - - /** - * Add a "having" clause to the query. - * - * @param string $column - * @param string|null $operator - * @param string|null $value - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function having($column, $operator = null, $value = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->having($column, $operator, $value, $boolean); - } - - /** - * Add a "or having" clause to the query. - * - * @param string $column - * @param string|null $operator - * @param string|null $value - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function orHaving($column, $operator = null, $value = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orHaving($column, $operator, $value); - } - - /** - * Add a "having between " clause to the query. - * - * @param string $column - * @param array $values - * @param string $boolean - * @param bool $not - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function havingBetween($column, $values, $boolean = 'and', $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->havingBetween($column, $values, $boolean, $not); - } - - /** - * Add a raw having clause to the query. - * - * @param string $sql - * @param array $bindings - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function havingRaw($sql, $bindings = [], $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->havingRaw($sql, $bindings, $boolean); - } - - /** - * Add a raw or having clause to the query. - * - * @param string $sql - * @param array $bindings - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function orHavingRaw($sql, $bindings = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orHavingRaw($sql, $bindings); - } - - /** - * Add an "order by" clause to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Query\Expression|string $column - * @param string $direction - * @return \Illuminate\Database\Query\Builder - * @throws \InvalidArgumentException - * @static - */ - public static function orderBy($column, $direction = 'asc') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orderBy($column, $direction); - } - - /** - * Add a descending "order by" clause to the query. - * - * @param string $column - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orderByDesc($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orderByDesc($column); - } - - /** - * Put the query's results in random order. - * - * @param string $seed - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function inRandomOrder($seed = '') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->inRandomOrder($seed); - } - - /** - * Add a raw "order by" clause to the query. - * - * @param string $sql - * @param array $bindings - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orderByRaw($sql, $bindings = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orderByRaw($sql, $bindings); - } - - /** - * Alias to set the "offset" value of the query. - * - * @param int $value - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function skip($value) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->skip($value); - } - - /** - * Set the "offset" value of the query. - * - * @param int $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function offset($value) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->offset($value); - } - - /** - * Alias to set the "limit" value of the query. - * - * @param int $value - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function take($value) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->take($value); - } - - /** - * Set the "limit" value of the query. - * - * @param int $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function limit($value) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->limit($value); - } - - /** - * Set the limit and offset for a given page. - * - * @param int $page - * @param int $perPage - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function forPage($page, $perPage = 15) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->forPage($page, $perPage); - } - - /** - * Constrain the query to the previous "page" of results before a given ID. - * - * @param int $perPage - * @param int|null $lastId - * @param string $column - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function forPageBeforeId($perPage = 15, $lastId = 0, $column = 'id') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->forPageBeforeId($perPage, $lastId, $column); - } - - /** - * Constrain the query to the next "page" of results after a given ID. - * - * @param int $perPage - * @param int|null $lastId - * @param string $column - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function forPageAfterId($perPage = 15, $lastId = 0, $column = 'id') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->forPageAfterId($perPage, $lastId, $column); - } - - /** - * Add a union statement to the query. - * - * @param \Illuminate\Database\Query\Builder|\Closure $query - * @param bool $all - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function union($query, $all = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->union($query, $all); - } - - /** - * Add a union all statement to the query. - * - * @param \Illuminate\Database\Query\Builder|\Closure $query - * @return \Illuminate\Database\Query\Builder|static - * @static - */ - public static function unionAll($query) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->unionAll($query); - } - - /** - * Lock the selected rows in the table. - * - * @param string|bool $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function lock($value = true) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->lock($value); - } - - /** - * Lock the selected rows in the table for updating. - * - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function lockForUpdate() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->lockForUpdate(); - } - - /** - * Share lock the selected rows in the table. - * - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function sharedLock() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->sharedLock(); - } - - /** - * Get the SQL representation of the query. - * - * @return string - * @static - */ - public static function toSql() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->toSql(); - } - - /** - * Get the count of the total records for the paginator. - * - * @param array $columns - * @return int - * @static - */ - public static function getCountForPagination($columns = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->getCountForPagination($columns); - } - - /** - * Concatenate values of a given column as a string. - * - * @param string $column - * @param string $glue - * @return string - * @static - */ - public static function implode($column, $glue = '') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->implode($column, $glue); - } - - /** - * Determine if any rows exist for the current query. - * - * @return bool - * @static - */ - public static function exists() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->exists(); - } - - /** - * Determine if no rows exist for the current query. - * - * @return bool - * @static - */ - public static function doesntExist() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->doesntExist(); - } - - /** - * Execute the given callback if no rows exist for the current query. - * - * @param \Closure $callback - * @return mixed - * @static - */ - public static function existsOr($callback) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->existsOr($callback); - } - - /** - * Execute the given callback if rows exist for the current query. - * - * @param \Closure $callback - * @return mixed - * @static - */ - public static function doesntExistOr($callback) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->doesntExistOr($callback); - } - - /** - * Retrieve the "count" result of the query. - * - * @param string $columns - * @return int - * @static - */ - public static function count($columns = '*') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->count($columns); - } - - /** - * Retrieve the minimum value of a given column. - * - * @param string $column - * @return mixed - * @static - */ - public static function min($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->min($column); - } - - /** - * Retrieve the maximum value of a given column. - * - * @param string $column - * @return mixed - * @static - */ - public static function max($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->max($column); - } - - /** - * Retrieve the sum of the values of a given column. - * - * @param string $column - * @return mixed - * @static - */ - public static function sum($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->sum($column); - } - - /** - * Retrieve the average of the values of a given column. - * - * @param string $column - * @return mixed - * @static - */ - public static function avg($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->avg($column); - } - - /** - * Alias for the "avg" method. - * - * @param string $column - * @return mixed - * @static - */ - public static function average($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->average($column); - } - - /** - * Execute an aggregate function on the database. - * - * @param string $function - * @param array $columns - * @return mixed - * @static - */ - public static function aggregate($function, $columns = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->aggregate($function, $columns); - } - - /** - * Execute a numeric aggregate function on the database. - * - * @param string $function - * @param array $columns - * @return float|int - * @static - */ - public static function numericAggregate($function, $columns = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->numericAggregate($function, $columns); - } - - /** - * Insert a new record into the database. - * - * @param array $values - * @return bool - * @static - */ - public static function insert($values) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->insert($values); - } - - /** - * Insert a new record into the database while ignoring errors. - * - * @param array $values - * @return int - * @static - */ - public static function insertOrIgnore($values) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->insertOrIgnore($values); - } - - /** - * Insert a new record and get the value of the primary key. - * - * @param array $values - * @param string|null $sequence - * @return int - * @static - */ - public static function insertGetId($values, $sequence = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->insertGetId($values, $sequence); - } - - /** - * Insert new records into the table using a subquery. - * - * @param array $columns - * @param \Closure|\Illuminate\Database\Query\Builder|string $query - * @return int - * @static - */ - public static function insertUsing($columns, $query) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->insertUsing($columns, $query); - } - - /** - * Insert or update a record matching the attributes, and fill it with values. - * - * @param array $attributes - * @param array $values - * @return bool - * @static - */ - public static function updateOrInsert($attributes, $values = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->updateOrInsert($attributes, $values); - } - - /** - * Run a truncate statement on the table. - * - * @return void - * @static - */ - public static function truncate() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - $instance->truncate(); - } - - /** - * Create a raw database expression. - * - * @param mixed $value - * @return \Illuminate\Database\Query\Expression - * @static - */ - public static function raw($value) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->raw($value); - } - - /** - * Get the current query value bindings in a flattened array. - * - * @return array - * @static - */ - public static function getBindings() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->getBindings(); - } - - /** - * Get the raw array of bindings. - * - * @return array - * @static - */ - public static function getRawBindings() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->getRawBindings(); - } - - /** - * Set the bindings on the query builder. - * - * @param array $bindings - * @param string $type - * @return \Illuminate\Database\Query\Builder - * @throws \InvalidArgumentException - * @static - */ - public static function setBindings($bindings, $type = 'where') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->setBindings($bindings, $type); - } - - /** - * Add a binding to the query. - * - * @param mixed $value - * @param string $type - * @return \Illuminate\Database\Query\Builder - * @throws \InvalidArgumentException - * @static - */ - public static function addBinding($value, $type = 'where') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->addBinding($value, $type); - } - - /** - * Merge an array of bindings into our bindings. - * - * @param \Illuminate\Database\Query\Builder $query - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function mergeBindings($query) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->mergeBindings($query); - } - - /** - * Get the database query processor instance. - * - * @return \Illuminate\Database\Query\Processors\Processor - * @static - */ - public static function getProcessor() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->getProcessor(); - } - - /** - * Get the query grammar instance. - * - * @return \Illuminate\Database\Query\Grammars\Grammar - * @static - */ - public static function getGrammar() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->getGrammar(); - } - - /** - * Use the write pdo for query. - * - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function useWritePdo() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->useWritePdo(); - } - - /** - * Clone the query without the given properties. - * - * @param array $properties - * @return static - * @static - */ - public static function cloneWithout($properties) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->cloneWithout($properties); - } - - /** - * Clone the query without the given bindings. - * - * @param array $except - * @return static - * @static - */ - public static function cloneWithoutBindings($except) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->cloneWithoutBindings($except); - } - - /** - * Dump the current SQL and bindings. - * - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function dump() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->dump(); - } - - /** - * Die and dump the current SQL and bindings. - * - * @return void - * @static - */ - public static function dd() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - $instance->dd(); - } - - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Database\Query\Builder::macro($name, $macro); - } - - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Database\Query\Builder::mixin($mixin, $replace); - } - - /** - * Dynamically handle calls to the class. - * - * @param string $method - * @param array $parameters - * @return mixed - * @throws \BadMethodCallException - * @static - */ - public static function macroCall($method, $parameters) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->macroCall($method, $parameters); - } - } - class Event extends \Illuminate\Support\Facades\Event {} - class File extends \Illuminate\Support\Facades\File {} - class Gate extends \Illuminate\Support\Facades\Gate {} - class Hash extends \Illuminate\Support\Facades\Hash {} - class Lang extends \Illuminate\Support\Facades\Lang {} - class Log extends \Illuminate\Support\Facades\Log {} - class Mail extends \Illuminate\Support\Facades\Mail {} - class Notification extends \Illuminate\Support\Facades\Notification {} - class Password extends \Illuminate\Support\Facades\Password {} - class Queue extends \Illuminate\Support\Facades\Queue {} - class Redirect extends \Illuminate\Support\Facades\Redirect {} - class Redis extends \Illuminate\Support\Facades\Redis {} - class Request extends \Illuminate\Support\Facades\Request {} - class Response extends \Illuminate\Support\Facades\Response {} - class Route extends \Illuminate\Support\Facades\Route {} - class Schema extends \Illuminate\Support\Facades\Schema {} - class Session extends \Illuminate\Support\Facades\Session {} - class Storage extends \Illuminate\Support\Facades\Storage {} - class Str extends \Illuminate\Support\Str {} - class URL extends \Illuminate\Support\Facades\URL {} - class Validator extends \Illuminate\Support\Facades\Validator {} - class View extends \Illuminate\Support\Facades\View {} - class Flare extends \Facade\Ignition\Facades\Flare {} - class Image extends \Intervention\Image\Facades\Image {} - class Socialite extends \Laravel\Socialite\Facades\Socialite {} - class Captcha extends \Mews\Captcha\Facades\Captcha {} - class EasyWeChat extends \Overtrue\LaravelWeChat\Facade {} - -} - - - - diff --git a/api/app/Console/Commands/Code.php b/api/app/Console/Commands/Code.php deleted file mode 100644 index 2d6e487c..00000000 --- a/api/app/Console/Commands/Code.php +++ /dev/null @@ -1,46 +0,0 @@ -argument('name'); - $this->info("this is a test!!, my name is $name"); - - } -} diff --git a/api/app/Events/Chat.php b/api/app/Events/Chat.php deleted file mode 100644 index cfd0a5f3..00000000 --- a/api/app/Events/Chat.php +++ /dev/null @@ -1,38 +0,0 @@ -msg = $msg; - } - - /** - * Get the channels the event should broadcast on. - * - * @return \Illuminate\Broadcasting\Channel|array - */ - public function broadcastOn() - { - return new PresenceChannel('chat'); - } -} diff --git a/api/app/Events/CustomerService.php b/api/app/Events/CustomerService.php deleted file mode 100644 index 510688e0..00000000 --- a/api/app/Events/CustomerService.php +++ /dev/null @@ -1,38 +0,0 @@ -msg = $msg; - } - - /** - * Get the channels the event should broadcast on. - * - * @return \Illuminate\Broadcasting\Channel|array - */ - public function broadcastOn() - { - return new PresenceChannel('kefu'); - } -} diff --git a/api/app/Events/ThreeLogin.php b/api/app/Events/ThreeLogin.php deleted file mode 100644 index 7a6a2eba..00000000 --- a/api/app/Events/ThreeLogin.php +++ /dev/null @@ -1,41 +0,0 @@ -loginType = $type; - $this->uuid = $uuid; - } - - /** - * Get the channels the event should broadcast on. - * - * @return \Illuminate\Broadcasting\Channel|array - */ - public function broadcastOn() - { - return new Channel('success.'.$this->uuid); - } -} diff --git a/api/app/Events/UserLogin.php b/api/app/Events/UserLogin.php deleted file mode 100644 index 3bfa49a7..00000000 --- a/api/app/Events/UserLogin.php +++ /dev/null @@ -1,40 +0,0 @@ -user = $user; - } - - /** - * Get the channels the event should broadcast on. - * - * @return \Illuminate\Broadcasting\Channel|array - */ - public function broadcastOn() - { - // return new PrivateChannel('leave.'.$this->user->id); - return new Channel('leave.'.$this->user->email); - } -} diff --git a/api/app/GatewayClient/Gateway.php b/api/app/GatewayClient/Gateway.php deleted file mode 100644 index 94eb8a30..00000000 --- a/api/app/GatewayClient/Gateway.php +++ /dev/null @@ -1,1614 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -/** - * 数据发送相关 - * @version 3.0.12 - */ - -/** - * 数据发送相关 - */ -class Gateway -{ - /** - * gateway 实例 - * - * @var object - */ - protected static $businessWorker = null; - - /** - * 注册中心地址 - * - * @var string|array - */ - public static $registerAddress = '127.0.0.1:1236'; - - /** - * 秘钥 - * @var string - */ - public static $secretKey = ''; - - /** - * 链接超时时间 - * @var int - */ - public static $connectTimeout = 3; - - /** - * 与Gateway是否是长链接 - * @var bool - */ - public static $persistentConnection = false; - - /** - * 是否清除注册地址缓存 - * @var bool - */ - public static $addressesCacheDisable = false; - - /** - * 向所有客户端连接(或者 client_id_array 指定的客户端连接)广播消息 - * - * @param string $message 向客户端发送的消息 - * @param array $client_id_array 客户端 id 数组 - * @param array $exclude_client_id 不给这些client_id发 - * @param bool $raw 是否发送原始数据(即不调用gateway的协议的encode方法) - * @return void - * @throws Exception - */ - public static function sendToAll($message, $client_id_array = null, $exclude_client_id = null, $raw = false) - { - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_SEND_TO_ALL; - $gateway_data['body'] = $message; - if ($raw) { - $gateway_data['flag'] |= GatewayProtocol::FLAG_NOT_CALL_ENCODE; - } - - if ($exclude_client_id) { - if (!is_array($exclude_client_id)) { - $exclude_client_id = array($exclude_client_id); - } - if ($client_id_array) { - $exclude_client_id = array_flip($exclude_client_id); - } - } - - if ($client_id_array) { - if (!is_array($client_id_array)) { - echo new \Exception('bad $client_id_array:'.var_export($client_id_array, true)); - return; - } - $data_array = array(); - foreach ($client_id_array as $client_id) { - if (isset($exclude_client_id[$client_id])) { - continue; - } - $address = Context::clientIdToAddress($client_id); - if ($address) { - $key = long2ip($address['local_ip']) . ":{$address['local_port']}"; - $data_array[$key][$address['connection_id']] = $address['connection_id']; - } - } - foreach ($data_array as $addr => $connection_id_list) { - $the_gateway_data = $gateway_data; - $the_gateway_data['ext_data'] = json_encode(array('connections' => $connection_id_list)); - static::sendToGateway($addr, $the_gateway_data); - } - return; - } elseif (empty($client_id_array) && is_array($client_id_array)) { - return; - } - - if (!$exclude_client_id) { - return static::sendToAllGateway($gateway_data); - } - - $address_connection_array = static::clientIdArrayToAddressArray($exclude_client_id); - - // 如果有businessWorker实例,说明运行在workerman环境中,通过businessWorker中的长连接发送数据 - if (static::$businessWorker) { - foreach (static::$businessWorker->gatewayConnections as $address => $gateway_connection) { - $gateway_data['ext_data'] = isset($address_connection_array[$address]) ? - json_encode(array('exclude'=> $address_connection_array[$address])) : ''; - /** @var TcpConnection $gateway_connection */ - $gateway_connection->send($gateway_data); - } - } // 运行在其它环境中,通过注册中心得到gateway地址 - else { - $all_addresses = static::getAllGatewayAddressesFromRegister(); - foreach ($all_addresses as $address) { - $gateway_data['ext_data'] = isset($address_connection_array[$address]) ? - json_encode(array('exclude'=> $address_connection_array[$address])) : ''; - static::sendToGateway($address, $gateway_data); - } - } - - } - - /** - * 向某个client_id对应的连接发消息 - * - * @param string $client_id - * @param string $message - * @return void - */ - public static function sendToClient($client_id, $message) - { - return static::sendCmdAndMessageToClient($client_id, GatewayProtocol::CMD_SEND_TO_ONE, $message); - } - - /** - * 判断某个uid是否在线 - * - * @param string $uid - * @return int 0|1 - */ - public static function isUidOnline($uid) - { - return (int)static::getClientIdByUid($uid); - } - - /** - * 判断client_id对应的连接是否在线 - * - * @param string $client_id - * @return int 0|1 - */ - public static function isOnline($client_id) - { - $address_data = Context::clientIdToAddress($client_id); - if (!$address_data) { - return 0; - } - $address = long2ip($address_data['local_ip']) . ":{$address_data['local_port']}"; - if (isset(static::$businessWorker)) { - if (!isset(static::$businessWorker->gatewayConnections[$address])) { - return 0; - } - } - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_IS_ONLINE; - $gateway_data['connection_id'] = $address_data['connection_id']; - return (int)static::sendAndRecv($address, $gateway_data); - } - - /** - * 获取所有在线用户的session,client_id为 key(弃用,请用getAllClientSessions代替) - * - * @param string $group - * @return array - */ - public static function getAllClientInfo($group = '') - { - echo "Warning: Gateway::getAllClientInfo is deprecated and will be removed in a future, please use Gateway::getAllClientSessions instead."; - return static::getAllClientSessions($group); - } - - /** - * 获取所有在线client_id的session,client_id为 key - * - * @param string $group - * @return array - */ - public static function getAllClientSessions($group = '') - { - $gateway_data = GatewayProtocol::$empty; - if (!$group) { - $gateway_data['cmd'] = GatewayProtocol::CMD_GET_ALL_CLIENT_SESSIONS; - } else { - $gateway_data['cmd'] = GatewayProtocol::CMD_GET_CLIENT_SESSIONS_BY_GROUP; - $gateway_data['ext_data'] = $group; - } - $status_data = array(); - $all_buffer_array = static::getBufferFromAllGateway($gateway_data); - foreach ($all_buffer_array as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $data) { - if ($data) { - foreach ($data as $connection_id => $session_buffer) { - $client_id = Context::addressToClientId($local_ip, $local_port, $connection_id); - if ($client_id === Context::$client_id) { - $status_data[$client_id] = (array)$_SESSION; - } else { - $status_data[$client_id] = $session_buffer ? Context::sessionDecode($session_buffer) : array(); - } - } - } - } - } - return $status_data; - } - - /** - * 获取某个组的连接信息(弃用,请用getClientSessionsByGroup代替) - * - * @param string $group - * @return array - */ - public static function getClientInfoByGroup($group) - { - echo "Warning: Gateway::getClientInfoByGroup is deprecated and will be removed in a future, please use Gateway::getClientSessionsByGroup instead."; - return static::getAllClientSessions($group); - } - - /** - * 获取某个组的所有client_id的session信息 - * - * @param string $group - * - * @return array - */ - public static function getClientSessionsByGroup($group) - { - if (static::isValidGroupId($group)) { - return static::getAllClientSessions($group); - } - return array(); - } - - /** - * 获取所有在线client_id数 - * - * @return int - */ - public static function getAllClientIdCount() - { - return static::getClientCountByGroup(); - } - - /** - * 获取所有在线client_id数(getAllClientIdCount的别名) - * - * @return int - */ - public static function getAllClientCount() - { - return static::getAllClientIdCount(); - } - - /** - * 获取某个组的在线client_id数 - * - * @param string $group - * @return int - */ - public static function getClientIdCountByGroup($group = '') - { - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_GET_CLIENT_COUNT_BY_GROUP; - $gateway_data['ext_data'] = $group; - $total_count = 0; - $all_buffer_array = static::getBufferFromAllGateway($gateway_data); - foreach ($all_buffer_array as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $count) { - if ($count) { - $total_count += $count; - } - } - } - return $total_count; - } - - /** - * getClientIdCountByGroup 函数的别名 - * - * @param string $group - * @return int - */ - public static function getClientCountByGroup($group = '') - { - return static::getClientIdCountByGroup($group); - } - - /** - * 获取某个群组在线client_id列表 - * - * @param string $group - * @return array - */ - public static function getClientIdListByGroup($group) - { - if (!static::isValidGroupId($group)) { - return array(); - } - - $data = static::select(array('uid'), array('groups' => is_array($group) ? $group : array($group))); - $client_id_map = array(); - foreach ($data as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $items) { - //$items = ['connection_id'=>['uid'=>x, 'group'=>[x,x..], 'session'=>[..]], 'client_id'=>[..], ..]; - foreach ($items as $connection_id => $info) { - $client_id = Context::addressToClientId($local_ip, $local_port, $connection_id); - $client_id_map[$client_id] = $client_id; - } - } - } - return $client_id_map; - } - - /** - * 获取集群所有在线client_id列表 - * - * @return array - */ - public static function getAllClientIdList() - { - return static::formatClientIdFromGatewayBuffer(static::select(array('uid'))); - } - - /** - * 格式化client_id - * - * @param $data - * @return array - */ - protected static function formatClientIdFromGatewayBuffer($data) - { - $client_id_list = array(); - foreach ($data as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $items) { - //$items = ['connection_id'=>['uid'=>x, 'group'=>[x,x..], 'session'=>[..]], 'client_id'=>[..], ..]; - foreach ($items as $connection_id => $info) { - $client_id = Context::addressToClientId($local_ip, $local_port, $connection_id); - $client_id_list[$client_id] = $client_id; - } - } - } - return $client_id_list; - } - - - /** - * 获取与 uid 绑定的 client_id 列表 - * - * @param string $uid - * @return array - */ - public static function getClientIdByUid($uid) - { - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_GET_CLIENT_ID_BY_UID; - $gateway_data['ext_data'] = $uid; - $client_list = array(); - $all_buffer_array = static::getBufferFromAllGateway($gateway_data); - foreach ($all_buffer_array as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $connection_id_array) { - if ($connection_id_array) { - foreach ($connection_id_array as $connection_id) { - $client_list[] = Context::addressToClientId($local_ip, $local_port, $connection_id); - } - } - } - } - return $client_list; - } - - /** - * 获取某个群组在线uid列表 - * - * @param string $group - * @return array - */ - public static function getUidListByGroup($group) - { - if (!static::isValidGroupId($group)) { - return array(); - } - - $group = is_array($group) ? $group : array($group); - $data = static::select(array('uid'), array('groups' => $group)); - $uid_map = array(); - foreach ($data as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $items) { - //$items = ['connection_id'=>['uid'=>x, 'group'=>[x,x..], 'session'=>[..]], 'client_id'=>[..], ..]; - foreach ($items as $connection_id => $info) { - if (!empty($info['uid'])) { - $uid_map[$info['uid']] = $info['uid']; - } - } - } - } - return $uid_map; - } - - /** - * 获取某个群组在线uid数 - * - * @param string $group - * @return int - */ - public static function getUidCountByGroup($group) - { - if (static::isValidGroupId($group)) { - return count(static::getUidListByGroup($group)); - } - return 0; - } - - /** - * 获取全局在线uid列表 - * - * @return array - */ - public static function getAllUidList() - { - $data = static::select(array('uid')); - $uid_map = array(); - foreach ($data as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $items) { - //$items = ['connection_id'=>['uid'=>x, 'group'=>[x,x..], 'session'=>[..]], 'client_id'=>[..], ..]; - foreach ($items as $connection_id => $info) { - if (!empty($info['uid'])) { - $uid_map[$info['uid']] = $info['uid']; - } - } - } - } - return $uid_map; - } - - /** - * 获取全局在线uid数 - * @return int - */ - public static function getAllUidCount() - { - return count(static::getAllUidList()); - } - - /** - * 通过client_id获取uid - * - * @param $client_id - * @return mixed - */ - public static function getUidByClientId($client_id) - { - $data = static::select(array('uid'), array('client_id'=>array($client_id))); - foreach ($data as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $items) { - //$items = ['connection_id'=>['uid'=>x, 'group'=>[x,x..], 'session'=>[..]], 'client_id'=>[..], ..]; - foreach ($items as $info) { - return $info['uid']; - } - } - } - } - - /** - * 获取所有在线的群组id - * - * @return array - */ - public static function getAllGroupIdList() - { - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_GET_GROUP_ID_LIST; - $group_id_list = array(); - $all_buffer_array = static::getBufferFromAllGateway($gateway_data); - foreach ($all_buffer_array as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $group_id_array) { - if (is_array($group_id_array)) { - foreach ($group_id_array as $group_id) { - if (!isset($group_id_list[$group_id])) { - $group_id_list[$group_id] = $group_id; - } - } - } - } - } - return $group_id_list; - } - - - /** - * 获取所有在线分组的uid数量,也就是每个分组的在线用户数 - * - * @return array - */ - public static function getAllGroupUidCount() - { - $group_uid_map = static::getAllGroupUidList(); - $group_uid_count_map = array(); - foreach ($group_uid_map as $group_id => $uid_list) { - $group_uid_count_map[$group_id] = count($uid_list); - } - return $group_uid_count_map; - } - - - - /** - * 获取所有分组uid在线列表 - * - * @return array - */ - public static function getAllGroupUidList() - { - $data = static::select(array('uid','groups')); - $group_uid_map = array(); - foreach ($data as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $items) { - //$items = ['connection_id'=>['uid'=>x, 'group'=>[x,x..], 'session'=>[..]], 'client_id'=>[..], ..]; - foreach ($items as $connection_id => $info) { - if (empty($info['uid']) || empty($info['groups'])) { - break; - } - $uid = $info['uid']; - foreach ($info['groups'] as $group_id) { - if(!isset($group_uid_map[$group_id])) { - $group_uid_map[$group_id] = array(); - } - $group_uid_map[$group_id][$uid] = $uid; - } - } - } - } - return $group_uid_map; - } - - /** - * 获取所有群组在线client_id列表 - * - * @return array - */ - public static function getAllGroupClientIdList() - { - $data = static::select(array('groups')); - $group_client_id_map = array(); - foreach ($data as $local_ip => $buffer_array) { - foreach ($buffer_array as $local_port => $items) { - //$items = ['connection_id'=>['uid'=>x, 'group'=>[x,x..], 'session'=>[..]], 'client_id'=>[..], ..]; - foreach ($items as $connection_id => $info) { - if (empty($info['groups'])) { - break; - } - $client_id = Context::addressToClientId($local_ip, $local_port, $connection_id); - foreach ($info['groups'] as $group_id) { - if(!isset($group_client_id_map[$group_id])) { - $group_client_id_map[$group_id] = array(); - } - $group_client_id_map[$group_id][$client_id] = $client_id; - } - } - } - } - return $group_client_id_map; - } - - /** - * 获取所有群组在线client_id数量,也就是获取每个群组在线连接数 - * - * @return array - */ - public static function getAllGroupClientIdCount() - { - $group_client_map = static::getAllGroupClientIdList(); - $group_client_count_map = array(); - foreach ($group_client_map as $group_id => $client_id_list) { - $group_client_count_map[$group_id] = count($client_id_list); - } - return $group_client_count_map; - } - - - /** - * 根据条件到gateway搜索数据 - * - * @param array $fields - * @param array $where - * @return array - */ - protected static function select($fields = array('session','uid','groups'), $where = array()) - { - $t = microtime(true); - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_SELECT; - $gateway_data['ext_data'] = array('fields' => $fields, 'where' => $where); - $gateway_data_list = array(); - // 有client_id,能计算出需要和哪些gateway通讯,只和必要的gateway通讯能降低系统负载 - if (isset($where['client_id'])) { - $client_id_list = $where['client_id']; - unset($gateway_data['ext_data']['where']['client_id']); - $gateway_data['ext_data']['where']['connection_id'] = array(); - foreach ($client_id_list as $client_id) { - $address_data = Context::clientIdToAddress($client_id); - if (!$address_data) { - continue; - } - $address = long2ip($address_data['local_ip']) . ":{$address_data['local_port']}"; - if (!isset($gateway_data_list[$address])) { - $gateway_data_list[$address] = $gateway_data; - } - $gateway_data_list[$address]['ext_data']['where']['connection_id'][$address_data['connection_id']] = $address_data['connection_id']; - } - foreach ($gateway_data_list as $address => $item) { - $gateway_data_list[$address]['ext_data'] = json_encode($item['ext_data']); - } - // 有其它条件,则还是需要向所有gateway发送 - if (count($where) !== 1) { - $gateway_data['ext_data'] = json_encode($gateway_data['ext_data']); - foreach (static::getAllGatewayAddress() as $address) { - if (!isset($gateway_data_list[$address])) { - $gateway_data_list[$address] = $gateway_data; - } - } - } - $data = static::getBufferFromSomeGateway($gateway_data_list); - } else { - $gateway_data['ext_data'] = json_encode($gateway_data['ext_data']); - $data = static::getBufferFromAllGateway($gateway_data); - } - - return $data; - } - - /** - * 生成验证包,用于验证此客户端的合法性 - * - * @return string - */ - protected static function generateAuthBuffer() - { - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_GATEWAY_CLIENT_CONNECT; - $gateway_data['body'] = json_encode(array( - 'secret_key' => static::$secretKey, - )); - return GatewayProtocol::encode($gateway_data); - } - - /** - * 批量向某些gateway发包,并得到返回数组 - * - * @param array $gateway_data_array - * @return array - * @throws Exception - */ - protected static function getBufferFromSomeGateway($gateway_data_array) - { - $gateway_buffer_array = array(); - $auth_buffer = static::$secretKey ? static::generateAuthBuffer() : ''; - foreach ($gateway_data_array as $address => $gateway_data) { - if ($auth_buffer) { - $gateway_buffer_array[$address] = $auth_buffer.GatewayProtocol::encode($gateway_data); - } else { - $gateway_buffer_array[$address] = GatewayProtocol::encode($gateway_data); - } - } - return static::getBufferFromGateway($gateway_buffer_array); - } - - /** - * 批量向所有 gateway 发包,并得到返回数组 - * - * @param string $gateway_data - * @return array - * @throws Exception - */ - protected static function getBufferFromAllGateway($gateway_data) - { - $addresses = static::getAllGatewayAddress(); - $gateway_buffer_array = array(); - $gateway_buffer = GatewayProtocol::encode($gateway_data); - $gateway_buffer = static::$secretKey ? static::generateAuthBuffer() . $gateway_buffer : $gateway_buffer; - foreach ($addresses as $address) { - $gateway_buffer_array[$address] = $gateway_buffer; - } - - return static::getBufferFromGateway($gateway_buffer_array); - } - - /** - * 获取所有gateway内部通讯地址 - * - * @return array - * @throws Exception - */ - protected static function getAllGatewayAddress() - { - if (isset(static::$businessWorker)) { - $addresses = static::$businessWorker->getAllGatewayAddresses(); - if (empty($addresses)) { - throw new Exception('businessWorker::getAllGatewayAddresses return empty'); - } - } else { - $addresses = static::getAllGatewayAddressesFromRegister(); - if (empty($addresses)) { - return array(); - } - } - return $addresses; - } - - /** - * 批量向gateway发送并获取数据 - * @param $gateway_buffer_array - * @return array - */ - protected static function getBufferFromGateway($gateway_buffer_array) - { - $client_array = $status_data = $client_address_map = $receive_buffer_array = $recv_length_array = array(); - // 批量向所有gateway进程发送请求数据 - foreach ($gateway_buffer_array as $address => $gateway_buffer) { - $client = stream_socket_client("tcp://$address", $errno, $errmsg, static::$connectTimeout); - if ($client && strlen($gateway_buffer) === stream_socket_sendto($client, $gateway_buffer)) { - $socket_id = (int)$client; - $client_array[$socket_id] = $client; - $client_address_map[$socket_id] = explode(':', $address); - $receive_buffer_array[$socket_id] = ''; - } - } - // 超时5秒 - $timeout = 5; - $time_start = microtime(true); - // 批量接收请求 - while (count($client_array) > 0) { - $write = $except = array(); - $read = $client_array; - if (@stream_select($read, $write, $except, $timeout)) { - foreach ($read as $client) { - $socket_id = (int)$client; - $buffer = stream_socket_recvfrom($client, 65535); - if ($buffer !== '' && $buffer !== false) { - $receive_buffer_array[$socket_id] .= $buffer; - $receive_length = strlen($receive_buffer_array[$socket_id]); - if (empty($recv_length_array[$socket_id]) && $receive_length >= 4) { - $recv_length_array[$socket_id] = current(unpack('N', $receive_buffer_array[$socket_id])); - } - if (!empty($recv_length_array[$socket_id]) && $receive_length >= $recv_length_array[$socket_id] + 4) { - unset($client_array[$socket_id]); - } - } elseif (feof($client)) { - unset($client_array[$socket_id]); - } - } - } - if (microtime(true) - $time_start > $timeout) { - break; - } - } - $format_buffer_array = array(); - foreach ($receive_buffer_array as $socket_id => $buffer) { - $local_ip = ip2long($client_address_map[$socket_id][0]); - $local_port = $client_address_map[$socket_id][1]; - $format_buffer_array[$local_ip][$local_port] = unserialize(substr($buffer, 4)); - } - return $format_buffer_array; - } - - /** - * 踢掉某个客户端,并以$message通知被踢掉客户端 - * - * @param string $client_id - * @param string $message - * @return void - */ - public static function closeClient($client_id, $message = null) - { - if ($client_id === Context::$client_id) { - return static::closeCurrentClient($message); - } // 不是发给当前用户则使用存储中的地址 - else { - $address_data = Context::clientIdToAddress($client_id); - if (!$address_data) { - return false; - } - $address = long2ip($address_data['local_ip']) . ":{$address_data['local_port']}"; - return static::kickAddress($address, $address_data['connection_id'], $message); - } - } - - /** - * 踢掉某个客户端并直接立即销毁相关连接 - * - * @param string $client_id - * @return bool - */ - public static function destoryClient($client_id) - { - if ($client_id === Context::$client_id) { - return static::destoryCurrentClient(); - } // 不是发给当前用户则使用存储中的地址 - else { - $address_data = Context::clientIdToAddress($client_id); - if (!$address_data) { - return false; - } - $address = long2ip($address_data['local_ip']) . ":{$address_data['local_port']}"; - return static::destroyAddress($address, $address_data['connection_id']); - } - } - - /** - * 踢掉当前客户端并直接立即销毁相关连接 - * - * @return bool - * @throws Exception - */ - public static function destoryCurrentClient() - { - if (!Context::$connection_id) { - throw new Exception('destoryCurrentClient can not be called in async context'); - } - $address = long2ip(Context::$local_ip) . ':' . Context::$local_port; - return static::destroyAddress($address, Context::$connection_id); - } - - /** - * 将 client_id 与 uid 绑定 - * - * @param string $client_id - * @param int|string $uid - * @return void - */ - public static function bindUid($client_id, $uid) - { - static::sendCmdAndMessageToClient($client_id, GatewayProtocol::CMD_BIND_UID, '', $uid); - } - - /** - * 将 client_id 与 uid 解除绑定 - * - * @param string $client_id - * @param int|string $uid - * @return void - */ - public static function unbindUid($client_id, $uid) - { - static::sendCmdAndMessageToClient($client_id, GatewayProtocol::CMD_UNBIND_UID, '', $uid); - } - - /** - * 将 client_id 加入组 - * - * @param string $client_id - * @param int|string $group - * @return void - */ - public static function joinGroup($client_id, $group) - { - - static::sendCmdAndMessageToClient($client_id, GatewayProtocol::CMD_JOIN_GROUP, '', $group); - } - - /** - * 将 client_id 离开组 - * - * @param string $client_id - * @param int|string $group - * - * @return void - */ - public static function leaveGroup($client_id, $group) - { - static::sendCmdAndMessageToClient($client_id, GatewayProtocol::CMD_LEAVE_GROUP, '', $group); - } - - /** - * 取消分组 - * - * @param int|string $group - * - * @return void - */ - public static function ungroup($group) - { - if (!static::isValidGroupId($group)) { - return false; - } - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_UNGROUP; - $gateway_data['ext_data'] = $group; - return static::sendToAllGateway($gateway_data); - - } - - /** - * 向所有 uid 发送 - * - * @param int|string|array $uid - * @param string $message - * - * @return void - */ - public static function sendToUid($uid, $message) - { - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_SEND_TO_UID; - $gateway_data['body'] = $message; - - if (!is_array($uid)) { - $uid = array($uid); - } - - $gateway_data['ext_data'] = json_encode($uid); - - static::sendToAllGateway($gateway_data); - } - - /** - * 向 group 发送 - * - * @param int|string|array $group 组(不允许是 0 '0' false null array()等为空的值) - * @param string $message 消息 - * @param array $exclude_client_id 不给这些client_id发 - * @param bool $raw 发送原始数据(即不调用gateway的协议的encode方法) - * - * @return void - */ - public static function sendToGroup($group, $message, $exclude_client_id = null, $raw = false) - { - if (!static::isValidGroupId($group)) { - return false; - } - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_SEND_TO_GROUP; - $gateway_data['body'] = $message; - if ($raw) { - $gateway_data['flag'] |= GatewayProtocol::FLAG_NOT_CALL_ENCODE; - } - - if (!is_array($group)) { - $group = array($group); - } - - // 分组发送,没有排除的client_id,直接发送 - $default_ext_data_buffer = json_encode(array('group'=> $group, 'exclude'=> null)); - if (empty($exclude_client_id)) { - $gateway_data['ext_data'] = $default_ext_data_buffer; - return static::sendToAllGateway($gateway_data); - } - - // 分组发送,有排除的client_id,需要将client_id转换成对应gateway进程内的connectionId - if (!is_array($exclude_client_id)) { - $exclude_client_id = array($exclude_client_id); - } - - $address_connection_array = static::clientIdArrayToAddressArray($exclude_client_id); - // 如果有businessWorker实例,说明运行在workerman环境中,通过businessWorker中的长连接发送数据 - if (static::$businessWorker) { - foreach (static::$businessWorker->gatewayConnections as $address => $gateway_connection) { - $gateway_data['ext_data'] = isset($address_connection_array[$address]) ? - json_encode(array('group'=> $group, 'exclude'=> $address_connection_array[$address])) : - $default_ext_data_buffer; - /** @var TcpConnection $gateway_connection */ - $gateway_connection->send($gateway_data); - } - } // 运行在其它环境中,通过注册中心得到gateway地址 - else { - $addresses = static::getAllGatewayAddressesFromRegister(); - foreach ($addresses as $address) { - $gateway_data['ext_data'] = isset($address_connection_array[$address]) ? - json_encode(array('group'=> $group, 'exclude'=> $address_connection_array[$address])) : - $default_ext_data_buffer; - static::sendToGateway($address, $gateway_data); - } - } - } - - /** - * 更新 session,框架自动调用,开发者不要调用 - * - * @param string $client_id - * @param string $session_str - * @return bool - */ - public static function setSocketSession($client_id, $session_str) - { - return static::sendCmdAndMessageToClient($client_id, GatewayProtocol::CMD_SET_SESSION, '', $session_str); - } - - /** - * 设置 session,原session值会被覆盖 - * - * @param string $client_id - * @param array $session - * - * @return void - */ - public static function setSession($client_id, array $session) - { - if (Context::$client_id === $client_id) { - $_SESSION = $session; - Context::$old_session = $_SESSION; - } - static::setSocketSession($client_id, Context::sessionEncode($session)); - } - - /** - * 更新 session,实际上是与老的session合并 - * - * @param string $client_id - * @param array $session - * - * @return void - */ - public static function updateSession($client_id, array $session) - { - if (Context::$client_id === $client_id) { - $_SESSION = array_replace_recursive((array)$_SESSION, $session); - Context::$old_session = $_SESSION; - } - static::sendCmdAndMessageToClient($client_id, GatewayProtocol::CMD_UPDATE_SESSION, '', Context::sessionEncode($session)); - } - - /** - * 获取某个client_id的session - * - * @param string $client_id - * @return mixed false表示出错、null表示用户不存在、array表示具体的session信息 - */ - public static function getSession($client_id) - { - $address_data = Context::clientIdToAddress($client_id); - if (!$address_data) { - return false; - } - $address = long2ip($address_data['local_ip']) . ":{$address_data['local_port']}"; - if (isset(static::$businessWorker)) { - if (!isset(static::$businessWorker->gatewayConnections[$address])) { - return null; - } - } - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_GET_SESSION_BY_CLIENT_ID; - $gateway_data['connection_id'] = $address_data['connection_id']; - return static::sendAndRecv($address, $gateway_data); - } - - /** - * 向某个用户网关发送命令和消息 - * - * @param string $client_id - * @param int $cmd - * @param string $message - * @param string $ext_data - * @return boolean - */ - protected static function sendCmdAndMessageToClient($client_id, $cmd, $message, $ext_data = '') - { - // 如果是发给当前用户则直接获取上下文中的地址 - if ($client_id === Context::$client_id || $client_id === null) { - $address = long2ip(Context::$local_ip) . ':' . Context::$local_port; - $connection_id = Context::$connection_id; - } else { - $address_data = Context::clientIdToAddress($client_id); - if (!$address_data) { - return false; - } - $address = long2ip($address_data['local_ip']) . ":{$address_data['local_port']}"; - $connection_id = $address_data['connection_id']; - } - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = $cmd; - $gateway_data['connection_id'] = $connection_id; - $gateway_data['body'] = $message; - if (!empty($ext_data)) { - $gateway_data['ext_data'] = $ext_data; - } - - return static::sendToGateway($address, $gateway_data); - } - - /** - * 发送数据并返回 - * - * @param int $address - * @param mixed $data - * @return bool - * @throws Exception - */ - protected static function sendAndRecv($address, $data) - { - $buffer = GatewayProtocol::encode($data); - $buffer = static::$secretKey ? static::generateAuthBuffer() . $buffer : $buffer; - $client = stream_socket_client("tcp://$address", $errno, $errmsg, static::$connectTimeout); - if (!$client) { - throw new Exception("can not connect to tcp://$address $errmsg"); - } - if (strlen($buffer) === stream_socket_sendto($client, $buffer)) { - $timeout = 5; - // 阻塞读 - stream_set_blocking($client, 1); - // 1秒超时 - stream_set_timeout($client, 1); - $all_buffer = ''; - $time_start = microtime(true); - $pack_len = 0; - while (1) { - $buf = stream_socket_recvfrom($client, 655350); - if ($buf !== '' && $buf !== false) { - $all_buffer .= $buf; - } else { - if (feof($client)) { - throw new Exception("connection close tcp://$address"); - } elseif (microtime(true) - $time_start > $timeout) { - break; - } - continue; - } - $recv_len = strlen($all_buffer); - if (!$pack_len && $recv_len >= 4) { - $pack_len= current(unpack('N', $all_buffer)); - } - // 回复的数据都是以\n结尾 - if (($pack_len && $recv_len >= $pack_len + 4) || microtime(true) - $time_start > $timeout) { - break; - } - } - // 返回结果 - return unserialize(substr($all_buffer, 4)); - } else { - throw new Exception("sendAndRecv($address, \$bufer) fail ! Can not send data!", 502); - } - } - - /** - * 发送数据到网关 - * - * @param string $address - * @param array $gateway_data - * @return bool - */ - protected static function sendToGateway($address, $gateway_data) - { - return static::sendBufferToGateway($address, GatewayProtocol::encode($gateway_data)); - } - - /** - * 发送buffer数据到网关 - * @param string $address - * @param string $gateway_buffer - * @return bool - */ - protected static function sendBufferToGateway($address, $gateway_buffer) - { - // 有$businessWorker说明是workerman环境,使用$businessWorker发送数据 - if (static::$businessWorker) { - if (!isset(static::$businessWorker->gatewayConnections[$address])) { - return false; - } - return static::$businessWorker->gatewayConnections[$address]->send($gateway_buffer, true); - } - // 非workerman环境 - $gateway_buffer = static::$secretKey ? static::generateAuthBuffer() . $gateway_buffer : $gateway_buffer; - $flag = static::$persistentConnection ? STREAM_CLIENT_PERSISTENT | STREAM_CLIENT_CONNECT : STREAM_CLIENT_CONNECT; - $client = stream_socket_client("tcp://$address", $errno, $errmsg, static::$connectTimeout, $flag); - return strlen($gateway_buffer) == stream_socket_sendto($client, $gateway_buffer); - } - - /** - * 向所有 gateway 发送数据 - * - * @param string $gateway_data - * @throws Exception - * - * @return void - */ - protected static function sendToAllGateway($gateway_data) - { - $buffer = GatewayProtocol::encode($gateway_data); - // 如果有businessWorker实例,说明运行在workerman环境中,通过businessWorker中的长连接发送数据 - if (static::$businessWorker) { - foreach (static::$businessWorker->gatewayConnections as $gateway_connection) { - /** @var TcpConnection $gateway_connection */ - $gateway_connection->send($buffer, true); - } - } // 运行在其它环境中,通过注册中心得到gateway地址 - else { - $all_addresses = static::getAllGatewayAddressesFromRegister(); - foreach ($all_addresses as $address) { - static::sendBufferToGateway($address, $buffer); - } - } - } - - /** - * 踢掉某个网关的 socket - * - * @param string $address - * @param int $connection_id - * @return bool - */ - protected static function kickAddress($address, $connection_id, $message) - { - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_KICK; - $gateway_data['connection_id'] = $connection_id; - $gateway_data['body'] = $message; - return static::sendToGateway($address, $gateway_data); - } - - /** - * 销毁某个网关的 socket - * - * @param string $address - * @param int $connection_id - * @return bool - */ - protected static function destroyAddress($address, $connection_id) - { - $gateway_data = GatewayProtocol::$empty; - $gateway_data['cmd'] = GatewayProtocol::CMD_DESTROY; - $gateway_data['connection_id'] = $connection_id; - return static::sendToGateway($address, $gateway_data); - } - - /** - * 将clientid数组转换成address数组 - * - * @param array $client_id_array - * @return array - */ - protected static function clientIdArrayToAddressArray(array $client_id_array) - { - $address_connection_array = array(); - foreach ($client_id_array as $client_id) { - $address_data = Context::clientIdToAddress($client_id); - if ($address_data) { - $address = long2ip($address_data['local_ip']) . - ":{$address_data['local_port']}"; - $address_connection_array[$address][$address_data['connection_id']] = $address_data['connection_id']; - } - } - return $address_connection_array; - } - - /** - * 设置 gateway 实例 - * - * @param \GatewayWorker\BusinessWorker $business_worker_instance - */ - public static function setBusinessWorker($business_worker_instance) - { - static::$businessWorker = $business_worker_instance; - } - - /** - * 获取通过注册中心获取所有 gateway 通讯地址 - * - * @return array - * @throws Exception - */ - protected static function getAllGatewayAddressesFromRegister() - { - static $addresses_cache, $last_update; - if (static::$addressesCacheDisable) { - $addresses_cache = null; - } - $time_now = time(); - $expiration_time = 1; - $register_addresses = (array)static::$registerAddress; - $client = null; - if(empty($addresses_cache) || $time_now - $last_update > $expiration_time) { - foreach ($register_addresses as $register_address) { - set_error_handler(function(){}); - $client = stream_socket_client('tcp://' . $register_address, $errno, $errmsg, static::$connectTimeout); - restore_error_handler(); - if ($client) { - break; - } - } - if (!$client) { - throw new Exception('Can not connect to tcp://' . $register_address . ' ' . $errmsg); - } - - fwrite($client, '{"event":"worker_connect","secret_key":"' . static::$secretKey . '"}' . "\n"); - stream_set_timeout($client, 5); - $ret = fgets($client, 655350); - if (!$ret || !$data = json_decode(trim($ret), true)) { - throw new Exception('getAllGatewayAddressesFromRegister fail. tcp://' . - $register_address . ' return ' . var_export($ret, true)); - } - $last_update = $time_now; - $addresses_cache = $data['addresses']; - } - if (!$addresses_cache) { - throw new Exception('Gateway::getAllGatewayAddressesFromRegister() with registerAddress:' . - json_encode(static::$registerAddress) . ' return ' . var_export($addresses_cache, true)); - } - return $addresses_cache; - } - - /** - * 检查群组id是否合法 - * - * @param $group - * @return bool - */ - protected static function isValidGroupId($group) - { - if (empty($group)) { - echo new \Exception('group('.var_export($group, true).') empty'); - return false; - } - return true; - } -} - - -/** - * 上下文 包含当前用户uid, 内部通信local_ip local_port socket_id ,以及客户端client_ip client_port - */ -class Context -{ - /** - * 内部通讯id - * @var string - */ - public static $local_ip; - /** - * 内部通讯端口 - * @var int - */ - public static $local_port; - /** - * 客户端ip - * @var string - */ - public static $client_ip; - /** - * 客户端端口 - * @var int - */ - public static $client_port; - /** - * client_id - * @var string - */ - public static $client_id; - /** - * 连接connection->id - * @var int - */ - public static $connection_id; - - /** - * 旧的session - * - * @var string - */ - public static $old_session; - - /** - * 编码session - * @param mixed $session_data - * @return string - */ - public static function sessionEncode($session_data = '') - { - if($session_data !== '') - { - return serialize($session_data); - } - return ''; - } - - /** - * 解码session - * @param string $session_buffer - * @return mixed - */ - public static function sessionDecode($session_buffer) - { - return unserialize($session_buffer); - } - - /** - * 清除上下文 - * @return void - */ - public static function clear() - { - static::$local_ip = static::$local_port = static::$client_ip = static::$client_port = - static::$client_id = static::$connection_id = static::$old_session = null; - } - - /** - * 通讯地址到client_id的转换 - * @return string - */ - public static function addressToClientId($local_ip, $local_port, $connection_id) - { - return bin2hex(pack('NnN', $local_ip, $local_port, $connection_id)); - } - - /** - * client_id到通讯地址的转换 - * @return array - */ - public static function clientIdToAddress($client_id) - { - if(strlen($client_id) !== 20) - { - throw new \Exception("client_id $client_id is invalid"); - } - return unpack('Nlocal_ip/nlocal_port/Nconnection_id' ,pack('H*', $client_id)); - } - -} - - -/** - * Gateway 与 Worker 间通讯的二进制协议 - * - * struct GatewayProtocol - * { - * unsigned int pack_len, - * unsigned char cmd,//命令字 - * unsigned int local_ip, - * unsigned short local_port, - * unsigned int client_ip, - * unsigned short client_port, - * unsigned int connection_id, - * unsigned char flag, - * unsigned short gateway_port, - * unsigned int ext_len, - * char[ext_len] ext_data, - * char[pack_length-HEAD_LEN] body//包体 - * } - * NCNnNnNCnN - */ -class GatewayProtocol -{ - // 发给worker,gateway有一个新的连接 - const CMD_ON_CONNECT = 1; - // 发给worker的,客户端有消息 - const CMD_ON_MESSAGE = 3; - // 发给worker上的关闭链接事件 - const CMD_ON_CLOSE = 4; - // 发给gateway的向单个用户发送数据 - const CMD_SEND_TO_ONE = 5; - // 发给gateway的向所有用户发送数据 - const CMD_SEND_TO_ALL = 6; - // 发给gateway的踢出用户 - // 1、如果有待发消息,将在发送完后立即销毁用户连接 - // 2、如果无待发消息,将立即销毁用户连接 - const CMD_KICK = 7; - // 发给gateway的立即销毁用户连接 - const CMD_DESTROY = 8; - // 发给gateway,通知用户session更新 - const CMD_UPDATE_SESSION = 9; - // 获取在线状态 - const CMD_GET_ALL_CLIENT_SESSIONS = 10; - // 判断是否在线 - const CMD_IS_ONLINE = 11; - // client_id绑定到uid - const CMD_BIND_UID = 12; - // 解绑 - const CMD_UNBIND_UID = 13; - // 向uid发送数据 - const CMD_SEND_TO_UID = 14; - // 根据uid获取绑定的clientid - const CMD_GET_CLIENT_ID_BY_UID = 15; - // 加入组 - const CMD_JOIN_GROUP = 20; - // 离开组 - const CMD_LEAVE_GROUP = 21; - // 向组成员发消息 - const CMD_SEND_TO_GROUP = 22; - // 获取组成员 - const CMD_GET_CLIENT_SESSIONS_BY_GROUP = 23; - // 获取组在线连接数 - const CMD_GET_CLIENT_COUNT_BY_GROUP = 24; - // 按照条件查找 - const CMD_SELECT = 25; - // 获取在线的群组ID - const CMD_GET_GROUP_ID_LIST = 26; - // 取消分组 - const CMD_UNGROUP = 27; - // worker连接gateway事件 - const CMD_WORKER_CONNECT = 200; - // 心跳 - const CMD_PING = 201; - // GatewayClient连接gateway事件 - const CMD_GATEWAY_CLIENT_CONNECT = 202; - // 根据client_id获取session - const CMD_GET_SESSION_BY_CLIENT_ID = 203; - // 发给gateway,覆盖session - const CMD_SET_SESSION = 204; - // 当websocket握手时触发,只有websocket协议支持此命令字 - const CMD_ON_WEBSOCKET_CONNECT = 205; - // 包体是标量 - const FLAG_BODY_IS_SCALAR = 0x01; - // 通知gateway在send时不调用协议encode方法,在广播组播时提升性能 - const FLAG_NOT_CALL_ENCODE = 0x02; - /** - * 包头长度 - * - * @var int - */ - const HEAD_LEN = 28; - public static $empty = array( - 'cmd' => 0, - 'local_ip' => 0, - 'local_port' => 0, - 'client_ip' => 0, - 'client_port' => 0, - 'connection_id' => 0, - 'flag' => 0, - 'gateway_port' => 0, - 'ext_data' => '', - 'body' => '', - ); - /** - * 返回包长度 - * - * @param string $buffer - * @return int return current package length - */ - public static function input($buffer) - { - if (strlen($buffer) < self::HEAD_LEN) { - return 0; - } - $data = unpack("Npack_len", $buffer); - return $data['pack_len']; - } - /** - * 获取整个包的 buffer - * - * @param mixed $data - * @return string - */ - public static function encode($data) - { - $flag = (int)is_scalar($data['body']); - if (!$flag) { - $data['body'] = serialize($data['body']); - } - $data['flag'] |= $flag; - $ext_len = strlen($data['ext_data']); - $package_len = self::HEAD_LEN + $ext_len + strlen($data['body']); - return pack("NCNnNnNCnN", $package_len, - $data['cmd'], $data['local_ip'], - $data['local_port'], $data['client_ip'], - $data['client_port'], $data['connection_id'], - $data['flag'], $data['gateway_port'], - $ext_len) . $data['ext_data'] . $data['body']; - } - /** - * 从二进制数据转换为数组 - * - * @param string $buffer - * @return array - */ - public static function decode($buffer) - { - $data = unpack("Npack_len/Ccmd/Nlocal_ip/nlocal_port/Nclient_ip/nclient_port/Nconnection_id/Cflag/ngateway_port/Next_len", - $buffer); - if ($data['ext_len'] > 0) { - $data['ext_data'] = substr($buffer, self::HEAD_LEN, $data['ext_len']); - if ($data['flag'] & self::FLAG_BODY_IS_SCALAR) { - $data['body'] = substr($buffer, self::HEAD_LEN + $data['ext_len']); - } else { - $data['body'] = unserialize(substr($buffer, self::HEAD_LEN + $data['ext_len'])); - } - } else { - $data['ext_data'] = ''; - if ($data['flag'] & self::FLAG_BODY_IS_SCALAR) { - $data['body'] = substr($buffer, self::HEAD_LEN); - } else { - $data['body'] = unserialize(substr($buffer, self::HEAD_LEN)); - } - } - return $data; - } -} diff --git a/api/app/GatewayClient/MIT-LICENSE.txt b/api/app/GatewayClient/MIT-LICENSE.txt deleted file mode 100644 index fd6b1c83..00000000 --- a/api/app/GatewayClient/MIT-LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License - -Copyright (c) 2009-2015 walkor and contributors (see https://github.com/walkor/workerman/contributors) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/api/app/GatewayClient/README.md b/api/app/GatewayClient/README.md deleted file mode 100644 index 50aa1713..00000000 --- a/api/app/GatewayClient/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# GatewayClient - -GatewayWorker1.0请使用[1.0版本的GatewayClient](https://github.com/walkor/GatewayClient/releases/tag/v1.0) - -GatewayWorker2.0.1-2.0.4请使用[2.0.4版本的GatewayClient](https://github.com/walkor/GatewayClient/releases/tag/2.0.4) - -GatewayWorker2.0.5-2.0.6版本请使用[2.0.6版本的GatewayClient](https://github.com/walkor/GatewayClient/releases/tag/2.0.6) - -GatewayWorker2.0.7版本请使用 [2.0.7版本的GatewayClient](https://github.com/walkor/GatewayClient/releases/tag/v2.0.7) - -GatewayWorker3.0.0-3.0.7版本请使用 [3.0.0版本的GatewayClient](https://github.com/walkor/GatewayClient/releases/tag/v3.0.0)
- -GatewayWorker3.0.8及以上版本请使用 [3.0.13版本的GatewayClient](https://github.com/walkor/GatewayClient/releases/tag/v3.0.13)
- -注意:GatewayClient3.0.0以后支持composer并加了命名空间```GatewayClient```
- -[如何查看GatewayWorker版本请点击这里](http://doc2.workerman.net/get-gateway-version.html) - -## 安装 -**方法一** -``` -composer require workerman/gatewayclient -``` -使用时引入`vendor/autoload.php` 类似如下: -```php -use GatewayClient\Gateway; -require_once '真实路径/vendor/autoload.php'; -``` - -**方法二** -下载源文件到任意目录,手动引入 `GatewayClient/Gateway.php`, 类似如下: -```php -use GatewayClient\Gateway; -require_once '真实路径/GatewayClient/Gateway.php'; -``` - -## 使用 -```php -// GatewayClient 3.0.0版本以后加了命名空间 -use GatewayClient\Gateway; - -// composer安装 -require_once '真实路径/vendor/autoload.php'; - -// 源文件引用 -//require_once '真实路径/GatewayClient/Gateway.php'; - -/** - * === 指定registerAddress表明与哪个GatewayWorker(集群)通讯。=== - * GatewayWorker里用Register服务来区分集群,即一个GatewayWorker(集群)只有一个Register服务, - * GatewayClient要与之通讯必须知道这个Register服务地址才能通讯,这个地址格式为 ip:端口 , - * 其中ip为Register服务运行的ip(如果GatewayWorker是单机部署则ip就是运行GatewayWorker的服务器ip), - * 端口是对应ip的服务器上start_register.php文件中监听的端口,也就是GatewayWorker启动时看到的Register的端口。 - * GatewayClient要想推送数据给客户端,必须知道客户端位于哪个GatewayWorker(集群), - * 然后去连这个GatewayWorker(集群)Register服务的 ip:端口,才能与对应GatewayWorker(集群)通讯。 - * 这个 ip:端口 在GatewayClient一侧使用 Gateway::$registerAddress 来指定。 - * - * === 如果GatewayClient和GatewayWorker不在同一台服务器需要以下步骤 === - * 1、需要设置start_gateway.php中的lanIp为实际的本机内网ip(如不在一个局域网也可以设置成外网ip),设置完后要重启GatewayWorker - * 2、GatewayClient这里的Gateway::$registerAddress的ip填写填写上面步骤1lanIp所指定的ip,端口 - * 3、需要开启GatewayWorker所在服务器的防火墙,让以下端口可以被GatewayClient所在服务器访问, - * 端口包括Rgister服务的端口以及start_gateway.php中lanIp与startPort指定的几个端口 - * - * === 如果GatewayClient和GatewayWorker在同一台服务器 === - * GatewayClient和Register服务都在一台服务器上,ip填写127.0.0.1及即可,无需其它设置。 - **/ -Gateway::$registerAddress = '127.0.0.1:1236'; - -// GatewayClient支持GatewayWorker中的所有接口(Gateway::closeCurrentClient Gateway::sendToCurrentClient除外) -Gateway::sendToAll($data); -Gateway::sendToClient($client_id, $data); -Gateway::closeClient($client_id); -Gateway::isOnline($client_id); -Gateway::bindUid($client_id, $uid); -Gateway::isUidOnline($uid); -Gateway::getClientIdByUid($uid); -Gateway::unbindUid($client_id, $uid); -Gateway::sendToUid($uid, $dat); -Gateway::joinGroup($client_id, $group); -Gateway::sendToGroup($group, $data); -Gateway::leaveGroup($client_id, $group); -Gateway::getClientCountByGroup($group); -Gateway::getClientSessionsByGroup($group); -Gateway::getAllClientCount(); -Gateway::getAllClientSessions(); -Gateway::setSession($client_id, $session); -Gateway::updateSession($client_id, $session); -Gateway::getSession($client_id); -``` - diff --git a/api/app/GatewayClient/composer.json b/api/app/GatewayClient/composer.json deleted file mode 100644 index c8fd2386..00000000 --- a/api/app/GatewayClient/composer.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name" : "workerman/gatewayclient", - "type" : "library", - "homepage": "http://www.workerman.net", - "license" : "MIT", - "autoload": { - "psr-4": {"GatewayClient\\": "./"} - } -} diff --git a/api/app/GatewayClient/use.php b/api/app/GatewayClient/use.php deleted file mode 100644 index edf39e4c..00000000 --- a/api/app/GatewayClient/use.php +++ /dev/null @@ -1,59 +0,0 @@ - "nickname", - "登陆名" => "email", - "电话号码" => "phone", - "角色" => "roles" - ]; - protected $model='App\Models\Admin'; - protected $resource = ''; // 显示个体资源 - protected $resourceCollection = ''; // 显示资源集合 - - /** - * 管理员列表. - * - * @return \Illuminate\Http\Response - */ - public function index(Request $request) - { - // - $page = $request->input('page', 1); - $pageSize = $request->input('pageSize', 10); - $data = Admin::Email()->Phone()->paginate($pageSize); - return new AdminCollection($data); - - } - - /** - * 新建管理员 - * @bodyParam email string required 登陆名 - * @bodyParam password string required 密码 - * @bodyParam password_confirmation string required 确认密码 - * @bodyParam avatar string optional 头像 - * @bodyParam phone string optional 手机号码 - * @bodyParam roles array optional 角色(数组,内容为数字) - */ - public function store(Request $request) - { - // - $data = $request->only($this->fillable); - if (!is_bool($result = $this->validateStore($data))){ - return $this->errorWithInfo($result, 422); - } - - $roles = $data['roles']; - unset($data['roles']); - unset($data['password_confirmation']); - $data['password'] = bcrypt($data['password']); - DB::transaction(function() use($data, $roles){ - $data['created_at'] = Carbon::now(); - $id = DB::table('admins')->insertGetId($data); - $result = []; - foreach ($roles as $v) { - $result [] = [ - 'admin_id' => $id, - 'role_id' => $v, - 'created_at' => Carbon::now() - ]; - } - DB::table('admin_roles')->insert($result); - }); - return $this->successWithInfo('新增用户信息成功', 201); - } - - /** - * 管理员详情 - * @param $id - */ - public function show($id) - { - $admin = Admin::find($id); - return new \App\Http\Resources\Admin($admin); - } - - - /** - * 修改管理员信息 - * @bodyParam action string required 需要执行的动作(修改密码,修改个人信息,修改状态) - * @bodyParam nickname string optional 用户昵称 - * @bodyParam avatar string optional 用户头像 - * @bodyParam roles array required 用户角色 - * - */ - public function update(Request $request, $id) - { - // - $action = $request->input('action', 'update'); - switch ($action) { - case 'update': - $data = $request->only(['nickname', 'phone', 'roles', 'avatar']); - if (!is_bool($result = $this->validateUpdate($data, $id))){ - return $this->errorWithInfo($result, 422); - } - $roles =$data['roles']; - unset($data['roles']); - $avatar = $data['avatar']; - $oldAvatar = $this->model::find($id)->avatar; - if ($avatar !== $oldAvatar && !empty($oldAvatar)) { - // 删除旧的头像文件 http://lv6.test//storage/axS9bUx4LkOFqwFmmfB5f2TRJBXWGmX4neGMR7RR.png - $this->deleteAvatar($oldAvatar); - } - DB::transaction(function() use($data, $roles, $id){ - DB::table('admins')->where('id', $id)->update([ - 'nickname' => $data['nickname'], - 'avatar' => $data['avatar'], - 'phone' => $data['phone'], - 'updated_at' => Carbon::now() - ]); - // 同步角色ID信息 - // $roles 是现在读取的角色id - // $existRoles 指的是现在已经有的角色id - $existRoles = DB::table('admin_roles')->where('admin_id', $id)->pluck('role_id')->toArray(); - // 添加 - $tmp1 = array_diff($roles, $existRoles); // 需要增加的 - $result = []; - foreach ($tmp1 as $v) { - $result [] = [ - 'role_id' => $v, - 'admin_id' => $id, - 'created_at' => Carbon::now() - ]; - } - DB::table('admin_roles')->insert($result); - // 删除 - $tmp2 = array_diff($existRoles, $roles); // 需要删除的 - DB::table('admin_roles')->whereIn('role_id', $tmp2)->where('admin_id', $id)->delete(); - }); - return $this->successWithInfo('用户信息修改完成'); - break; - case 'status': - $status = $request->input('status'); - if (in_array($status, [0,1])) { - DB::table('admins')->where('id', $id)->update([ - 'status' => $status - ]); - } else { - return $this->errorWithInfo('必须填写状态标识', 422); - } - return $this->successWithInfo('用户状态修改完成'); - break; - case 'reset': - $pwd = $request->input('password'); - if ($pwd){ - DB::table('admins')->where('id', $id)->update([ - 'password' => bcrypt($pwd) - ]); - } else { - return $this->errorWithInfo( '必须填写密码' , 422); - } - return $this->successWithInfo('用户密码修改完成'); - break; - } - } - - public function export() - { - - } - - public function import() - { - $action = request()->input("action", "import"); - switch ($action) { - case 'download': - $result = []; - $result [] = [ - "昵称" => "xpyzwm", - "登录名" => "xpyzwm", - "密码" => "123456", - "电话号码" => "13577728948", - "角色" => 'user' - ]; - $list = collect($result); - // 直接下载 - return (FastExcel::data($list))->download('template.xlsx'); - break; - case 'import': - $error = []; // 错误的具体信息 - $isError = false; // 是否存在信息错误 - $successCount = 0; // 统计数据导入成功的条数 - $errorCount = 0; // 出错的条数 - $arr = []; // 正确的内容存储之后,返回数据 - $file = request()->file('file'); - if ($file->isValid()) { - $collection = FastExcel::import($file); - $arrData = $collection->toArray(); - $roleData = DB::table('roles')->select("id", "name")->get(); - foreach ($arrData as $k => $item){ - $arrRoles = explode(',', $item["角色"]); - $roles = []; - foreach ($arrRoles as $v) { - $role = $roleData->first(function ($value) use ($v) { - return $value->name === $v; - }); - $roles[] = $role->id; - } - $data = [ - 'nickname' => $item['昵称'], - 'email' => $item["登录名"], - "phone" => (string)$item["电话号码"], - "password" => $item["密码"], - "password_confirmation" => $item["密码"], - "roles" => $roles - ]; - if (method_exists($this, 'message')){ - $validator = Validator::make($data,$this->storeRule(),$this->message()); - } else { - $validator = Validator::make($data,$this->storeRule()); - } - if ($validator->fails()){ - // 获取相关的错误信息,并且把错误信息单独存放 - $errors = $validator->errors($validator); - $tips = ''; - foreach ($errors->all() as $message){ - $tips .= $message.','; - } - $tips = substr($tips,0,strlen($tips)-1); - // 状态信息 - $item['错误原因'] = $tips; - $error[] = $item; - $isError = true; - $errorCount ++; - } else { - // 没有出错的,我们先存在正确的数组 - $arr [] = $data; - DB::transaction(function() use($data){ - $data['created_at'] = Carbon::now(); - $data['password'] = bcrypt($data['password']); - $roles = $data['roles']; - unset($data['roles']); // 角色不用于管理员表 - unset($data['password_confirmation']); // 密码确认不需要 - if (empty($data['phone'])) { // 电话号码为空,则不能添加进入数据库 - unset($data['phone']); - } - $admin_id = DB::table('admins')->insertGetId($data); - $tmp = []; - foreach ($roles as $v) { - $tmp [] = [ - 'admin_id' => $admin_id, - 'role_id' => $v, - 'created_at' => Carbon::now() - ]; - } - DB::table('admin_roles')->insert($tmp); - }); - $successCount ++; - } - } - $tips = '当前操作导入数据成功' . $successCount . '条'; - if ($isError) { - // 有失败的数据,无法插入,要显示出来,让前端能下载 - $file = time() . '.xlsx'; - $domains = getDomain(); - $fileName = public_path('xls') . '\\' . $file; - $file = $domains."xls\\" . $file; - $data = collect($error); - FastExcel::data($data)->export($fileName); - $tips .= ',失败' . $errorCount . '条'; - return response()->json([ - 'info' => $tips, - 'fileName' => $file, - 'status' => 'error', - 'status_code' => 422 - ], 422); - } else { - return $this->successWithInfo($tips, 201); - } - } - break; - } - } - - /** - * 修改管理员的个人信息 - * @bodyParam action string required 动作(update=>指修改个人信息, update-avatr=>指修改头像和个人信息,reset=>修改密码) - */ - public function modify(Request $request) - { - $action = $request->input('action', 'update'); - switch ($action) { - // 修改个人密码,需要提供原来密码和现在准备修改的密码 - case "reset": - $data = $request->only(['old_password', 'password', 'password_confirmation']); - $old_password = $request->input('old_password'); - $password = $request->input('password'); - $password_confirmation = $request->input('password_confirmation'); - $validator = Validator::make($data, [ - 'old_password' => "required|string|min:6|max:20", - 'password' => "required|string|min:6|max:20|confirmed", - ], [ - 'old_password.required' => '原密码必须填写', - 'password.required' => '新密码必须填写', - 'password.min' => '新密码的长度不小于6字符', - 'password.max' => '新密码的长度不大于20字符', - 'password.confirmed' => '确认密码和新密码必须相同', - ]); - if ($validator->fails()) { - $info = $this->getErrorInfo($validator); - return $this->errorWithInfo($info, 422); - } - $id = Auth::guard('api')->id(); - $user = Admin::find($id); - $pwd = $user->password; - if (Hash::check($old_password, $pwd)){ // 老密码相等才会修改 - DB::table('admins')->where('id', $id)->update([ - 'password' => bcrypt($password), - 'updated_at' => Carbon::now() - ]); - return $this->successWithInfo("用户密码修改成功"); - } else { - return $this->errorWithInfo("你提供的旧密码与原来的不相等,无法修改", 422); - } - break; - case "update-avatar": - $file = $request->file('file'); - if ($file->isValid()) { - $avatar = $this->receiveFile(); - $data = $request->only(["phone", "nickname"]); - $validator = Validator::make($data, [ - 'phone' => "nullable|string|size:11", - ], [ - 'phone.size' => '电话号码的长度必须为11位', - ]); - if ($validator->fails()) { - $info = $this->getErrorInfo($validator); - return $this->errorWithInfo($info, 422); - } - if (empty($data['phone'])) { - unset($data['phone']); - } - $data['avatar'] = $avatar; - $data['updated_at'] = Carbon::now(); - $id = Auth::guard('api')->id(); - $oldAvatar = $this->model::find($id)->avatar; - if ($avatar !== $oldAvatar && !empty($oldAvatar)) { - // 删除旧的头像文件 http://lv6.test//storage/axS9bUx4LkOFqwFmmfB5f2TRJBXWGmX4neGMR7RR.png - $this->deleteAvatar($oldAvatar); - } - DB::table('admins')->where('id', $id)->update($data); - return $this->successWithInfo("用户信息修改成功"); - } else { - return $this->errorWithInfo('上传文件失败,估计是文件太大,上传超时', 400); - } - break; - // 默认不包括上传文件,只传数据 - default: - $data = $request->only(["phone", "nickname"]); - $validator = Validator::make($data, [ - 'phone' => "nullable|string|size:11", - ], [ - 'phone.size' => '电话号码的长度必须为11位', - ]); - if ($validator->fails()) { - $info = $this->getErrorInfo($validator); - return $this->errorWithInfo($info, 422); - } - if (empty($data['phone'])) { - unset($data['phone']); - } - $id = Auth::guard('api')->id();; - $data['updated_at'] = Carbon::now(); - DB::table('admins')->where('id', $id)->update($data); - return $this->successWithInfo("用户信息修改成功"); - } - } - - /** - * 删除管理员 - * - * @param int $id - * @return \Illuminate\Http\Response - */ - public function destroy($id) - { - // - DB::transaction(function() use($id){ - // 删除对应的用户角色信息 - DB::table('admin_roles')->where('admin_id', $id)->delete(); - DB::table('admins')->where('id', $id)->delete(); - }); - return $this->successWithInfo('管理员信息删除成功'); - } - - protected function getErrorInfo($validator) - { - $errors = $validator->errors($validator); - $tips = ''; - foreach ($errors->all() as $message){ - $tips .= $message.','; - } - $tips = substr($tips,0,strlen($tips)-1); - return $tips; - } - - protected function updateRule($id) - { - return [ - 'roles' => 'required|array', - 'phone' => [ - 'nullable', - 'size:11', - Rule::unique('admins')->ignore($id) - ] - ]; - } - - protected function storeRule() - { - return [ - 'email' => 'required|unique:admins', - 'password' => 'required|confirmed', - 'phone' => 'sometimes|nullable|string|size:11|unique:admins', - 'roles' => 'required|array' - ]; - } - - public function message() - { - return [ - 'email.required' => '登陆名必须填写', - 'email.unique' => '登录名不能重复', - 'password.required' => '密码必须填写', - 'password.confirmed' => '两次输入的密码必须一致', - - 'phone.size' => '电话号码长度必须为11位', - 'phone.unique' => '电话号码不能重复', - 'roles.required' => '必须选择用户角色', - ]; - } - -} diff --git a/api/app/Http/Controllers/Admin/AdminPermissionController.php b/api/app/Http/Controllers/Admin/AdminPermissionController.php deleted file mode 100644 index 529694ff..00000000 --- a/api/app/Http/Controllers/Admin/AdminPermissionController.php +++ /dev/null @@ -1,85 +0,0 @@ -input('pageSize', 10); - return $this->getListData($pageSize); - } - - protected function getListData($pageSize){ - // 当前列表数据 对应于原来的index - $data = $this->model::paginate($pageSize); - return new $this->resourceCollection($data); - } - - - public function show($id){ - $data = $this->model::find($id); - return new $this->resource($data); - } - - public function store(Request $request) - { -// 1. 获取前端数据 - - $data = $request->only($this->fillable); -// 2. 验证数据 - if (method_exists($this, 'message')){ - $validator = Validator::make($data, $this->storeRule(), $this->message()); - } else { - $validator = Validator::make($data, $this->storeRule()); - } - - if ($validator->fails()){ - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } -// 3.数据无误,进一步处理后保存到数据表里面,有的表需要处理,有的不需要 - $data = $this->storeHandle($data); - if ($this->model::create($data)) { - return $this->successWithInfo('新增数据成功', 201); - } else { - return $this->error(); - } - } - - - protected function storeHandle($data) - { - return $data; // TODO: Change the autogenerated stub - } - - protected function getErrorInfo($validator) - { - $errors = $validator->errors(); - $errorTips = ''; - foreach($errors->all() as $message){ - $errorTips = $errorTips.$message.','; - } - $errorTips = substr($errorTips, 0, strlen($errorTips)-1); - return $errorTips; - } - - - public function update(Request $request, $id) - { - $data = $request->only($this->fillable); - $action = $request->input('action', 'default'); - - if ($action === 'status') { - if ($this->model::where('id', $id)->update([ - 'status' => $data['status'] - ])){ - return $this->successWithInfo('文章类型状态更新成功'); - } else { - return $this->errorWithInfo('文章类型状态更新失败'); - } - } - if (method_exists($this, 'message')){ - $validator = Validator::make($data, $this->updateRule($id), $this->message()); - } else { - $validator = Validator::make($data, $this->updateRule($id)); - } - if ($validator->fails()){ - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } - if ($action === 'default') { - // 进一步处理数据 - $data = $this->updateHandle($data); - // 更新到数据表 - if ($this->model::where('id', $id)->update($data)){ - return $this->successWithInfo('数据更新成功'); - } else { - return $this->errorWithInfo('数据更新失败'); - } - } - - - - - } - - protected function updateHandle($data){ - return $data; - } - - public function destroy($id) - { - $isSuccess = false; - DB::transaction(function() use(&$isSuccess, $id) { - $this->model::destroy($id); - $isSuccess = true; - }); - - if ($isSuccess){ - return $this->successWithInfo('数据删除成功', 200); - } else { - return $this->errorWithInfo('数据删除失败,请查看指定的数据是否存在'); - } - } - - protected function destroyHandle($id) { - DB::transaction(function () use($id) { - // 删除逻辑 注意多表关联的情况 - $this->model::where('id', $id)->delete(); - }); - return true; - } - public function deleteAll() - { - // 前端利用json格式传递数据 - $ids = json_decode(request()->input('ids'),true); - foreach ($ids as $id) { - $this->destoryHandle($id); - } - return $this->successWithInfo('批量删除数据成功', 204); - } - - - - public function export() - { - $data = $this->model::all(); - $data = $data->toArray(); - $arr = $this->exportHandle($data); - $data = collect($arr); - $fileName = time().'.xlsx'; - $file = 'xls\\'.$fileName; - (new FastExcel($data))->export($file); - return $this->successWithInfo($file); - } - - protected function exportHandle($arrData){ - // 默认会根据$map进行处理, - $arr = []; - foreach ($arrData as $item) { - $tempArr = $this->handleItem($item, 'export'); - // 根据需要$tempArr可以进一步处理,特殊的内容,默认$tempArr是根据$this->map来处理 - $arr[] = $tempArr; - } - return $arr; - } - - - /** - * 根据map表,处理数据 - * @param $data - */ - protected function handleItem($data, $type = 'export'){ - $arr = []; - if ($type === 'export'){ - foreach ($this->map as $key => $item){ - if (!isset($data[$item])){ - continue; - } - $arr[$key] = $data[$item]; - } - } - if ($type === 'import'){ - foreach ($this->map as $key => $item){ - if (!isset($data[$key])){ - continue; - } - $arr[$item] = $data[$key]; - } - } - return $arr; - } - - - public function import() - { -// 1.接收文件,打开数据 -// 2. 处理打开的数据,循环转换 -// 3. 导入到数据库 - $data = (new FastExcel())->import(request()->file('file')); - $arrData = $data->toArray(); - $arr = $this->importHandle($arrData); - $this->model::insert($arr['successData']); - $tips = '当前操作导入数据成功'.$arr['successCount'].'条'; - if ($arr['isError']) { - // 有失败的数据,无法插入,要显示出来,让前端能下载 - $file = time().'.xlsx'; - $fileName = public_path('xls').'\\'.$file; - $file = 'xls\\'.$file; - $data = collect($arr['errorData']); - (new FastExcel($data))->export($fileName); - $tips .= ',失败'.$arr['errorCount'].'条'; - return response()->json([ - 'info' => $tips, - 'fileName' => $file, - 'status' => 'error', - 'status_code' => 422 - ], 422); - } else { - return $this->successWithInfo($tips, 201); - } - } - - protected function importHandle($arrData){ -// 1. 要对每一条记录进行校验 - -// 2. 根据校验的结果,计算出可以导入的条数,以及错误的内容 - - $error = []; // 错误的具体信息 - $isError = false; // 是否存在信息错误 - $successCount = 0; // 统计数据导入成功的条数 - $errorCount = 0; // 出错的条数 - $arr = []; // 正确的内容存储之后,返回数据 - foreach ($arrData as $key => $item) { - $data = $this->handleItem($item, 'import'); - $data['created_at'] = Carbon::now(); - // 可以根据需要,进一步处理数据 - $this->validatorData($item,$data,$error, $isError ,$successCount, $errorCount,$arr); - } - return [ - 'successData' => $arr, - 'errorData' => $error, - 'isError' => $isError, - 'errorCount' => $errorCount, - 'successCount' => $successCount, - ]; - } - - - protected function validatorData($item, $data, &$error, &$isError ,&$successCount, &$errorCount,&$arr){ - if (method_exists($this, 'message')){ - $validator = Validator::make($data,$this->storeRule(),$this->message()); - } else { - $validator = Validator::make($data,$this->storeRule()); - } - if ($validator->fails()){ - // 获取相关的错误信息,并且把错误信息单独存放 - $errors = $validator->errors($validator); - $tips = ''; - foreach ($errors->all() as $message){ - $tips .= $message.','; - } - $tips = substr($tips,0,strlen($tips)-1); - // 状态信息 - $item['错误原因'] = $tips; - $error[] = $item; - $isError = true; - $errorCount ++; - } else { - // 没有出错的,我们先存在正确的数组 - $arr[] = $data; - $successCount ++; - } - } - - - protected function storeRule(){ - return [ - 'name' => 'required|unique:article_categories', - 'note' => 'required|unique:article_categories' - ]; - } - - protected function UpdateRule($id){ - return [ - 'name' => [ - 'required', - Rule::unique('article_categories')->ignore($id) - ], - 'note' => [ - 'required', - Rule::unique('article_categories')->ignore($id) - ], - - ]; - } - - - protected function message(){ - return [ - 'name.required' => '文章类别不能为空', - 'name.unique' => '文章类别不能重复', - 'note.required' => '文章说明不能为空', - 'note.unique' => '文章说明不能重复' - ]; - } -} diff --git a/api/app/Http/Controllers/Admin/ArticleController.php b/api/app/Http/Controllers/Admin/ArticleController.php deleted file mode 100644 index 5c9b0c31..00000000 --- a/api/app/Http/Controllers/Admin/ArticleController.php +++ /dev/null @@ -1,336 +0,0 @@ -input('pageSize', 10); - return $this->getListData($pageSize); - } - - protected function getListData($pageSize){ - // 当前列表数据 对应于原来的index - $data = $this->model::orderBy('order', 'asc')->paginate($pageSize); - return new $this->resourceCollection($data); - } - - - public function show($id){ - $data = $this->model::find($id); - return new $this->resource($data); - } - - public function getList() - { - $data = $this->model::orderBy('order', 'asc')->where('status', 1)->get(); - return new $this->resourceCollection($data); - } - - public function store(Request $request) - { -// 1. 获取前端数据 - - $data = $request->only($this->fillable); -// 2. 验证数据 - if (method_exists($this, 'message')){ - $validator = Validator::make($data, $this->storeRule(), $this->message()); - } else { - $validator = Validator::make($data, $this->storeRule()); - } - - if ($validator->fails()){ - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } -// 3.数据无误,进一步处理后保存到数据表里面,有的表需要处理,有的不需要 - $data = $this->storeHandle($data); - if ($this->model::create($data)) { - return $this->successWithInfo('新增数据成功', 201); - } else { - return $this->error(); - } - } - - - protected function storeHandle($data) - { - return $data; // TODO: Change the autogenerated stub - } - - protected function getErrorInfo($validator) - { - $errors = $validator->errors(); - $errorTips = ''; - foreach($errors->all() as $message){ - $errorTips = $errorTips.$message.','; - } - $errorTips = substr($errorTips, 0, strlen($errorTips)-1); - return $errorTips; - } - - - public function update(Request $request, $id) - { - $data = $request->only($this->fillable); - $action = $request->input('action', 'default'); - if ($action === 'status') { - if ($this->model::where('id', $id)->update([ - 'status' => $data['status'] - ])){ - return $this->successWithInfo('文章类型状态更新成功'); - } else { - return $this->errorWithInfo('文章类型状态更新失败'); - } - } - - if ($action === 'order') { - if ($this->model::where('id', $id)->update([ - 'order' => $data['order'] - ])){ - return $this->successWithInfo('文章顺序改变成功'); - } else { - return $this->errorWithInfo('文章顺序改变失败'); - } - } - if (method_exists($this, 'message')){ - $validator = Validator::make($data, $this->updateRule($id), $this->message()); - } else { - $validator = Validator::make($data, $this->updateRule($id)); - } - if ($validator->fails()){ - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } - // 进一步处理数据 - $data = $this->updateHandle($data); - // 更新到数据表 - if ($this->model::where('id', $id)->update($data)){ - return $this->successWithInfo('数据更新成功'); - } else { - return $this->errorWithInfo('数据更新失败'); - } - } - - protected function updateHandle($data){ - return $data; - } - - public function destroy($id) - { - $isSuccess = false; - DB::transaction(function() use(&$isSuccess, $id) { - $this->model::destroy($id); - $isSuccess = true; - }); - - if ($isSuccess){ - return $this->successWithInfo('数据删除成功', 200); - } else { - return $this->errorWithInfo('数据删除失败,请查看指定的数据是否存在'); - } - } - - protected function destroyHandle($id) { - DB::transaction(function () use($id) { - // 删除逻辑 注意多表关联的情况 - $this->model::where('id', $id)->delete(); - }); - return true; - } - public function deleteAll() - { - // 前端利用json格式传递数据 - $ids = json_decode(request()->input('ids'),true); - foreach ($ids as $id) { - $this->destoryHandle($id); - } - return $this->successWithInfo('批量删除数据成功', 204); - } - - - - public function export() - { - $data = $this->model::all(); - $data = $data->toArray(); - $arr = $this->exportHandle($data); - $data = collect($arr); - $fileName = time().'.xlsx'; - $file = 'xls\\'.$fileName; - (new FastExcel($data))->export($file); - return $this->successWithInfo($file); - } - - protected function exportHandle($arrData){ - // 默认会根据$map进行处理, - $arr = []; - foreach ($arrData as $item) { - $tempArr = $this->handleItem($item, 'export'); - // 根据需要$tempArr可以进一步处理,特殊的内容,默认$tempArr是根据$this->map来处理 - $arr[] = $tempArr; - } - return $arr; - } - - - /** - * 根据map表,处理数据 - * @param $data - */ - protected function handleItem($data, $type = 'export'){ - $arr = []; - if ($type === 'export'){ - foreach ($this->map as $key => $item){ - if (!isset($data[$item])){ - continue; - } - $arr[$key] = $data[$item]; - } - } - if ($type === 'import'){ - foreach ($this->map as $key => $item){ - if (!isset($data[$key])){ - continue; - } - $arr[$item] = $data[$key]; - } - } - return $arr; - } - - - public function import() - { -// 1.接收文件,打开数据 -// 2. 处理打开的数据,循环转换 -// 3. 导入到数据库 - $data = (new FastExcel())->import(request()->file('file')); - $arrData = $data->toArray(); - $arr = $this->importHandle($arrData); - $this->model::insert($arr['successData']); - $tips = '当前操作导入数据成功'.$arr['successCount'].'条'; - if ($arr['isError']) { - // 有失败的数据,无法插入,要显示出来,让前端能下载 - $file = time().'.xlsx'; - $fileName = public_path('xls').'\\'.$file; - $file = 'xls\\'.$file; - $data = collect($arr['errorData']); - (new FastExcel($data))->export($fileName); - $tips .= ',失败'.$arr['errorCount'].'条'; - return response()->json([ - 'info' => $tips, - 'fileName' => $file, - 'status' => 'error', - 'status_code' => 422 - ], 422); - } else { - return $this->successWithInfo($tips, 201); - } - } - - protected function importHandle($arrData){ -// 1. 要对每一条记录进行校验 - -// 2. 根据校验的结果,计算出可以导入的条数,以及错误的内容 - - $error = []; // 错误的具体信息 - $isError = false; // 是否存在信息错误 - $successCount = 0; // 统计数据导入成功的条数 - $errorCount = 0; // 出错的条数 - $arr = []; // 正确的内容存储之后,返回数据 - foreach ($arrData as $key => $item) { - $data = $this->handleItem($item, 'import'); - $data['created_at'] = Carbon::now(); - // 可以根据需要,进一步处理数据 - $this->validatorData($item,$data,$error, $isError ,$successCount, $errorCount,$arr); - } - return [ - 'successData' => $arr, - 'errorData' => $error, - 'isError' => $isError, - 'errorCount' => $errorCount, - 'successCount' => $successCount, - ]; - } - - - protected function validatorData($item, $data, &$error, &$isError ,&$successCount, &$errorCount,&$arr){ - if (method_exists($this, 'message')){ - $validator = Validator::make($data,$this->storeRule(),$this->message()); - } else { - $validator = Validator::make($data,$this->storeRule()); - } - if ($validator->fails()){ - // 获取相关的错误信息,并且把错误信息单独存放 - $errors = $validator->errors($validator); - $tips = ''; - foreach ($errors->all() as $message){ - $tips .= $message.','; - } - $tips = substr($tips,0,strlen($tips)-1); - // 状态信息 - $item['错误原因'] = $tips; - $error[] = $item; - $isError = true; - $errorCount ++; - } else { - // 没有出错的,我们先存在正确的数组 - $arr[] = $data; - $successCount ++; - } - } - - - protected function storeRule(){ - return [ - 'title' => 'required|unique:articles', - 'img' => 'required', - 'content' => 'required', - 'article_category_id' => 'required|exists:article_categories,id' - ]; - } - - protected function UpdateRule($id){ - return [ - 'title' => [ - 'required', - Rule::unique('articles')->ignore($id) - ], - 'img' => 'required', - 'content' => 'required', - 'article_category_id' => 'required|exists:article_categories,id' - ]; - } - - - protected function message(){ - return [ - 'title.required' => '文章标题不能为空', - 'title.unique' => '文章标题不能重复', - 'img.required' => '文章缩略图不能为空', - 'content.required' => '文章内容不能为空', - 'article_category_id.required' => '文章类型不能为空', - 'article_category_id.exists' => '文章类型不存在' - ]; - } -} diff --git a/api/app/Http/Controllers/Admin/CarouselController.php b/api/app/Http/Controllers/Admin/CarouselController.php deleted file mode 100644 index b8f22e0b..00000000 --- a/api/app/Http/Controllers/Admin/CarouselController.php +++ /dev/null @@ -1,297 +0,0 @@ -input('pageSize', 10); - return $this->getListData($pageSize); - } - - protected function getListData($pageSize){ - // 当前列表数据 对应于原来的index - $data = $this->model::paginate($pageSize); - return new $this->resourceCollection($data); - } - - - public function show($id){ - $data = $this->model::find($id); - return new $this->resource($data); - } - - public function store(Request $request) - { -// 1. 获取前端数据 - - $data = $request->only($this->fillable); -// 2. 验证数据 - if (method_exists($this, 'message')){ - $validator = Validator::make($data, $this->storeRule(), $this->message()); - } else { - $validator = Validator::make($data, $this->storeRule()); - } - - if ($validator->fails()){ - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } -// 3.数据无误,进一步处理后保存到数据表里面,有的表需要处理,有的不需要 - $data = $this->storeHandle($data); - if ($this->model::create($data)) { - return $this->successWithInfo('新增数据成功', 201); - } else { - return $this->error(); - } - } - - - protected function storeHandle($data) - { - return $data; // TODO: Change the autogenerated stub - } - - protected function getErrorInfo($validator) - { - $errors = $validator->errors(); - $errorTips = ''; - foreach($errors->all() as $message){ - $errorTips = $errorTips.$message.','; - } - $errorTips = substr($errorTips, 0, strlen($errorTips)-1); - return $errorTips; - } - - - public function update(Request $request, $id) - { - $data = $request->only($this->fillable); - if (method_exists($this, 'message')){ - $validator = Validator::make($data, $this->updateRule($id), $this->message()); - } else { - $validator = Validator::make($data, $this->updateRule($id)); - } - if ($validator->fails()){ - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } - // 进一步处理数据 - $data = $this->updateHandle($data); - // 更新到数据表 - if ($this->model::where('id', $id)->update($data)){ - return $this->successWithInfo('数据更新成功'); - } else { - return $this->errorWithInfo('数据更新失败'); - } - } - - protected function updateHandle($data){ - return $data; - } - - public function destroy($id) - { - $isSuccess = false; - DB::transaction(function() use(&$isSuccess, $id) { - $this->model::destroy($id); - $isSuccess = true; - }); - - if ($isSuccess){ - return $this->successWithInfo('数据删除成功', 200); - } else { - return $this->errorWithInfo('数据删除失败,请查看指定的数据是否存在'); - } - } - - protected function destroyHandle($id) { - DB::transaction(function () use($id) { - // 删除逻辑 注意多表关联的情况 - $this->model::where('id', $id)->delete(); - }); - return true; - } - public function deleteAll() - { - // 前端利用json格式传递数据 - $ids = json_decode(request()->input('ids'),true); - foreach ($ids as $id) { - $this->destoryHandle($id); - } - return $this->successWithInfo('批量删除数据成功', 204); - } - - - - public function export() - { - $data = $this->model::all(); - $data = $data->toArray(); - $arr = $this->exportHandle($data); - $data = collect($arr); - $fileName = time().'.xlsx'; - $file = 'xls\\'.$fileName; - (new FastExcel($data))->export($file); - return $this->successWithInfo($file); - } - - protected function exportHandle($arrData){ - // 默认会根据$map进行处理, - $arr = []; - foreach ($arrData as $item) { - $tempArr = $this->handleItem($item, 'export'); - // 根据需要$tempArr可以进一步处理,特殊的内容,默认$tempArr是根据$this->map来处理 - $arr[] = $tempArr; - } - return $arr; - } - - - /** - * 根据map表,处理数据 - * @param $data - */ - protected function handleItem($data, $type = 'export'){ - $arr = []; - if ($type === 'export'){ - foreach ($this->map as $key => $item){ - if (!isset($data[$item])){ - continue; - } - $arr[$key] = $data[$item]; - } - } - if ($type === 'import'){ - foreach ($this->map as $key => $item){ - if (!isset($data[$key])){ - continue; - } - $arr[$item] = $data[$key]; - } - } - return $arr; - } - - - public function import() - { -// 1.接收文件,打开数据 -// 2. 处理打开的数据,循环转换 -// 3. 导入到数据库 - $data = (new FastExcel())->import(request()->file('file')); - $arrData = $data->toArray(); - $arr = $this->importHandle($arrData); - $this->model::insert($arr['successData']); - $tips = '当前操作导入数据成功'.$arr['successCount'].'条'; - if ($arr['isError']) { - // 有失败的数据,无法插入,要显示出来,让前端能下载 - $file = time().'.xlsx'; - $fileName = public_path('xls').'\\'.$file; - $file = 'xls\\'.$file; - $data = collect($arr['errorData']); - (new FastExcel($data))->export($fileName); - $tips .= ',失败'.$arr['errorCount'].'条'; - return response()->json([ - 'info' => $tips, - 'fileName' => $file, - 'status' => 'error', - 'status_code' => 422 - ], 422); - } else { - return $this->successWithInfo($tips, 201); - } - } - - protected function importHandle($arrData){ -// 1. 要对每一条记录进行校验 - -// 2. 根据校验的结果,计算出可以导入的条数,以及错误的内容 - - $error = []; // 错误的具体信息 - $isError = false; // 是否存在信息错误 - $successCount = 0; // 统计数据导入成功的条数 - $errorCount = 0; // 出错的条数 - $arr = []; // 正确的内容存储之后,返回数据 - foreach ($arrData as $key => $item) { - $data = $this->handleItem($item, 'import'); - $data['created_at'] = Carbon::now(); - // 可以根据需要,进一步处理数据 - $this->validatorData($item,$data,$error, $isError ,$successCount, $errorCount,$arr); - } - return [ - 'successData' => $arr, - 'errorData' => $error, - 'isError' => $isError, - 'errorCount' => $errorCount, - 'successCount' => $successCount, - ]; - } - - - protected function validatorData($item, $data, &$error, &$isError ,&$successCount, &$errorCount,&$arr){ - if (method_exists($this, 'message')){ - $validator = Validator::make($data,$this->storeRule(),$this->message()); - } else { - $validator = Validator::make($data,$this->storeRule()); - } - if ($validator->fails()){ - // 获取相关的错误信息,并且把错误信息单独存放 - $errors = $validator->errors($validator); - $tips = ''; - foreach ($errors->all() as $message){ - $tips .= $message.','; - } - $tips = substr($tips,0,strlen($tips)-1); - // 状态信息 - $item['错误原因'] = $tips; - $error[] = $item; - $isError = true; - $errorCount ++; - } else { - // 没有出错的,我们先存在正确的数组 - $arr[] = $data; - $successCount ++; - } - } - - - protected function storeRule(){ - return [ - 'title' => 'required', - 'img' => 'required' - ]; - } - - protected function UpdateRule($id){ - return [ - 'title' => 'required', - 'img' => 'required' - ]; - } - - - protected function message(){ - return [ - 'title.required' => '轮播图标题不能为空', - 'img.required' => '轮播图不能为空', - ]; - } -} diff --git a/api/app/Http/Controllers/Admin/ChatController.php b/api/app/Http/Controllers/Admin/ChatController.php deleted file mode 100644 index 6c43ee1e..00000000 --- a/api/app/Http/Controllers/Admin/ChatController.php +++ /dev/null @@ -1,167 +0,0 @@ -initGateWay(); - $client_id = $this->getWebsocketClientId(); - $user = Auth::user(); - $arr = Gateway::getClientSessionsByGroup("chat"); - $chatArr = array_keys($arr); - if (count($arr)>=1){ - // 广播给其他用户 - $data = [ - 'name' => $user->email, - 'avatar' => $user->avatar, - 'client_id' => $client_id, - "type" => "chatUserLogin", - "select" => "all" - ]; - Gateway::sendToGroup("chat",json_encode($data)); - } - Gateway::joinGroup($client_id, "chat"); - // 返回已经在线的信息 - $otherUser = []; - - foreach ($chatArr as $v) { - $uid = Gateway::getUidByClientId($v); - $otherUser[$uid] = $v; - } - - $existsData = []; - foreach ($otherUser as $uid => $v) { - $user = Admin::find($uid); - $existsData [] = [ - 'name' => $user->email, - 'avatar' => $user->avatar, - 'client_id' => $v - ]; - } - return $this->successWithData($existsData); - } - - - // 取消注册 - - /** - * 1.退出聊天的组 - * 2.获取剩下的聊天室成员 - * 3.发送数据去通知 - */ - public function unRegister() - { - $this->initGateWay(); - $client_id = $this->getWebsocketClientId(); - Gateway::leaveGroup($client_id, "chat"); - $chatArray = Gateway::getClientSessionsByGroup("chat"); - $chatArr = array_keys($chatArray); - $uid = Gateway::getUidByClientId($client_id); - $user = Admin::find($uid); - $data = [ - "client_id" => $client_id, - "name" => $user->email, - "type" => "chatUserLogout" , - "select" => "all" - ]; - Gateway::sendToAll(json_encode($data), $chatArr); - return $this->success(); - } - - /** - * 发送信息给聊天室的其他用户 - * 从chat组中找出所有的额数据,去掉本人的,然后发给剩下所有的 - */ - - public function sendDataToUser() - { - $data = request()->only(['name', 'content', 'avatar', 'time']); - $client_id = $this->getWebsocketClientId(); - $this->initGateWay(); - $chatArray = Gateway::getClientSessionsByGroup("chat"); - $chatArr = array_keys($chatArray); - // 删除自身 - unset($chatArr[array_search($client_id, $chatArr)]); - $chatIds = array_values($chatArr); - $data['type'] = "chatUserSay"; - $data['select'] = "all"; - Gateway::sendToAll(json_encode($data), $chatIds); - return $this->successWithInfo("信息已经发送"); - } - - protected function initGateWay() - { - $address = env('REGISTER_ADDRESS', '127.0.0.1:1680'); - Gateway::$registerAddress = $address; - } - - - public function index() - { - // - } - - /** - * Store a newly created resource in storage. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\Response - */ - public function store(Request $request) - { - // - } - - /** - * Display the specified resource. - * - * @param int $id - * @return \Illuminate\Http\Response - */ - public function show($id) - { - // - } - - /** - * Update the specified resource in storage. - * - * @param \Illuminate\Http\Request $request - * @param int $id - * @return \Illuminate\Http\Response - */ - public function update(Request $request, $id) - { - // - } - - /** - * Remove the specified resource from storage. - * - * @param int $id - * @return \Illuminate\Http\Response - */ - public function destroy($id) - { - // - } -} diff --git a/api/app/Http/Controllers/Admin/CodeConfigController.php b/api/app/Http/Controllers/Admin/CodeConfigController.php deleted file mode 100644 index 13117050..00000000 --- a/api/app/Http/Controllers/Admin/CodeConfigController.php +++ /dev/null @@ -1,285 +0,0 @@ -input('pageSize', 10); - return $this->getListData($pageSize); - } - - protected function getListData($pageSize){ - // 当前列表数据 对应于原来的index - $data = $this->model::paginate($pageSize); - return new $this->resourceCollection($data); - } - - - public function show($id){ - $data = $this->model::find($id); - return new $this->resource($data); - } - - public function store(Request $request) - { -// 1. 获取前端数据 - - $data = $request->only($this->fillable); -// 2. 验证数据 - if (method_exists($this, 'message')){ - $validator = Validator::make($data, $this->storeRule(), $this->message()); - } else { - $validator = Validator::make($data, $this->storeRule()); - } - - if ($validator->fails()){ - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } -// 3.数据无误,进一步处理后保存到数据表里面,有的表需要处理,有的不需要 - $data = $this->storeHandle($data); - if ($this->model::create($data)) { - return $this->successWithInfo('新增数据成功', 201); - } else { - return $this->error(); - } - } - - - protected function storeHandle($data) - { - return $data; // TODO: Change the autogenerated stub - } - - protected function getErrorInfo($validator) - { - $errors = $validator->errors(); - $errorTips = ''; - foreach($errors->all() as $message){ - $errorTips = $errorTips.$message.','; - } - $errorTips = substr($errorTips, 0, strlen($errorTips)-1); - return $errorTips; - } - - - public function update(Request $request, $id) - { - $data = $request->only($this->fillable); - if (method_exists($this, 'message')){ - $validator = Validator::make($data, $this->updateRule($id), $this->message()); - } else { - $validator = Validator::make($data, $this->updateRule($id)); - } - if ($validator->fails()){ - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } - // 进一步处理数据 - $data = $this->updateHandle($data); - // 更新到数据表 - if ($this->model::where('id', $id)->update($data)){ - return $this->successWithInfo('数据更新成功'); - } else { - return $this->errorWithInfo('数据更新失败'); - } - } - - protected function updateHandle($data){ - return $data; - } - - public function destroy($id) - { - if ($this->destroyHandle($id)){ - return $this->successWithInfo('数据删除成功', 204); - } else { - return $this->errorWithInfo('数据删除失败,请查看指定的数据是否存在'); - } - } - - protected function destroyHandle($id) { - DB::transaction(function () use($id) { - // 删除逻辑 注意多表关联的情况 - $this->model::where('id', $id)->delete(); - }); - return true; - } - public function deleteAll() - { - // 前端利用json格式传递数据 - $ids = json_decode(request()->input('ids'),true); - foreach ($ids as $id) { - $this->destoryHandle($id); - } - return $this->successWithInfo('批量删除数据成功', 204); - } - - - - public function export() - { - $data = $this->model::all(); - $data = $data->toArray(); - $arr = $this->exportHandle($data); - $data = collect($arr); - $fileName = time().'.xlsx'; - $file = 'xls\\'.$fileName; - (new FastExcel($data))->export($file); - return $this->successWithInfo($file); - } - - protected function exportHandle($arrData){ - // 默认会根据$map进行处理, - $arr = []; - foreach ($arrData as $item) { - $tempArr = $this->handleItem($item, 'export'); - // 根据需要$tempArr可以进一步处理,特殊的内容,默认$tempArr是根据$this->map来处理 - $arr[] = $tempArr; - } - return $arr; - } - - - /** - * 根据map表,处理数据 - * @param $data - */ - protected function handleItem($data, $type = 'export'){ - $arr = []; - if ($type === 'export'){ - foreach ($this->map as $key => $item){ - if (!isset($data[$item])){ - continue; - } - $arr[$key] = $data[$item]; - } - } - if ($type === 'import'){ - foreach ($this->map as $key => $item){ - if (!isset($data[$key])){ - continue; - } - $arr[$item] = $data[$key]; - } - } - return $arr; - } - - - public function import() - { -// 1.接收文件,打开数据 -// 2. 处理打开的数据,循环转换 -// 3. 导入到数据库 - $data = (new FastExcel())->import(request()->file('file')); - $arrData = $data->toArray(); - $arr = $this->importHandle($arrData); - $this->model::insert($arr['successData']); - $tips = '当前操作导入数据成功'.$arr['successCount'].'条'; - if ($arr['isError']) { - // 有失败的数据,无法插入,要显示出来,让前端能下载 - $file = time().'.xlsx'; - $fileName = public_path('xls').'\\'.$file; - $file = 'xls\\'.$file; - $data = collect($arr['errorData']); - (new FastExcel($data))->export($fileName); - $tips .= ',失败'.$arr['errorCount'].'条'; - return response()->json([ - 'info' => $tips, - 'fileName' => $file, - 'status' => 'error', - 'status_code' => 422 - ], 422); - } else { - return $this->successWithInfo($tips, 201); - } - } - - protected function importHandle($arrData){ -// 1. 要对每一条记录进行校验 - -// 2. 根据校验的结果,计算出可以导入的条数,以及错误的内容 - - $error = []; // 错误的具体信息 - $isError = false; // 是否存在信息错误 - $successCount = 0; // 统计数据导入成功的条数 - $errorCount = 0; // 出错的条数 - $arr = []; // 正确的内容存储之后,返回数据 - foreach ($arrData as $key => $item) { - $data = $this->handleItem($item, 'import'); - $data['created_at'] = Carbon::now(); - // 可以根据需要,进一步处理数据 - $this->validatorData($item,$data,$error, $isError ,$successCount, $errorCount,$arr); - } - return [ - 'successData' => $arr, - 'errorData' => $error, - 'isError' => $isError, - 'errorCount' => $errorCount, - 'successCount' => $successCount, - ]; - } - - - protected function validatorData($item, $data, &$error, &$isError ,&$successCount, &$errorCount,&$arr){ - if (method_exists($this, 'message')){ - $validator = Validator::make($data,$this->storeRule(),$this->message()); - } else { - $validator = Validator::make($data,$this->storeRule()); - } - if ($validator->fails()){ - // 获取相关的错误信息,并且把错误信息单独存放 - $errors = $validator->errors($validator); - $tips = ''; - foreach ($errors->all() as $message){ - $tips .= $message.','; - } - $tips = substr($tips,0,strlen($tips)-1); - // 状态信息 - $item['错误原因'] = $tips; - $error[] = $item; - $isError = true; - $errorCount ++; - } else { - // 没有出错的,我们先存在正确的数组 - $arr[] = $data; - $successCount ++; - } - } - - - protected function storeRule(){ - return []; - } - - protected function UpdateRule($id){ - return []; - } - - - protected function message(){ - return []; - } - -} diff --git a/api/app/Http/Controllers/Admin/CodeController.php b/api/app/Http/Controllers/Admin/CodeController.php deleted file mode 100644 index ee6d6b45..00000000 --- a/api/app/Http/Controllers/Admin/CodeController.php +++ /dev/null @@ -1,285 +0,0 @@ -input('pageSize', 10); - return $this->getListData($pageSize); - } - - protected function getListData($pageSize){ - // 当前列表数据 对应于原来的index - $data = $this->model::paginate($pageSize); - return new $this->resourceCollection($data); - } - - - public function show($id){ - $data = $this->model::find($id); - return new $this->resource($data); - } - - public function store(Request $request) - { -// 1. 获取前端数据 - - $data = $request->only($this->fillable); -// 2. 验证数据 - if (method_exists($this, 'message')){ - $validator = Validator::make($data, $this->storeRule(), $this->message()); - } else { - $validator = Validator::make($data, $this->storeRule()); - } - - if ($validator->fails()){ - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } -// 3.数据无误,进一步处理后保存到数据表里面,有的表需要处理,有的不需要 - $data = $this->storeHandle($data); - if ($this->model::create($data)) { - return $this->successWithInfo('新增数据成功', 201); - } else { - return $this->error(); - } - } - - - protected function storeHandle($data) - { - return $data; // TODO: Change the autogenerated stub - } - - protected function getErrorInfo($validator) - { - $errors = $validator->errors(); - $errorTips = ''; - foreach($errors->all() as $message){ - $errorTips = $errorTips.$message.','; - } - $errorTips = substr($errorTips, 0, strlen($errorTips)-1); - return $errorTips; - } - - - public function update(Request $request, $id) - { - $data = $request->only($this->fillable); - if (method_exists($this, 'message')){ - $validator = Validator::make($data, $this->updateRule($id), $this->message()); - } else { - $validator = Validator::make($data, $this->updateRule($id)); - } - if ($validator->fails()){ - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } - // 进一步处理数据 - $data = $this->updateHandle($data); - // 更新到数据表 - if ($this->model::where('id', $id)->update($data)){ - return $this->successWithInfo('数据更新成功'); - } else { - return $this->errorWithInfo('数据更新失败'); - } - } - - protected function updateHandle($data){ - return $data; - } - - public function destroy($id) - { - if ($this->destroyHandle($id)){ - return $this->successWithInfo('数据删除成功', 204); - } else { - return $this->errorWithInfo('数据删除失败,请查看指定的数据是否存在'); - } - } - - protected function destroyHandle($id) { - DB::transaction(function () use($id) { - // 删除逻辑 注意多表关联的情况 - $this->model::where('id', $id)->delete(); - }); - return true; - } - public function deleteAll() - { - // 前端利用json格式传递数据 - $ids = json_decode(request()->input('ids'),true); - foreach ($ids as $id) { - $this->destoryHandle($id); - } - return $this->successWithInfo('批量删除数据成功', 204); - } - - - - public function export() - { - $data = $this->model::all(); - $data = $data->toArray(); - $arr = $this->exportHandle($data); - $data = collect($arr); - $fileName = time().'.xlsx'; - $file = 'xls\\'.$fileName; - (new FastExcel($data))->export($file); - return $this->successWithInfo($file); - } - - protected function exportHandle($arrData){ - // 默认会根据$map进行处理, - $arr = []; - foreach ($arrData as $item) { - $tempArr = $this->handleItem($item, 'export'); - // 根据需要$tempArr可以进一步处理,特殊的内容,默认$tempArr是根据$this->map来处理 - $arr[] = $tempArr; - } - return $arr; - } - - - /** - * 根据map表,处理数据 - * @param $data - */ - protected function handleItem($data, $type = 'export'){ - $arr = []; - if ($type === 'export'){ - foreach ($this->map as $key => $item){ - if (!isset($data[$item])){ - continue; - } - $arr[$key] = $data[$item]; - } - } - if ($type === 'import'){ - foreach ($this->map as $key => $item){ - if (!isset($data[$key])){ - continue; - } - $arr[$item] = $data[$key]; - } - } - return $arr; - } - - - public function import() - { -// 1.接收文件,打开数据 -// 2. 处理打开的数据,循环转换 -// 3. 导入到数据库 - $data = (new FastExcel())->import(request()->file('file')); - $arrData = $data->toArray(); - $arr = $this->importHandle($arrData); - $this->model::insert($arr['successData']); - $tips = '当前操作导入数据成功'.$arr['successCount'].'条'; - if ($arr['isError']) { - // 有失败的数据,无法插入,要显示出来,让前端能下载 - $file = time().'.xlsx'; - $fileName = public_path('xls').'\\'.$file; - $file = 'xls\\'.$file; - $data = collect($arr['errorData']); - (new FastExcel($data))->export($fileName); - $tips .= ',失败'.$arr['errorCount'].'条'; - return response()->json([ - 'info' => $tips, - 'fileName' => $file, - 'status' => 'error', - 'status_code' => 422 - ], 422); - } else { - return $this->successWithInfo($tips, 201); - } - } - - protected function importHandle($arrData){ -// 1. 要对每一条记录进行校验 - -// 2. 根据校验的结果,计算出可以导入的条数,以及错误的内容 - - $error = []; // 错误的具体信息 - $isError = false; // 是否存在信息错误 - $successCount = 0; // 统计数据导入成功的条数 - $errorCount = 0; // 出错的条数 - $arr = []; // 正确的内容存储之后,返回数据 - foreach ($arrData as $key => $item) { - $data = $this->handleItem($item, 'import'); - $data['created_at'] = Carbon::now(); - // 可以根据需要,进一步处理数据 - $this->validatorData($item,$data,$error, $isError ,$successCount, $errorCount,$arr); - } - return [ - 'successData' => $arr, - 'errorData' => $error, - 'isError' => $isError, - 'errorCount' => $errorCount, - 'successCount' => $successCount, - ]; - } - - - protected function validatorData($item, $data, &$error, &$isError ,&$successCount, &$errorCount,&$arr){ - if (method_exists($this, 'message')){ - $validator = Validator::make($data,$this->storeRule(),$this->message()); - } else { - $validator = Validator::make($data,$this->storeRule()); - } - if ($validator->fails()){ - // 获取相关的错误信息,并且把错误信息单独存放 - $errors = $validator->errors($validator); - $tips = ''; - foreach ($errors->all() as $message){ - $tips .= $message.','; - } - $tips = substr($tips,0,strlen($tips)-1); - // 状态信息 - $item['错误原因'] = $tips; - $error[] = $item; - $isError = true; - $errorCount ++; - } else { - // 没有出错的,我们先存在正确的数组 - $arr[] = $data; - $successCount ++; - } - } - - - protected function storeRule(){ - return []; - } - - protected function UpdateRule($id){ - return []; - } - - - protected function message(){ - return []; - } - -} diff --git a/api/app/Http/Controllers/Admin/CodeSnippetController.php b/api/app/Http/Controllers/Admin/CodeSnippetController.php deleted file mode 100644 index 5a3ead9b..00000000 --- a/api/app/Http/Controllers/Admin/CodeSnippetController.php +++ /dev/null @@ -1,286 +0,0 @@ -input('pageSize', 10); - return $this->getListData($pageSize); - } - - protected function getListData($pageSize){ - // 当前列表数据 对应于原来的index - $data = $this->model::paginate($pageSize); - return new $this->resourceCollection($data); - } - - - public function show($id){ - $data = $this->model::find($id); - return new $this->resource($data); - } - - public function store(Request $request) - { -// 1. 获取前端数据 - - $data = $request->only($this->fillable); -// 2. 验证数据 - if (method_exists($this, 'message')){ - $validator = Validator::make($data, $this->storeRule(), $this->message()); - } else { - $validator = Validator::make($data, $this->storeRule()); - } - - if ($validator->fails()){ - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } -// 3.数据无误,进一步处理后保存到数据表里面,有的表需要处理,有的不需要 - $data = $this->storeHandle($data); - if ($this->model::create($data)) { - return $this->successWithInfo('新增数据成功', 201); - } else { - return $this->error(); - } - } - - - protected function storeHandle($data) - { - return $data; // TODO: Change the autogenerated stub - } - - protected function getErrorInfo($validator) - { - $errors = $validator->errors(); - $errorTips = ''; - foreach($errors->all() as $message){ - $errorTips = $errorTips.$message.','; - } - $errorTips = substr($errorTips, 0, strlen($errorTips)-1); - return $errorTips; - } - - - public function update(Request $request, $id) - { - $data = $request->only($this->fillable); - if (method_exists($this, 'message')){ - $validator = Validator::make($data, $this->updateRule($id), $this->message()); - } else { - $validator = Validator::make($data, $this->updateRule($id)); - } - if ($validator->fails()){ - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } - // 进一步处理数据 - $data = $this->updateHandle($data); - // 更新到数据表 - if ($this->model::where('id', $id)->update($data)){ - return $this->successWithInfo('数据更新成功'); - } else { - return $this->errorWithInfo('数据更新失败'); - } - } - - protected function updateHandle($data){ - return $data; - } - - public function destroy($id) - { - if ($this->destroyHandle($id)){ - return $this->successWithInfo('数据删除成功', 204); - } else { - return $this->errorWithInfo('数据删除失败,请查看指定的数据是否存在'); - } - } - - protected function destroyHandle($id) { - DB::transaction(function () use($id) { - // 删除逻辑 注意多表关联的情况 - $this->model::where('id', $id)->delete(); - }); - return true; - } - public function deleteAll() - { - // 前端利用json格式传递数据 - $ids = json_decode(request()->input('ids'),true); - foreach ($ids as $id) { - $this->destoryHandle($id); - } - return $this->successWithInfo('批量删除数据成功', 204); - } - - - - public function export() - { - $data = $this->model::all(); - $data = $data->toArray(); - $arr = $this->exportHandle($data); - $data = collect($arr); - $fileName = time().'.xlsx'; - $file = 'xls\\'.$fileName; - (new FastExcel($data))->export($file); - return $this->successWithInfo($file); - } - - protected function exportHandle($arrData){ - // 默认会根据$map进行处理, - $arr = []; - foreach ($arrData as $item) { - $tempArr = $this->handleItem($item, 'export'); - // 根据需要$tempArr可以进一步处理,特殊的内容,默认$tempArr是根据$this->map来处理 - $arr[] = $tempArr; - } - return $arr; - } - - - /** - * 根据map表,处理数据 - * @param $data - */ - protected function handleItem($data, $type = 'export'){ - $arr = []; - if ($type === 'export'){ - foreach ($this->map as $key => $item){ - if (!isset($data[$item])){ - continue; - } - $arr[$key] = $data[$item]; - } - } - if ($type === 'import'){ - foreach ($this->map as $key => $item){ - if (!isset($data[$key])){ - continue; - } - $arr[$item] = $data[$key]; - } - } - return $arr; - } - - - public function import() - { -// 1.接收文件,打开数据 -// 2. 处理打开的数据,循环转换 -// 3. 导入到数据库 - $data = (new FastExcel())->import(request()->file('file')); - $arrData = $data->toArray(); - $arr = $this->importHandle($arrData); - $this->model::insert($arr['successData']); - $tips = '当前操作导入数据成功'.$arr['successCount'].'条'; - if ($arr['isError']) { - // 有失败的数据,无法插入,要显示出来,让前端能下载 - $file = time().'.xlsx'; - $fileName = public_path('xls').'\\'.$file; - $file = 'xls\\'.$file; - $data = collect($arr['errorData']); - (new FastExcel($data))->export($fileName); - $tips .= ',失败'.$arr['errorCount'].'条'; - return response()->json([ - 'info' => $tips, - 'fileName' => $file, - 'status' => 'error', - 'status_code' => 422 - ], 422); - } else { - return $this->successWithInfo($tips, 201); - } - } - - protected function importHandle($arrData){ -// 1. 要对每一条记录进行校验 - -// 2. 根据校验的结果,计算出可以导入的条数,以及错误的内容 - - $error = []; // 错误的具体信息 - $isError = false; // 是否存在信息错误 - $successCount = 0; // 统计数据导入成功的条数 - $errorCount = 0; // 出错的条数 - $arr = []; // 正确的内容存储之后,返回数据 - foreach ($arrData as $key => $item) { - $data = $this->handleItem($item, 'import'); - $data['created_at'] = Carbon::now(); - // 可以根据需要,进一步处理数据 - $this->validatorData($item,$data,$error, $isError ,$successCount, $errorCount,$arr); - } - return [ - 'successData' => $arr, - 'errorData' => $error, - 'isError' => $isError, - 'errorCount' => $errorCount, - 'successCount' => $successCount, - ]; - } - - - protected function validatorData($item, $data, &$error, &$isError ,&$successCount, &$errorCount,&$arr){ - if (method_exists($this, 'message')){ - $validator = Validator::make($data,$this->storeRule(),$this->message()); - } else { - $validator = Validator::make($data,$this->storeRule()); - } - if ($validator->fails()){ - // 获取相关的错误信息,并且把错误信息单独存放 - $errors = $validator->errors($validator); - $tips = ''; - foreach ($errors->all() as $message){ - $tips .= $message.','; - } - $tips = substr($tips,0,strlen($tips)-1); - // 状态信息 - $item['错误原因'] = $tips; - $error[] = $item; - $isError = true; - $errorCount ++; - } else { - // 没有出错的,我们先存在正确的数组 - $arr[] = $data; - $successCount ++; - } - } - - - protected function storeRule(){ - return []; - } - - protected function UpdateRule($id){ - return []; - } - - - protected function message(){ - return []; - } - -} diff --git a/api/app/Http/Controllers/Admin/Controller.php b/api/app/Http/Controllers/Admin/Controller.php deleted file mode 100644 index 5f2fd2b5..00000000 --- a/api/app/Http/Controllers/Admin/Controller.php +++ /dev/null @@ -1,140 +0,0 @@ -input("action", "import"); - switch ($action) { - case 'download': - $result = []; - $result [] = [ - "昵称" => "xpyzwm", - "登录名" => "xpyzwm", - "电话号码" => "13577728948", - "角色" => 'user' - ]; - $list = collect($result); - // 直接下载 - return (FastExcel::data($list))->download('template.xlsx'); - break; - default: - $data = FastExcel::import(request()->file('file')); - $arrData = $data->toArray(); - $arr = $this->importHandle($arrData); - $this->model::insert($arr['successData']); - $tips = '当前操作导入数据成功' . $arr['successCount'] . '条'; - if ($arr['isError']) { - // 有失败的数据,无法插入,要显示出来,让前端能下载 - $file = time() . '.xlsx'; - $fileName = public_path('xls') . '\\' . $file; - $file = 'xls\\' . $file; - $data = collect($arr['errorData']); - (new FastExcel($data))->export($fileName); - $tips .= ',失败' . $arr['errorCount'] . '条'; - return response()->json([ - 'info' => $tips, - 'fileName' => $file, - 'status' => 'error', - 'status_code' => 422 - ], 422); - } else { - return $this->successWithInfo($tips, 201); - } - } - } - - /** - * 1. 要对每一条记录进行校验 - * 2. 根据校验的结果,计算出可以导入的条数,以及错误的内容 - * @param $arrData - * @return array - */ - protected function importHandle($arrData){ - $error = []; // 错误的具体信息 - $isError = false; // 是否存在信息错误 - $successCount = 0; // 统计数据导入成功的条数 - $errorCount = 0; // 出错的条数 - $arr = []; // 正确的内容存储之后,返回数据 - foreach ($arrData as $key => $item) { - $data = $this->handleItem($item, 'import'); - $data['created_at'] = Carbon::now(); - // 可以根据需要,进一步处理数据 - $this->validatorData($item,$data,$error, $isError ,$successCount, $errorCount,$arr); - } - return [ - 'successData' => $arr, - 'errorData' => $error, - 'isError' => $isError, - 'errorCount' => $errorCount, - 'successCount' => $successCount, - ]; - } - - protected function validatorData($item, $data, &$error, &$isError ,&$successCount, &$errorCount,&$arr){ - if (method_exists($this, 'message')){ - $validator = Validator::make($data,$this->storeRule(),$this->message()); - } else { - $validator = Validator::make($data,$this->storeRule()); - } - if ($validator->fails()){ - // 获取相关的错误信息,并且把错误信息单独存放 - $errors = $validator->errors($validator); - $tips = ''; - foreach ($errors->all() as $message){ - $tips .= $message.','; - } - $tips = substr($tips,0,strlen($tips)-1); - // 状态信息 - $item['错误原因'] = $tips; - $error[] = $item; - $isError = true; - $errorCount ++; - } else { - // 没有出错的,我们先存在正确的数组 - $arr[] = $data; - $successCount ++; - } - } - - protected function storeRule(){ - return []; - } - - protected function UpdateRule($id){ - return []; - } - - -// protected function message(){ -// return []; -// } - - - - -} diff --git a/api/app/Http/Controllers/Admin/FileHandle.php b/api/app/Http/Controllers/Admin/FileHandle.php deleted file mode 100644 index be282c52..00000000 --- a/api/app/Http/Controllers/Admin/FileHandle.php +++ /dev/null @@ -1,89 +0,0 @@ -map as $key => $item){ - if (!isset($data[$item])){ - continue; - } - $arr[$key] = $data[$item]; - } - } - if ($type === 'import'){ - foreach ($this->map as $key => $item){ - if (!isset($data[$key])){ - continue; - } - $arr[$item] = $data[$key]; - } - } - return $arr; - } - - - protected function importHandle($arrData){ -// 1. 要对每一条记录进行校验 - -// 2. 根据校验的结果,计算出可以导入的条数,以及错误的内容 - - $error = []; // 错误的具体信息 - $isError = false; // 是否存在信息错误 - $successCount = 0; // 统计数据导入成功的条数 - $errorCount = 0; // 出错的条数 - $arr = []; // 正确的内容存储之后,返回数据 - foreach ($arrData as $key => $item) { - $data = $this->handleItem($item, 'import'); - $data['created_at'] = Carbon::now(); - // 可以根据需要,进一步处理数据 - $this->validatorData($item,$data,$error, $isError ,$successCount, $errorCount,$arr); - } - return [ - 'successData' => $arr, - 'errorData' => $error, - 'isError' => $isError, - 'errorCount' => $errorCount, - 'successCount' => $successCount, - ]; - } - - protected function validatorData($item, $data, &$error, &$isError ,&$successCount, &$errorCount,&$arr){ - if (method_exists($this, 'message')){ - $validator = Validator::make($data,$this->rulesStore(),$this->message()); - } else { - $validator = Validator::make($data,$this->rulesStore()); - } - if ($validator->fails()){ - // 获取相关的错误信息,并且把错误信息单独存放 - $errors = $validator->errors($validator); - $tips = ''; - foreach ($errors->all() as $message){ - $tips .= $message.','; - } - $tips = substr($tips,0,strlen($tips)-1); - // 状态信息 - $item['错误原因'] = $tips; - $error[] = $item; - $isError = true; - $errorCount ++; - } else { - // 没有出错的,我们先存在正确的数组 - $arr[] = $data; - $successCount ++; - } - } - -} - - diff --git a/api/app/Http/Controllers/Admin/HZip.php b/api/app/Http/Controllers/Admin/HZip.php deleted file mode 100644 index adf28395..00000000 --- a/api/app/Http/Controllers/Admin/HZip.php +++ /dev/null @@ -1,55 +0,0 @@ -addFile($filePath, $localPath); - } elseif (is_dir($filePath)) { - // Add sub-directory. - $zipFile->addEmptyDir($localPath); - self::folderToZip($filePath, $zipFile, $exclusiveLength); - } - } - } - closedir($handle); - } - - /** - * Zip a folder (include itself). - * Usage: - * HZip::zipDir('/path/to/sourceDir', '/path/to/out.zip'); - * - * @param string $sourcePath Path of directory to be zip. - * @param string $outZipPath Path of output zip file. - */ - public static function zipDir($sourcePath, $outZipPath) - { - - $pathInfo = pathInfo($sourcePath); - $parentPath = $pathInfo['dirname']; - $dirName = $pathInfo['basename']; - - $z = new \ZipArchive(); - $z->open($outZipPath, \ZIPARCHIVE::CREATE); - $z->addEmptyDir($dirName); - self::folderToZip($sourcePath, $z, strlen("$parentPath/")); - $z->close(); - } -} diff --git a/api/app/Http/Controllers/Admin/LogController.php b/api/app/Http/Controllers/Admin/LogController.php deleted file mode 100644 index 38f685db..00000000 --- a/api/app/Http/Controllers/Admin/LogController.php +++ /dev/null @@ -1,85 +0,0 @@ -middleware('auth:api', ['except' => ['login', 'refresh', 'loginByPhone', 'captcha', 'test']]); - } - - public function test() - { - -// $tableName = 'wechats'; -// if (Storage::disk('code')->exists($tableName)){ -// Storage::disk('code')->deleteDirectory($tableName); -// } -// Storage::disk('code')->makeDirectory($tableName); -// Storage::disk('code')->makeDirectory($tableName.'/'.$controller); -// Storage::disk('code')->makeDirectory($tableName.'/'.$model); -// Storage::disk('code')->makeDirectory($tableName.'/'.$routes); -// Storage::disk('code')->makeDirectory($tableName.'/'.$resource); -// Storage::disk('code')->makeDirectory($tableName.'/'.$api); -// Storage::disk('code')->makeDirectory($tableName.'/'.$front_model); -// Storage::disk('code')->makeDirectory($tableName.'/'.$page); -// $zip = public_path("code/$tableName.zip");//压缩文件名,自己命名 -// HZip::zipDir(public_path("code/$tableName"),$zip); -// return response()->download($zip, basename($zip))->deleteFileAfterSend(true); - - } - - - // 验证码 - public function captcha() - { - $result = app('captcha')->create('default', true); - return $this->successWithData($result); - } - - protected function checkCode() - { - $code = request('code', ''); - $key = request('key', ''); - if ($code === 'A123456789') { // 万能验证码,调试接口时候使用 - return true; - } - if (!captcha_api_check($code, $key)) { - return '图像验证码不匹配, 请重新填写'; - } else { - return true; - } - } - - /** - * 管理员登陆 - * @bodyParam username string required 用户名,可以是手机号和登陆名 Example: admin@qq.com - * @bodyParam password string required 密码 Example: 123456 - * @return \Illuminate\Http\JsonResponse - */ - - public function login() - { - - $username = request('username'); - $password = request('password'); - // 验证码相关的 - $verify_code = env('VERIFY_CODE', false); - $verify_result = $this->checkCode(); - if ($verify_code && is_string($verify_result)) { // 开启验证码, 但是验证码不正确,则返回错误信息 - return $this->errorWithInfo($verify_result, 400); - } - - if (($verify_code && $verify_result) || !$verify_code) { // 开启验证码,并且验证码正确,或者没有开启验证码都可以进行登陆 - // 兼容登录名和手机号登陆 - $item = DB::table('admins')->where('email', $username)->orWhere('phone', $username)->first(); - if ($item && $item->status === 1) { - $pwd = $item->password; - if (Hash::check($password, $pwd)) { - // 密码相等 -// DB::table('oauth_access_tokens')->where('user_id', $item->id)->update(['revoked' => 1]); - $result = $this->proxy($username, $password); - $admin = Admin::find($item->id); - event(new UserLogin($admin)); - return $result; - } else { - return $this->errorWithInfo('认证出错,用户名或者密码不对', 401); - } - } - } - } - - public function bind() - { - $client_id = request('uuid'); - $uid = Auth::id(); - $address = env('REGISTER_ADDRESS', '127.0.0.1:1680'); - Gateway::$registerAddress = $address; - Gateway::bindUid($client_id, $uid); - // 获得所有的client_id,删除除了该次登录的内容以外,剔除其他的客户端,前端自动的退出 - $arr = Gateway::getClientIdByUid($uid); - // 获得之前登录的所有client_id - unset($arr[array_search($client_id, $arr)]); // 剔除当前登录的client_id后剩余的client_id内容,保证永远一对一,前端用于剔除之前登录的用户 - $arr = array_values($arr); // 此操作非常重要,这样才能保证经过json编码后为数组 - if (count($arr) >= 1) { - var_dump(count($arr)); - $result = [ - 'type' => 'logout', - 'content' => null, - 'select' => 'all', - ]; - Gateway::sendToAll(json_encode($result), $arr); - } - return $this->success(); - } - - public function unBind() - { - $client_id = $this->initGateWay(); - $this->initGateWay(); - - - - } - - protected function initGateWay() - { - $address = env('REGISTER_ADDRESS', '127.0.0.1:1680'); - Gateway::$registerAddress = $address; - } - - /** - * 获取管理员信息 - * @authenticated - * @return \Illuminate\Http\JsonResponse - */ - public function me() - { - $admin = auth('api')->user(); - $data = Admin::find($admin->id); - return new \App\Http\Resources\Admin($data); - } - - /** - * 管理员退出 - * @authenticated - * @return \Illuminate\Http\JsonResponse - * 有一个黑名单过期时间(jwt里面的设置),退出之后令牌不会马上作废,根据设置是30秒的时间 - */ - public function logout() - { - if (Auth::check()) { - $id = Auth::id(); - $uuid = request('uuid', null); - // 取消client_id与uid的绑定 - if ($uuid) { - Gateway::unbindUid($uuid, $id); - Gateway::closeClient($uuid); - } - Auth::user()->token()->delete(); -// $admin = Auth::user(); -// DB::table('oauth_access_tokens')->where('user_id', $admin->id)->update(['revoked' => 1]); - return $this->successWithInfo('退出成功'); - } - } - - /** - * 刷新管理员令牌 - * @return \Illuminate\Http\JsonResponse - */ - - public function refresh(Request $request) - { - $refreshToken = $request->input('refresh_token', ''); - if (empty($refreshToken)) { - $refreshToken = $request->cookie('refreshToken'); - } - if ($refreshToken) { - $data = [ - 'grant_type' => 'refresh_token', - 'refresh_token' => $refreshToken, - 'client_id' => env('PASSPORT_CLIENT_ID'), - 'client_secret' => env('PASSPORT_CLIENT_SECRET'), - 'scope' => '', - ]; - return $this->token($data); - } else { - return $this->errorWithInfo('令牌刷新有误', 401); - } - - - } - - protected function proxy($username, $password) - { - $data = [ - 'grant_type' => 'password', - 'client_id' => env('PASSPORT_CLIENT_ID'), - 'client_secret' => env('PASSPORT_CLIENT_SECRET'), - 'username' => $username, - 'password' => $password, - 'scope' => '', - ]; - return $this->token($data); - - } - - protected function token($data = []) - { - $http = new Client(); - $url = env('APP_URL'); - $result = $http->post("$url/oauth/token", [ - 'form_params' => $data, - "verify" => false - ]); - $result = json_decode((string)$result->getBody(), true); - return response()->json([ - 'access_token' => $result['access_token'], - 'expires_in' => $result['expires_in'], - 'refresh_token' => $result['refresh_token'], - 'status' => 'success', - 'status_code' => 200 - ], 200); - } - - public function loginByPhone() - { - $verify_code = env('VERIFY_CODE', false); - $verify_result = $this->checkCode(); - if ($verify_code && is_string($verify_result)) { // 开启验证码, 但是验证码不正确,则返回错误信息 - return $this->errorWithInfo($verify_result, 400); - } - - $result = $this->verify_code(); - if (is_string($result)) { - return $this->errorWithInfo($result, 400); - } - if ((is_bool($result) && $result && $verify_code && $verify_result) || (is_bool($result) && $result && !$verify_code)) { - // 开启校验码功能后,手机验证码和图像验证码都正确了,就使用手机号码登陆 或者没有开启校验码功能,则只需要手机验证码正确了就可以登陆了 - $phone = request('phone'); - $faker = Factory::create(); - $pwd = $faker->regexify('[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}'); - $item = Admin::where('phone', $phone)->first(); - if ($item) { - // 为了能发放令牌,需要修改一个用户的密码,然后进行验证后再返回密码 - $password = $item->password; - Admin::where('phone', $phone)->update([ - 'password' => bcrypt($pwd) - ]); - $result = $this->proxy($phone, $pwd); - Admin::where('phone', $phone)->update([ - 'password' => $password - ]); - return $result; - } else { - return $this->errorWithInfo('没有指定的手机号码,无法登陆', 400); - } - } else { - return $this->errorWithInfo('验证码出错,无法登陆', 400); - } - } - - - protected function verify_code() - { - $code = request('phone_code'); - $phone = request('phone'); - $value = Cache::has($phone) ? Cache::get($phone) : false; - if ($value) { - if ((int)$value === (int)$code) { - return true; - } else { - return false; - } - } else { - return '该手机验证码已经过期,请重新发送'; - } - - } -} diff --git a/api/app/Http/Controllers/Admin/MediaController.php b/api/app/Http/Controllers/Admin/MediaController.php deleted file mode 100644 index f1beede6..00000000 --- a/api/app/Http/Controllers/Admin/MediaController.php +++ /dev/null @@ -1,37 +0,0 @@ -file('file'); - if ($request->file('file')->isValid()) { - $domain = getDomain(); - $fileName = $file->store('', 'public'); - $file = Storage::url($fileName); - $path = $domain.$file; - return $this->successWithData([ - "url" => $path - ], 201); - } else { - return $this->errorWithInfo('上传文件失败,估计是文件太大,上传超时'); - } - } -} diff --git a/api/app/Http/Controllers/Admin/ModuleController.php b/api/app/Http/Controllers/Admin/ModuleController.php deleted file mode 100644 index cef64c21..00000000 --- a/api/app/Http/Controllers/Admin/ModuleController.php +++ /dev/null @@ -1,187 +0,0 @@ - '菜单', - 'index' => '列表', - 'show' => '详情', - 'store' => '新增', - 'update' => '修改', - 'destroy' => '删除', - 'import' => '导入', - 'export' => '导出' - ]; - - protected $table = 'modules'; - /** - * 显示模块列表 - * - * @return \Illuminate\Http\Response - */ - public function index() - { - // - $data = Module::All(); - return new ModuleCollection($data); - } - - - - /** - * 新增模块信息 - * @bodyParam name string required 模块名称(英文) Example: goods - * @bodyParam desc string 模块说明(中文) Example: 商品模块 - * @bodyParam permissions array required 权限列表(数组) Example: ['index', 'show'] - * - */ - public function store(Request $request) - { - // - $data = $request->only(['name', 'desc', 'permissions']); - if (!is_bool($result = $this->validateStore($data))){ - return $this->errorWithInfo($result, 422); - } - - // 构建数据到模型和权限表里面 - DB::transaction(function() use($data){ - $data['created_at'] = Carbon::now(); - $permissions = $data['permissions']; - unset($data['permissions']); - $id = DB::table('modules')->insertGetId($data); - $result = []; - foreach($permissions as $v) { - $result [] = [ - 'name' => $v, - 'desc' => $this->arrPermissions[$v], - 'module_id' => $id, - 'created_at' => Carbon::now() - ]; - } - DB::table('permissions')->insert($result); - }); - return $this->successWithInfo('模块建立成功', 201); - } - - /** - * 显示模块详情 - * - */ - public function show(Module $module) - { - // - return new \App\Http\Resources\Module($module); - } - - - - /** - * 修改模块信息 - * @bodyParam name string required 模块名称(英文) Example: goods - * @bodyParam desc string 模块说明(中文) Example: 商品模块 - * @bodyParam permissions array required 权限列表(数组) Example: ['index', 'show'] - * - */ - public function update(Request $request, Module $module) - { - $data = $request->only(['name', 'desc', 'permissions']); - if (!is_bool($result = $this->validateUpdate($data, $module->id))){ - return $this->errorWithInfo($result, 422); - } - - // 构建数据到模型和权限表里面 - DB::transaction(function() use($data, $module){ - $data['updated_at'] = Carbon::now(); - $permissions = $data['permissions']; - unset($data['permissions']); - $id = $module->id; - $module->update($data); - - // 获取现在所有的数据 - $existPermissions= DB::table('permissions')->where('module_id', $id)->pluck('name')->toArray(); - // 同步数据,先把多余的删除掉 - $delArray = array_diff($existPermissions, $permissions); - $ids =DB::table('permissions')->where('module_id', $id)->whereIn('name', $delArray)->pluck('id')->toArray(); - RolePermission::whereIn('permission_id', $ids)->delete(); - Permission::destroy($ids); // 批量删除 - // 增加内容 - $addArray = array_diff($permissions, $existPermissions); - $result = []; - foreach($addArray as $v) { - $result [] = [ - 'name' => $v, - 'desc' => $this->arrPermissions[$v], - 'module_id' => $id, - 'created_at' => Carbon::now() - ]; -// Permission::updateOrCreate($result, $result); - } - DB::table('permissions')->insert($result); - }); - return $this->successWithInfo('模块修改成功', 201); - } - - /** - * 删除模块信息 - * - */ - public function destroy(Module $module) - { - // - DB::transaction(function() use ($module){ - $module_id = $module->id; - $ids = DB::table('permissions')->where('module_id', $module_id)->pluck('id')->toArray(); - DB::table('role_permissions')->whereIn('permission_id', $ids)->delete(); - DB::table('permissions')->where('module_id', $module_id)->delete(); - DB::table('modules')->where('id', $module->id)->delete(); - }); - } - - protected function message() - { - return [ - 'name.required' => '模块名称(name字段)不能为空', - 'name.unique' => '模块名称(name字段)不能重复', - 'permissions.required' => '权限列表(permissions字段)不能为空' - ]; - - } - - protected function storeRule() - { - return [ - 'name' => 'required|unique:modules', - 'permissions' => 'required|Array' - ]; - } - - protected function updateRule($id) - { - - return [ - 'name' => [ - 'required', - Rule::unique($this->table)->ignore($id) - ], - 'permissions' => 'required|Array' - ]; - } -} diff --git a/api/app/Http/Controllers/Admin/OauthController.php b/api/app/Http/Controllers/Admin/OauthController.php deleted file mode 100644 index 49654aa1..00000000 --- a/api/app/Http/Controllers/Admin/OauthController.php +++ /dev/null @@ -1,153 +0,0 @@ -uuid); - } - - public function redirectToProvider() - { - Cache::set('github_url', request('address')); - return Socialite::driver('github')->stateless()->redirect(); - } - - public function getUserInfoByGithub() - { - $result = Socialite::driver('github')->stateless()->user(); - $token = $result->token; - $user = $result->user; - Cache::set($token, $user['id']); - $url = Cache::get('github_url').'?token='.$token; - Header("HTTP/1.1 303 See Other"); - header("Location: ".$url); - exit(); - } - - public function redirectToGitee() - { - Cache::set('gitee_url', request('address')); - $uuid = request('uuid'); - $redirect = $this->gitee_callback."?uuid=$uuid"; - $url = "https://gitee.com/oauth/authorize?client_id=".$this->gitee_id."&redirect_uri=".$redirect."&response_type=code"; - Header("HTTP/1.1 303 See Other"); - header("Location: $url"); - exit(); - } - - public function getUserInfoByGitee() - { - - $code = request('code'); - $uuid = request('uuid'); -// $_SERVER['REDIRECT_QUERY_STRING'] = "code=$code"; -// $_SERVER['QUERY_STRING'] = "code=$code"; -// $_SERVER['REQUEST_URI'] = "/api/admin/oauth/gitee?code=$code"; -// request()->except('uuid'); - $client = new Client(); - // 根据code取得令牌 - $response = $client->request("POST", "https://gitee.com/oauth/token", [ - "form_params" => [ - 'grant_type' => 'authorization_code', - 'code' => $code, - 'client_id' => $this->gitee_id, - 'redirect_uri' => $this->gitee_callback."?uuid=$uuid", - 'client_secret' => $this->gitee_secret - ]]); - $result = json_decode($response->getBody()->getContents(), true); - $access_token = $result['access_token']; - // 根据令牌取得个人信息,并存储于缓存 - $response = $client->request("GET", "https://gitee.com/api/v5/user?access_token=$access_token"); - $result = json_decode($response->getBody()->getContents(), true); - Cache::set("gitee_$access_token", $result['id']); - Header("HTTP/1.1 303 See Other"); - broadcast(new ThreeLogin('gitee', $uuid)); - $url = Cache::get('gitee_url')."?token=$access_token"; - header("Location: ".$url); - exit(); - } - - public function index() - { - // - } - - /** - * Store a newly created resource in storage. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\Response - */ - public function store(Request $request) - { - // - } - - /** - * Display the specified resource. - * - * @param int $id - * @return \Illuminate\Http\Response - */ - public function show($id) - { - // - } - - /** - * Update the specified resource in storage. - * - * @param \Illuminate\Http\Request $request - * @param int $id - * @return \Illuminate\Http\Response - */ - public function update(Request $request, $id) - { - // - } - - /** - * Remove the specified resource from storage. - * - * @param int $id - * @return \Illuminate\Http\Response - */ - public function destroy($id) - { - // - } -} diff --git a/api/app/Http/Controllers/Admin/PermissionController.php b/api/app/Http/Controllers/Admin/PermissionController.php deleted file mode 100644 index 4e6e3e73..00000000 --- a/api/app/Http/Controllers/Admin/PermissionController.php +++ /dev/null @@ -1,85 +0,0 @@ -only(['name', 'desc', 'permissions']); - if (!is_bool($result = $this->validateStore($data))){ - return $this->errorWithInfo($result, 422); - } -// $data = $data->toArray(); - // 构建数据到角色和角色权限表里面 - DB::transaction(function() use($data){ - $data['created_at'] = Carbon::now(); - $permissions = $data['permissions']; - unset($data['permissions']); - $roleId = DB::table($this->table)->insertGetId($data); - $obj = $permissions; - $result = []; - foreach ($obj as $item) { - $moduleId = $this->getModuleIdByName($item['module']); - foreach($item['permissions'] as $v) { - $permissionId = DB::table('permissions')->where('name', $v)->where('module_id', $moduleId)->value('id'); - $result [] = [ - 'role_id' => $roleId, - 'permission_id' => $permissionId, - 'created_at' => Carbon::now() - ]; - } - } - DB::table('role_permissions')->insert($result); - }); - return $this->successWithInfo('角色建立成功', 201); - } - - /** - * 显示详情 - * - * @param \App\Models\Role $role - * @return \Illuminate\Http\Response - */ - public function show(Role $role) - { - return new \App\Http\Resources\Role($role); - } - - - /** - * 更新角色 - * @bodyParam name string required 角色名称 Example: manger - * @bodyParam desc string optional 角色说明 Example: 运营者 - * @bodyParam permissions array required 权限列表 Example: [{"module": "goods", "permissions":["index", "show"]}] - */ - public function update(Request $request, Role $role) - { - // - $data = $request->only(['name', 'desc', 'permissions']); - if (!is_bool($result = $this->validateUpdate($data, $role->id))){ - return $this->errorWithInfo($result, 422); - } - - DB::transaction(function() use($data, $role){ - $permissions = $data['permissions']; - // 已经存在的功能组权限 - $existPermissions = DB::table('role_permissions')->where('role_id', $role->id)->pluck('permission_id')->toArray(); - // 获取读取的需要设置的权限 - $arrPermissions = []; - - foreach ($permissions as $item) { - $moduleId = DB::table('modules')->where('name', $item['module'])->value('id'); - $readPermissions = DB::table('permissions')->where('module_id', $moduleId)->whereIn('name', $item['permissions'])->pluck('id')->toArray(); - $arrPermissions = array_merge($arrPermissions, $readPermissions); - } - $result = []; - // 需要增加的 - $arrTemp1 = array_diff($arrPermissions, $existPermissions); - // 必须删除的 - $arrTemp2 = array_diff($existPermissions, $arrPermissions); - foreach ($arrTemp1 as $v){ - $result [] = [ - 'role_id' => $role->id, - 'permission_id' => $v, - 'created_at' => Carbon::now() - ]; - } - if (count($result)>=0) { - DB::table('role_permissions')->insert($result); - } - DB::table('role_permissions')->whereIn('permission_id', $arrTemp2)->where('role_id', $role->id)->delete(); - }); - return $this->successWithInfo('模块修改成功', 200); - - } - - /** - * 删除角色信息 * - * @param \App\Models\Role $role - * @return \Illuminate\Http\Response - */ - public function destroy(Role $role) - { - // - if ($role->name !== "admin") { - DB::transaction(function() use($role){ - DB::table('admin_roles')->where('role_id', $role->id)->delete(); - DB::table('role_permissions')->where('role_id', $role->id)->delete(); - $role->delete(); - }); - return $this->successWithInfo('角色删除成功'); - } else { - return $this->errorWithInfo('无法删除超级管理员角色', 400); - } - - } - - protected function getModuleIdByName($name) { - $id = DB::table('modules')->where('name', $name)->value('id'); - return $id; - } - - protected function message() - { - return [ - 'name.required' => '模块名称(name字段)不能为空', - 'name.unique' => '模块名称(name字段)不能重复', - 'permissions.required' => '权限列表(permissions字段)不能为空', - 'permissions.array' => '权限列表(permissions字段)类型必须为数组' - ]; - - } - - protected function storeRule() - { - return [ - 'name' => 'required|unique:modules', - 'permissions' => 'required|array' - ]; - } - - protected function updateRule($id) - { - - return [ - 'name' => [ - 'required', - Rule::unique($this->table)->ignore($id) - ], - 'permissions' => 'required|array' - ]; - } - -} diff --git a/api/app/Http/Controllers/Admin/RolePermissionController.php b/api/app/Http/Controllers/Admin/RolePermissionController.php deleted file mode 100644 index df31073c..00000000 --- a/api/app/Http/Controllers/Admin/RolePermissionController.php +++ /dev/null @@ -1,85 +0,0 @@ -value('id'); - $address = env('REGISTER_ADDRESS', '127.0.0.1:1680'); - Gateway::$registerAddress = $address; - $client_id = request('uuid'); // 获取现在接入的用户 - Gateway::joinGroup($client_id, "services"); // 把现在的用户接入到客服组,客户退出等可以同时进行通知 - if (Gateway::isUidOnline($uid)) { - // 获得客服对应的client_id,用于发送信息 - $arr = Gateway::getClientIdByUid($uid); - if (count($arr) === 1) { - // uid与client_id 一对一,才能找到指定的session,获得是否注册为客服 - $customer_client_id = array_pop($arr); // 客服的client_id - $session = Gateway::getSession($customer_client_id); - if (key_exists("is_customer", $session) && $session['is_customer']) { - // 登记用户信息进入组 - $user = Auth::user(); - $data = [ - 'name' => $user->email, - 'avatar' => $user->avatar, - 'client_id' => $client_id, - "type" => 'userLogin', - 'content' => null, - 'select' => 'all' - ]; - Gateway::sendToClient($customer_client_id, json_encode($data)); - return $this->successWithInfo("已经有客服存在"); - } else { - return $this->errorWithInfo('客服在线但没有登录客服页面,请稍后', 400); - } - } else { - return $this->error(); - } - } else { - return $this->errorWithInfo("客服已经下班,无法咨询。", 400); - } - } - - public function leave() - { - /** - * 客户离开,则我们进行相应的处理 - * 1.退出组 - * 2.提示客服,某个用户已经下线 - */ - // 退出组 - $address = env('REGISTER_ADDRESS', '127.0.0.1:1680'); - Gateway::$registerAddress = $address; - $client_id = $this->getWebsocketClientId(); // 获取现在接入的用户 - Gateway::leaveGroup($client_id, "services"); // 把现在的用户接入到客服组,用户对退出等进行通知 - // 提醒客服,我已经退出 - $customer_client_id = $this->getCustomerClientId(); - $data = [ - 'client_id' => $client_id, - "type" => 'userLogout', - 'content' => null, - 'select' => 'all' - ]; - Gateway::sendToClient($customer_client_id, json_encode($data)); - return $this->success(); - } - - protected function getCustomerClientId() - { - $customer = ENV("CUSTOMER", "admin"); - $uid = Admin::where('email', $customer)->value('id'); - $arr = Gateway::getClientIdByUid($uid); - // uid与client_id 一对一,才能找到指定的session,获得是否注册为客服 - $customer_client_id = array_pop($arr); // 客服的client_id - return $customer_client_id; - } - - protected function initGateWay() - { - $address = env('REGISTER_ADDRESS', '127.0.0.1:1680'); - Gateway::$registerAddress = $address; - } - - public function customer() - { - $customer = ENV("CUSTOMER", "admin"); - return $this->successWithData([ - "customer" => $customer - ]); - } - - // 客服在线注册 - public function register() - { - // 在client_id 对应的session中登记为客服,因为用户即使在线,有时候也没有打开这个页面 - // 所以不一定是客户,这就要求用户进入到页面后,会自动的注册登记 - $uid = Auth::id(); - $address = env('REGISTER_ADDRESS', '127.0.0.1:1680'); - Gateway::$registerAddress = $address; - if (Gateway::isUidOnline($uid)) { - $arr = Gateway::getClientIdByUid($uid); - $client_id = $arr[0]; - Gateway::updateSession($client_id, [ - 'is_customer' => true - ]); - $data = [ - 'type' => "customerLogin", - 'select' => "all", - "name" => Auth::user()->email - ]; - Gateway::sendToGroup("services", json_encode($data)); - return $this->success(); - } else { - return $this->errorWithInfo("客服注册失败。"); - } - - } - - public function unRegister() - { - // 客服取消注册在线 - // 前端退出页面的时候,取消客服注册 - - $client_id = request('uuid'); - $address = env('REGISTER_ADDRESS', '127.0.0.1:1680'); - Gateway::$registerAddress = $address; - Gateway::updateSession($client_id, [ - 'is_customer' => false - ]); - $data = [ - 'type' => "customerLogout", - 'select' => "all" - ]; - Gateway::sendToGroup("services", json_encode($data)); - return $this->success(); - } - // 普通用户发送数据给客服 - public function sendDataToCustomer() - { - $data = request()->only(['name', 'content', 'time']); - $this->initGateWay(); - $client_id = $this->getWebsocketClientId(); - $customer_client_id = $this->getCustomerClientId(); - $admin_id = (int)Gateway::getUidByClientId($client_id); - $customer_admin_id = (int)Gateway::getUidByClientId($customer_client_id); - $data["select"] = "all"; - $data["type"] = "userSay"; - Gateway::sendToClient($customer_client_id, json_encode($data)); - return $this->success(); - - } - // 客服发送数据给用户 - public function sendDataToUser() - { - $data = request()->only(['name', 'content', 'time', 'avatar']); - $client_id = request('client_id'); - $this->initGateWay(); - $data["select"] = "all"; - $data["type"] = "customerSay"; - Gateway::sendToClient($client_id, json_encode($data)); - return $this->success(); - - } - - public function index() - { - // - } - - /** - * Store a newly created resource in storage. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\Response - */ - public function store(Request $request) - { - // - } - - /** - * Display the specified resource. - * - * @param int $id - * @return \Illuminate\Http\Response - */ - public function show($id) - { - // - } - - /** - * Update the specified resource in storage. - * - * @param \Illuminate\Http\Request $request - * @param int $id - * @return \Illuminate\Http\Response - */ - public function update(Request $request, $id) - { - // - } - - /** - * Remove the specified resource from storage. - * - * @param int $id - * @return \Illuminate\Http\Response - */ - public function destroy($id) - { - // - } -} diff --git a/api/app/Http/Controllers/Admin/SmsController.php b/api/app/Http/Controllers/Admin/SmsController.php deleted file mode 100644 index ffb42f79..00000000 --- a/api/app/Http/Controllers/Admin/SmsController.php +++ /dev/null @@ -1,116 +0,0 @@ -isHasCode($phone))) { - } else { - $code = mt_rand(100000, 999999); - $time = now()->addMinutes($this->ttl); - Cache::add($phone, $code, $time); - } - // 发送手机短信 - if (config('app.debug')) { - return $this->successWithInfo("验证码是:".$code.",请在".$this->ttl."分钟内输入"); - } else { - $this->sendVerifyCode($phone, $code); - return $this->successWithInfo("验证码已经发送到指定手机,请在".$this->ttl."分钟内输入"); - } - } - - protected function isHasCode($key) { - return Cache::has($key)? Cache::get($key):false; - } - - protected function sendVerifyCode($phone, $value) { - $data = [ - 'code' => $value - ]; - // 发送真实数据至手机 - $this->sendInfo($phone, $data, 'template_001'); - } - - protected function sendInfo($phone, $data, $template = '') { - $config = [ - // HTTP 请求的超时时间(秒) - 'timeout' => 5.0, - - // 默认发送配置 - 'default' => [ - // 网关调用策略,默认:顺序调用 - 'strategy' => \Overtrue\EasySms\Strategies\OrderStrategy::class, - - // 默认可用的发送网关 - 'gateways' => [ - 'juhe', 'qcloud', - ], - ], - // 可用的网关配置 - 'gateways' => [ - 'errorlog' => [ - 'file' => '/www/wwwroot/easy-sms.log', - ], - 'juhe' => [ // 聚合数据的配置 - 'app_key' => '163a137975527e3b6eaca21d701e71c0', - ], - 'qcloud' => [ // 腾讯云配置 - 'sdk_app_id' => '', // SDK APP ID - 'app_key' => '', // APP KEY - 'sign_name' => '', // 短信签名,如果使用默认签名,该字段可缺省(对应官方文档中的sign) - ] - ], - ]; - $easySms = new EasySms($config); - - $easySms->send($phone, [ - 'content' => '', - 'template' => $template, - 'data' => $data, - ]); - } - - /** - * 校验手机验证码 - * @bodyParam phone string required 手机号码 - * @bodyParam code string required 验证码 - */ - public function verify_code() - { - $code = reqest('phone_code'); - $phone = request('phone'); - - if ($value = $this->isHasCode($phone)) { - if ((int)$value === (int)$code){ - return $this->successWithInfo('验证码正确,谢谢使用'); - } else { - return $this->errorWithInfo('输入的验证码不正确,请仔细查看'); - } - } else { - return $this->errorWithInfo('该手机验证码已经过期,请重新发送',404); - } - - } - - -} diff --git a/api/app/Http/Controllers/Admin/TableConfigController.php b/api/app/Http/Controllers/Admin/TableConfigController.php deleted file mode 100644 index b454427b..00000000 --- a/api/app/Http/Controllers/Admin/TableConfigController.php +++ /dev/null @@ -1,400 +0,0 @@ -resource([]); - } - - $result = $this->model::where('table_name', $table_name)->orderBy('form_order', 'asc')->get(); - if (count($result) > 0) { - return new $this->resource($result); - } - // 没有该表对应的配置信息,则需要从远程数据库同步并保存起来 - - $data = $this->getTableInfo($table_name); - // 写入数据表后再读写出来 - $this->model::insert($data); - $pageSize = request('pageSize', count($data)); - $result = $this->model::where('table_name', $table_name)->orderBy('form_order', 'asc')->paginate($pageSize); - return new $this->resourceCollection($result); - - //计算每页分页的初始位置 //每页的条数 - $page = $request->page ?: 1; - $pageSize = request('pageSize', count($content)); - $offset = ($page * $pageSize) - $pageSize; - $result = new LengthAwarePaginator(array_slice($content, $offset, $pageSize, true), count($content), $pageSize, $page); - return new $this->resourceCollection($result); - } - - protected function getListData($pageSize) - { - // 当前列表数据 对应于原来的index - $data = $this->model::paginate($pageSize); - return new $this->resourceCollection($data); - } - - protected function getTableInfo($table_name) - { - $dbName = env('DB_DATABASE'); - $sql = <<select($sql); - $data = []; - foreach ($content as $v) { - $content = (array)$v; - $content['created_at'] = Carbon::now(); - $data [] = $content; - - } - return $data; - } - - public function getColumnByTable() - { - $table = request('table'); - $result = $this->getTableInfo($table); - $data = []; - foreach ($result as $v) { - $data[] = $v['column_name']; - } - return $this->successWithData($data); - } - - - public function show($id) - { - $data = $this->model::find($id); - return new $this->resource($data); - } - - - public function store(Request $request) - { -// 1. 获取前端数据 - - $data = $request->only($this->fillable); -// 2. 验证数据 - if (method_exists($this, 'message')) { - $validator = Validator::make($data, $this->storeRule(), $this->message()); - } else { - $validator = Validator::make($data, $this->storeRule()); - } - - if ($validator->fails()) { - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } -// 3.数据无误,进一步处理后保存到数据表里面,有的表需要处理,有的不需要 - $data = $this->storeHandle($data); - if ($this->model::create($data)) { - return $this->successWithInfo('新增数据成功', 201); - } else { - return $this->error(); - } - } - - - protected function storeHandle($data) - { - return $data; // TODO: Change the autogenerated stub - } - - protected function getErrorInfo($validator) - { - $errors = $validator->errors(); - $errorTips = ''; - foreach ($errors->all() as $message) { - $errorTips = $errorTips . $message . ','; - } - $errorTips = substr($errorTips, 0, strlen($errorTips) - 1); - return $errorTips; - } - - - public function update(Request $request, $id) - { - $action = request('action', null); - if ($action === null) { - return $this->error(); - } - if ($action === 'modify') { - $data = json_decode(request('data')); - $bool = false; - DB::transaction(function () use ($data, &$bool) { - foreach ($data as $v) { - $v = (array)$v; - $v['updated_at'] = Carbon::now(); - $this->model::where('id', $v['id'])->update($v); - } - $bool = true; - }); - if ($bool) { - return $this->successWithInfo("详细设置保存完成"); - } else { - return $this->errorWithInfo("详细设置保存失败"); - } - } - - if ($action === 'sync') { - $table_name = request('table'); - $data = $this->getTableInfo($table_name); - // 删除多余的,数据表里面没有的 - $newColumns = []; - foreach ($data as $v) { - $newColumns [] = $v['column_name']; - } - $oldColumns = $this->model::where('table_name', $table_name)->pluck('column_name')->toArray(); - $handleColumns = array_diff($oldColumns, $newColumns); - $this->model::where('table_name', $table_name)->whereIn('column_name', $handleColumns)->delete(); - // 要添加的列 - $handleColumns = array_diff($newColumns, $oldColumns); - $addData = []; - foreach ($data as $v) { - if (in_array($v['column_name'], $handleColumns)) { - $addData [] = $v; - } - } - $this->model::insert($addData); - return $this->success(); - } - - - $data = $request->only($this->fillable); - if (method_exists($this, 'message')) { - $validator = Validator::make($data, $this->updateRule($id), $this->message()); - } else { - $validator = Validator::make($data, $this->updateRule($id)); - } - if ($validator->fails()) { - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } - // 进一步处理数据 - $data = $this->updateHandle($data); - // 更新到数据表 - if ($this->model::where('id', $id)->update($data)) { - return $this->successWithInfo('数据更新成功'); - } else { - return $this->errorWithInfo('数据更新失败'); - } - } - - protected function updateHandle($data) - { - return $data; - } - - public function destroy($id) - { - if ($this->destroyHandle($id)) { - return $this->successWithInfo('数据删除成功', 204); - } else { - return $this->errorWithInfo('数据删除失败,请查看指定的数据是否存在'); - } - } - - protected function destroyHandle($id) - { - DB::transaction(function () use ($id) { - // 删除逻辑 注意多表关联的情况 - $this->model::where('id', $id)->delete(); - }); - return true; - } - - public function deleteAll() - { - // 前端利用json格式传递数据 - $ids = json_decode(request()->input('ids'), true); - foreach ($ids as $id) { - $this->destoryHandle($id); - } - return $this->successWithInfo('批量删除数据成功', 204); - } - - - public function export() - { - $data = $this->model::all(); - $data = $data->toArray(); - $arr = $this->exportHandle($data); - $data = collect($arr); - $fileName = time() . '.xlsx'; - $file = 'xls\\' . $fileName; - (new FastExcel($data))->export($file); - return $this->successWithInfo($file); - } - - protected function exportHandle($arrData) - { - // 默认会根据$map进行处理, - $arr = []; - foreach ($arrData as $item) { - $tempArr = $this->handleItem($item, 'export'); - // 根据需要$tempArr可以进一步处理,特殊的内容,默认$tempArr是根据$this->map来处理 - $arr[] = $tempArr; - } - return $arr; - } - - - /** - * 根据map表,处理数据 - * @param $data - */ - protected function handleItem($data, $type = 'export') - { - $arr = []; - if ($type === 'export') { - foreach ($this->map as $key => $item) { - if (!isset($data[$item])) { - continue; - } - $arr[$key] = $data[$item]; - } - } - if ($type === 'import') { - foreach ($this->map as $key => $item) { - if (!isset($data[$key])) { - continue; - } - $arr[$item] = $data[$key]; - } - } - return $arr; - } - - - public function import() - { -// 1.接收文件,打开数据 -// 2. 处理打开的数据,循环转换 -// 3. 导入到数据库 - $data = (new FastExcel())->import(request()->file('file')); - $arrData = $data->toArray(); - $arr = $this->importHandle($arrData); - $this->model::insert($arr['successData']); - $tips = '当前操作导入数据成功' . $arr['successCount'] . '条'; - if ($arr['isError']) { - // 有失败的数据,无法插入,要显示出来,让前端能下载 - $file = time() . '.xlsx'; - $fileName = public_path('xls') . '\\' . $file; - $file = 'xls\\' . $file; - $data = collect($arr['errorData']); - (new FastExcel($data))->export($fileName); - $tips .= ',失败' . $arr['errorCount'] . '条'; - return response()->json([ - 'info' => $tips, - 'fileName' => $file, - 'status' => 'error', - 'status_code' => 422 - ], 422); - } else { - return $this->successWithInfo($tips, 201); - } - } - - protected function importHandle($arrData) - { -// 1. 要对每一条记录进行校验 - -// 2. 根据校验的结果,计算出可以导入的条数,以及错误的内容 - - $error = []; // 错误的具体信息 - $isError = false; // 是否存在信息错误 - $successCount = 0; // 统计数据导入成功的条数 - $errorCount = 0; // 出错的条数 - $arr = []; // 正确的内容存储之后,返回数据 - foreach ($arrData as $key => $item) { - $data = $this->handleItem($item, 'import'); - $data['created_at'] = Carbon::now(); - // 可以根据需要,进一步处理数据 - $this->validatorData($item, $data, $error, $isError, $successCount, $errorCount, $arr); - } - return [ - 'successData' => $arr, - 'errorData' => $error, - 'isError' => $isError, - 'errorCount' => $errorCount, - 'successCount' => $successCount, - ]; - } - - - protected function validatorData($item, $data, &$error, &$isError, &$successCount, &$errorCount, &$arr) - { - if (method_exists($this, 'message')) { - $validator = Validator::make($data, $this->storeRule(), $this->message()); - } else { - $validator = Validator::make($data, $this->storeRule()); - } - if ($validator->fails()) { - // 获取相关的错误信息,并且把错误信息单独存放 - $errors = $validator->errors($validator); - $tips = ''; - foreach ($errors->all() as $message) { - $tips .= $message . ','; - } - $tips = substr($tips, 0, strlen($tips) - 1); - // 状态信息 - $item['错误原因'] = $tips; - $error[] = $item; - $isError = true; - $errorCount++; - } else { - // 没有出错的,我们先存在正确的数组 - $arr[] = $data; - $successCount++; - } - } - - - protected function storeRule() - { - return []; - } - - protected function UpdateRule($id) - { - return []; - } - - - protected function message() - { - return []; - } - -} diff --git a/api/app/Http/Controllers/Admin/TableController.php b/api/app/Http/Controllers/Admin/TableController.php deleted file mode 100644 index b2215f51..00000000 --- a/api/app/Http/Controllers/Admin/TableController.php +++ /dev/null @@ -1,826 +0,0 @@ - 'VIEW' - SQL; - $sql = str_replace('$dbName', $dbName, $sql); - $tables = DB::connection("super")->select($sql); - $myTable = array_filter($tables, function ($table) { - return in_array($table->table_name, $this->systemTable) ? false : true; - }); - $data = array_values($myTable); - $page = $request->page ?: 1; - //每页的条数 - $pageSize = request('pageSize', 10); - //计算每页分页的初始位置 - $offset = ($page * $pageSize) - $pageSize; - $result = new LengthAwarePaginator(array_slice($data, $offset, $pageSize, true), count($data), $pageSize, $page); - return new $this->resourceCollection($result); - } - - protected function getListData($pageSize) - { - // 当前列表数据 对应于原来的index - $data = $this->model::paginate($pageSize); - return new $this->resourceCollection($data); - } - - public function getAllTable() - { - // 获取数据库中的所有的表,除去系统需要的表 - $dbName = env('DB_DATABASE'); - $sql = << 'VIEW' - SQL; - $tables = DB::connection("super")->select($sql); - $data = []; - foreach ($tables as $table) { - if (!in_array($table->table_name, $this->systemTable)) { - $data [] = $table->table_name; - } - } - return $this->successWithData($data); - - } - - - public function show($id) - { - if ($id >= 1) { - $result = $this->model::find($id); - } else { - $result = $this->getResultByTable(); - } - return new $this->resource($result); - } - - protected function getResultByTable() - { - $table_name = request('table_name'); - $result = $this->model::where('table_name', $table_name)->first(); - if (!$result) { - $data = request()->only($this->fillable); - $len = strlen($table_name); - if ($table_name[$len - 1] === "s") { - $front_model = substr($table_name, 0, $len - 1); // 去掉复数形式 - $back_model = ucfirst($front_model); // 首字母大写 - $component = $back_model . 'Index'; - $config = [ - 'back_model' => $back_model, - 'back_routes' => $table_name, - 'front_model' => $front_model, - 'front_component_name' => $component - ]; - } else { - $back_model = ucfirst($table_name); // 首字母大写 - $component = $back_model . 'Index'; - $config = [ - 'back_model' => $back_model, - 'back_routes' => $table_name . 's', - 'front_model' => $table_name, - 'front_component_name' => $component - ]; - - } - $data['create_time'] = Carbon::createFromFormat('Y-m-d H:i:s', $data['create_time']); - $data['table_config'] = json_encode($config); - $id = $this->model::insertGetId($data); - $result = $this->model::find($id); - } - - return $result; - } - - public function store(Request $request) - { -// 1. 获取前端数据 - - $data = $request->only($this->fillable); -// 2. 验证数据 - if (method_exists($this, 'message')) { - $validator = Validator::make($data, $this->storeRule(), $this->message()); - } else { - $validator = Validator::make($data, $this->storeRule()); - } - - if ($validator->fails()) { - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } -// 3.数据无误,进一步处理后保存到数据表里面,有的表需要处理,有的不需要 - $data = $this->storeHandle($data); - if ($this->model::create($data)) { - return $this->successWithInfo('新增数据成功', 201); - } else { - return $this->error(); - } - } - - - protected function storeHandle($data) - { - return $data; // TODO: Change the autogenerated stub - } - - protected function getErrorInfo($validator) - { - $errors = $validator->errors(); - $errorTips = ''; - foreach ($errors->all() as $message) { - $errorTips = $errorTips . $message . ','; - } - $errorTips = substr($errorTips, 0, strlen($errorTips) - 1); - return $errorTips; - } - - - public function update(Request $request, $id) - { - $action = request('action', 'default'); - if ($action === 'default') { - // 普通的保存信息 - $data = $request->only($this->fillable); - if (method_exists($this, 'message')) { - $validator = Validator::make($data, $this->updateRule($id), $this->message()); - } else { - $validator = Validator::make($data, $this->updateRule($id)); - } - if ($validator->fails()) { - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } - // 进一步处理数据 - $data = $this->updateHandle($data); - // 更新到数据表 - if ($this->model::where('id', $id)->update($data)) { - return $this->successWithInfo('数据更新成功'); - } else { - return $this->errorWithInfo('数据更新失败'); - } - } - } - - public function download() - { - $result = $this->getResultByTable(); - $config = $result->table_config; - $tableName = $result->table_name; - $this->createDir($tableName, $config['front_model']); - $snippet = CodeSnippet::whereNotNull('name')->first(); - $tableConfig = TableConfig::where('table_name', $tableName)->orderBy('form_order', "asc")->get(); - $columns = $tableConfig->pluck('column_name')->toArray(); - // 后端控制器的填充数据处理 - $fillable = "[]"; - if (count($columns) >= 0) { - $str = ''; - foreach ($columns as $v) { - $str = $str . "'" . $v . "', "; - } - // 去除最后一个的,和空格 - $str = substr($str, 0, strlen($str) - 2); - $fillable = "[" . $str . "]"; - } - // 处理后端控制器数据 - $code = $this->createCodeBySnippet($snippet->back_api, $config); - $code = str_replace("##fillable##", $fillable, $code); - // 查询 - $format = "\$this->model::paginate(\$pageSize)"; - $value = ''; - foreach ($tableConfig as $v) { - if ($v->query_type) { - $title = ucfirst($v->column_name); - $content = << - STR; - $value = $value . $content; - } - } - $value = "\$this->model::".trim($value)."paginate(\$pageSize)"; - $code = str_replace($format, $value, $code); - $fileName = $config['back_model'] . 'Controller.php'; - $path = 'api/app/Http/Controllers/Admin'; - file_put_contents(public_path('code/' . $tableName . '/' . $path) . "/$fileName", $code); - // 后端模型 - $code = $this->createCodeBySnippet($snippet->back_model, $config); - // 模型中的条件 - $format = "##scopeItem##"; - $value = ''; - foreach ($tableConfig as $v) { - if ($v->query_type) { - switch ($v->query_type) { - case "=": - $title = ucfirst($v->column_name); - $content = <<input('$v->column_name'); - if (\$params) { - return \$query = \$query->where('$v->column_name', \$params); - } else { - return \$query; - } - } - -STR; - break; - case "like": - $title = ucfirst($v->column_name); - $content = <<input('$v->column_name'); - if (\$params) { - return \$query = \$query->where('$v->column_name', 'like', "%".\$params."%"); - } else { - return \$query; - } - } - -STR; - - break; - case "<>": - $title = ucfirst($v->column_name); - $content = <<input('$v->column_name'); - if (\$params) { - return \$query = \$query->where('$v->column_name', '<>', \$params); - } else { - return \$query; - } - } - -STR; - break; - case "null": - $title = ucfirst($v->column_name); - $content = <<input('$v->column_name'); - if (\$params) { - return \$query = \$query->whereNull('$v->column_name'); - } else { - return \$query; - } - } - -STR; - break; - case "notnull": - $title = ucfirst($v->column_name); - $content = <<input('$v->column_name'); - if (\$params) { - return \$query = \$query->whereNotNull('$v->column_name'); - } else { - return \$query; - } - } - -STR; - break; - } - $value = $value . $content; - } - } - $code = str_replace($format, $value, $code); - - $fileName = $config['back_model'] . '.php'; - $path = 'api/app/Models'; - file_put_contents(public_path('code/' . $tableName . '/' . $path) . "/$fileName", $code); - // 后端资源文件文件 - $code = $this->createCodeBySnippet($snippet->back_resource, $config); - $fileName = $config['back_model'] . '.php'; - $path = 'api/app/Http/Resources'; - file_put_contents(public_path('code/' . $tableName . '/' . $path) . "/$fileName", $code); - // 后端资源集合文件 - $resourceCollectionCode = file_get_contents(base_path('app/Http/Resources') . '/TemplateCollection.php'); - $code = str_replace("##name##", $config['back_model'], $resourceCollectionCode); - $fileName = $config['back_model'] . 'Collection.php'; - file_put_contents(public_path('code/' . $tableName . '/' . $path) . "/$fileName", $code); - // 建立路由代码段 - $code = $this->createCodeBySnippet($snippet->back_routes, $config); - $apiCode = file_get_contents(base_path('routes') . '/api.php'); - $code = $apiCode . $code; - $path = "api/routes"; - file_put_contents(public_path('code/' . $tableName . '/' . $path) . "/api.php", $code); - // 后端处理完成,处理前端 - // 前端api - $path = 'element/src/api'; - $code = $this->createCodeBySnippet($snippet->front_api, $config); - $fileName = $config['front_model'] . '.js'; - file_put_contents(public_path('code/' . $tableName . '/' . $path) . "/$fileName", $code); - // 前端模型 - $path = 'element/src/model'; - $code = $this->createCodeBySnippet($snippet->front_model, $config); - - // 校验规则处理,主要是增加了必填选项 - $format = "##rules##"; - $value = ''; - foreach ($tableConfig as $v) { - if ($v->is_required) { - $content = <<column_name: [{ required: true, message: "请输入$v->column_comment", trigger: "blur" }], - - STR; - $value = $value . $content; - } - } - $code = str_replace($format, $value, $code); - - // 新增模型的处理 - $format = "##newModel##"; - $value = ''; - if (count($columns) >= 0) { - foreach ($columns as $v) { - $content = <<query_type) { - $content = <<column_name = null - - STR; - $value = $value . $content; - } - } - $code = str_replace($format, $value, $code); - - $fileName = $config['front_model'] . '.js'; - file_put_contents(public_path('code/' . $tableName . '/' . $path) . "/$fileName", $code); - // 前端页面 - - $code = $this->createCodeBySnippet($snippet->front_page, $config); - // 前端表单列表的处理 - $format = "##columnInfo##"; - $value = ''; - foreach ($tableConfig as $v) { - if ($v->is_list) { - $content = << - - STR; - $value = $value . $content; - } - } - $code = str_replace($format, $value, $code); - // 前端表单对话框的处理 - $format = "##formItem##"; - $value = ''; - foreach ($tableConfig as $v) { - if ($v->is_form) { - switch ($v->form_type) { - case "textarea": - $content = << - - - - - - STR; - break; - case "radio": - $content = << - - - - - - - STR; - break; - case "select": - $content = << - - - - - - - - - STR; - break; - case "date": - $content = << - - - - - - STR; - break; - case "datetime": - $content = << - - - - - - STR; - break; - default: - $content = << - - - - - - STR; - } - - - $value = $value . $content; - } - } - $code = str_replace($format, $value, $code); - // 搜索页面的表单 - $format = "##searchItem##"; - $value = ''; - foreach ($tableConfig as $v) { - if ($v->query_type) { - switch ($v->form_type) { - case 'datetime': - $content = << - - - - - STR; - break; - case 'date': - $content = << - - - - - STR; - break; - case 'select': - case 'radio': - $content = << - - - - - - - STR; - break; - default: - $content = << - - - - - STR; - } - $value = $value . $content; - } - } - $code = str_replace($format, $value, $code); - - $fileName = 'index.vue'; - $path = "element/src/views/" . $config['front_model']; - $file = public_path('code/' . $tableName . '/' . $path) . "/$fileName"; - file_put_contents($file, $code); - $zip = public_path("code/$tableName.zip");//压缩文件名,自己命名 - HZip::zipDir(public_path("code/$tableName"), $zip); - return response()->download($zip, basename($zip))->deleteFileAfterSend(true); - } - - public function createDir($tableName, $front_model_name) - { - // 建立保存文件的目录 - $controller = 'api/app/Http/Controllers/Admin'; - $model = 'api/app/Models'; - $routes = "api/routes"; - $resource = 'api/app/Http/Resources'; - $api = 'element/src/api'; - $front_model = 'element/src/model'; - $page = 'element/src/views'; - if (Storage::disk('code')->exists($tableName)) { - Storage::disk('code')->deleteDirectory($tableName); - } - Storage::disk('code')->makeDirectory($tableName); - Storage::disk('code')->makeDirectory($tableName . '/' . $controller); - Storage::disk('code')->makeDirectory($tableName . '/' . $model); - Storage::disk('code')->makeDirectory($tableName . '/' . $routes); - Storage::disk('code')->makeDirectory($tableName . '/' . $resource); - Storage::disk('code')->makeDirectory($tableName . '/' . $api); - Storage::disk('code')->makeDirectory($tableName . '/' . $front_model); - Storage::disk('code')->makeDirectory($tableName . '/' . $page . '/' . $front_model_name); - - } - - protected function createCodeBySnippet($code, $config) - { - $keys = array_keys($config); - foreach ($keys as $key) { - $format = "##" . $key . "##"; - $value = $config[$key]; - $code = str_replace($format, $value, $code); - } - return $code; - } - - protected function updateHandle($data) - { - return $data; - } - - public function destroy($id) - { - if ($this->destroyHandle($id)) { - return $this->successWithInfo('数据删除成功', 204); - } else { - return $this->errorWithInfo('数据删除失败,请查看指定的数据是否存在'); - } - } - - protected function destroyHandle($id) - { - DB::transaction(function () use ($id) { - // 删除逻辑 注意多表关联的情况 - $this->model::where('id', $id)->delete(); - }); - return true; - } - - public function deleteAll() - { - // 前端利用json格式传递数据 - $ids = json_decode(request()->input('ids'), true); - foreach ($ids as $id) { - $this->destoryHandle($id); - } - return $this->successWithInfo('批量删除数据成功', 204); - } - - - public function export() - { - $data = $this->model::all(); - $data = $data->toArray(); - $arr = $this->exportHandle($data); - $data = collect($arr); - $fileName = time() . '.xlsx'; - $file = 'xls\\' . $fileName; - (new FastExcel($data))->export($file); - return $this->successWithInfo($file); - } - - protected function exportHandle($arrData) - { - // 默认会根据$map进行处理, - $arr = []; - foreach ($arrData as $item) { - $tempArr = $this->handleItem($item, 'export'); - // 根据需要$tempArr可以进一步处理,特殊的内容,默认$tempArr是根据$this->map来处理 - $arr[] = $tempArr; - } - return $arr; - } - - - /** - * 根据map表,处理数据 - * @param $data - */ - protected function handleItem($data, $type = 'export') - { - $arr = []; - if ($type === 'export') { - foreach ($this->map as $key => $item) { - if (!isset($data[$item])) { - continue; - } - $arr[$key] = $data[$item]; - } - } - if ($type === 'import') { - foreach ($this->map as $key => $item) { - if (!isset($data[$key])) { - continue; - } - $arr[$item] = $data[$key]; - } - } - return $arr; - } - - - public function import() - { -// 1.接收文件,打开数据 -// 2. 处理打开的数据,循环转换 -// 3. 导入到数据库 - $data = (new FastExcel())->import(request()->file('file')); - $arrData = $data->toArray(); - $arr = $this->importHandle($arrData); - $this->model::insert($arr['successData']); - $tips = '当前操作导入数据成功' . $arr['successCount'] . '条'; - if ($arr['isError']) { - // 有失败的数据,无法插入,要显示出来,让前端能下载 - $file = time() . '.xlsx'; - $fileName = public_path('xls') . '\\' . $file; - $file = 'xls\\' . $file; - $data = collect($arr['errorData']); - (new FastExcel($data))->export($fileName); - $tips .= ',失败' . $arr['errorCount'] . '条'; - return response()->json([ - 'info' => $tips, - 'fileName' => $file, - 'status' => 'error', - 'status_code' => 422 - ], 422); - } else { - return $this->successWithInfo($tips, 201); - } - } - - protected function importHandle($arrData) - { -// 1. 要对每一条记录进行校验 - -// 2. 根据校验的结果,计算出可以导入的条数,以及错误的内容 - - $error = []; // 错误的具体信息 - $isError = false; // 是否存在信息错误 - $successCount = 0; // 统计数据导入成功的条数 - $errorCount = 0; // 出错的条数 - $arr = []; // 正确的内容存储之后,返回数据 - foreach ($arrData as $key => $item) { - $data = $this->handleItem($item, 'import'); - $data['created_at'] = Carbon::now(); - // 可以根据需要,进一步处理数据 - $this->validatorData($item, $data, $error, $isError, $successCount, $errorCount, $arr); - } - return [ - 'successData' => $arr, - 'errorData' => $error, - 'isError' => $isError, - 'errorCount' => $errorCount, - 'successCount' => $successCount, - ]; - } - - - protected function validatorData($item, $data, &$error, &$isError, &$successCount, &$errorCount, &$arr) - { - if (method_exists($this, 'message')) { - $validator = Validator::make($data, $this->storeRule(), $this->message()); - } else { - $validator = Validator::make($data, $this->storeRule()); - } - if ($validator->fails()) { - // 获取相关的错误信息,并且把错误信息单独存放 - $errors = $validator->errors($validator); - $tips = ''; - foreach ($errors->all() as $message) { - $tips .= $message . ','; - } - $tips = substr($tips, 0, strlen($tips) - 1); - // 状态信息 - $item['错误原因'] = $tips; - $error[] = $item; - $isError = true; - $errorCount++; - } else { - // 没有出错的,我们先存在正确的数组 - $arr[] = $data; - $successCount++; - } - } - - - protected function storeRule() - { - return []; - } - - protected function UpdateRule($id) - { - return []; - } - - - protected function message() - { - return []; - } - -} diff --git a/api/app/Http/Controllers/Admin/Template.php b/api/app/Http/Controllers/Admin/Template.php deleted file mode 100644 index 9d1d815c..00000000 --- a/api/app/Http/Controllers/Admin/Template.php +++ /dev/null @@ -1,285 +0,0 @@ -input('pageSize', 10); - return $this->getListData($pageSize); - } - - protected function getListData($pageSize){ - // 当前列表数据 对应于原来的index - $data = $this->model::paginate($pageSize); - return new $this->resourceCollection($data); - } - - - public function show($id){ - $data = $this->model::find($id); - return new $this->resource($data); - } - - public function store(Request $request) - { -// 1. 获取前端数据 - - $data = $request->only($this->fillable); -// 2. 验证数据 - if (method_exists($this, 'message')){ - $validator = Validator::make($data, $this->storeRule(), $this->message()); - } else { - $validator = Validator::make($data, $this->storeRule()); - } - - if ($validator->fails()){ - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } -// 3.数据无误,进一步处理后保存到数据表里面,有的表需要处理,有的不需要 - $data = $this->storeHandle($data); - if ($this->model::create($data)) { - return $this->successWithInfo('新增数据成功', 201); - } else { - return $this->error(); - } - } - - - protected function storeHandle($data) - { - return $data; // TODO: Change the autogenerated stub - } - - protected function getErrorInfo($validator) - { - $errors = $validator->errors(); - $errorTips = ''; - foreach($errors->all() as $message){ - $errorTips = $errorTips.$message.','; - } - $errorTips = substr($errorTips, 0, strlen($errorTips)-1); - return $errorTips; - } - - - public function update(Request $request, $id) - { - $data = $request->only($this->fillable); - if (method_exists($this, 'message')){ - $validator = Validator::make($data, $this->updateRule($id), $this->message()); - } else { - $validator = Validator::make($data, $this->updateRule($id)); - } - if ($validator->fails()){ - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } - // 进一步处理数据 - $data = $this->updateHandle($data); - // 更新到数据表 - if ($this->model::where('id', $id)->update($data)){ - return $this->successWithInfo('数据更新成功'); - } else { - return $this->errorWithInfo('数据更新失败'); - } - } - - protected function updateHandle($data){ - return $data; - } - - public function destroy($id) - { - if ($this->destroyHandle($id)){ - return $this->successWithInfo('数据删除成功', 204); - } else { - return $this->errorWithInfo('数据删除失败,请查看指定的数据是否存在'); - } - } - - protected function destroyHandle($id) { - DB::transaction(function () use($id) { - // 删除逻辑 注意多表关联的情况 - $this->model::where('id', $id)->delete(); - }); - return true; - } - public function deleteAll() - { - // 前端利用json格式传递数据 - $ids = json_decode(request()->input('ids'),true); - foreach ($ids as $id) { - $this->destoryHandle($id); - } - return $this->successWithInfo('批量删除数据成功', 204); - } - - - - public function export() - { - $data = $this->model::all(); - $data = $data->toArray(); - $arr = $this->exportHandle($data); - $data = collect($arr); - $fileName = time().'.xlsx'; - $file = 'xls\\'.$fileName; - (new FastExcel($data))->export($file); - return $this->successWithInfo($file); - } - - protected function exportHandle($arrData){ - // 默认会根据$map进行处理, - $arr = []; - foreach ($arrData as $item) { - $tempArr = $this->handleItem($item, 'export'); - // 根据需要$tempArr可以进一步处理,特殊的内容,默认$tempArr是根据$this->map来处理 - $arr[] = $tempArr; - } - return $arr; - } - - - /** - * 根据map表,处理数据 - * @param $data - */ - protected function handleItem($data, $type = 'export'){ - $arr = []; - if ($type === 'export'){ - foreach ($this->map as $key => $item){ - if (!isset($data[$item])){ - continue; - } - $arr[$key] = $data[$item]; - } - } - if ($type === 'import'){ - foreach ($this->map as $key => $item){ - if (!isset($data[$key])){ - continue; - } - $arr[$item] = $data[$key]; - } - } - return $arr; - } - - - public function import() - { -// 1.接收文件,打开数据 -// 2. 处理打开的数据,循环转换 -// 3. 导入到数据库 - $data = (new FastExcel())->import(request()->file('file')); - $arrData = $data->toArray(); - $arr = $this->importHandle($arrData); - $this->model::insert($arr['successData']); - $tips = '当前操作导入数据成功'.$arr['successCount'].'条'; - if ($arr['isError']) { - // 有失败的数据,无法插入,要显示出来,让前端能下载 - $file = time().'.xlsx'; - $fileName = public_path('xls').'\\'.$file; - $file = 'xls\\'.$file; - $data = collect($arr['errorData']); - (new FastExcel($data))->export($fileName); - $tips .= ',失败'.$arr['errorCount'].'条'; - return response()->json([ - 'info' => $tips, - 'fileName' => $file, - 'status' => 'error', - 'status_code' => 422 - ], 422); - } else { - return $this->successWithInfo($tips, 201); - } - } - - protected function importHandle($arrData){ -// 1. 要对每一条记录进行校验 - -// 2. 根据校验的结果,计算出可以导入的条数,以及错误的内容 - - $error = []; // 错误的具体信息 - $isError = false; // 是否存在信息错误 - $successCount = 0; // 统计数据导入成功的条数 - $errorCount = 0; // 出错的条数 - $arr = []; // 正确的内容存储之后,返回数据 - foreach ($arrData as $key => $item) { - $data = $this->handleItem($item, 'import'); - $data['created_at'] = Carbon::now(); - // 可以根据需要,进一步处理数据 - $this->validatorData($item,$data,$error, $isError ,$successCount, $errorCount,$arr); - } - return [ - 'successData' => $arr, - 'errorData' => $error, - 'isError' => $isError, - 'errorCount' => $errorCount, - 'successCount' => $successCount, - ]; - } - - - protected function validatorData($item, $data, &$error, &$isError ,&$successCount, &$errorCount,&$arr){ - if (method_exists($this, 'message')){ - $validator = Validator::make($data,$this->storeRule(),$this->message()); - } else { - $validator = Validator::make($data,$this->storeRule()); - } - if ($validator->fails()){ - // 获取相关的错误信息,并且把错误信息单独存放 - $errors = $validator->errors($validator); - $tips = ''; - foreach ($errors->all() as $message){ - $tips .= $message.','; - } - $tips = substr($tips,0,strlen($tips)-1); - // 状态信息 - $item['错误原因'] = $tips; - $error[] = $item; - $isError = true; - $errorCount ++; - } else { - // 没有出错的,我们先存在正确的数组 - $arr[] = $data; - $successCount ++; - } - } - - - protected function storeRule(){ - return []; - } - - protected function UpdateRule($id){ - return []; - } - - - protected function message(){ - return []; - } - -} diff --git a/api/app/Http/Controllers/Admin/Tool.php b/api/app/Http/Controllers/Admin/Tool.php deleted file mode 100644 index 37dd2fd7..00000000 --- a/api/app/Http/Controllers/Admin/Tool.php +++ /dev/null @@ -1,95 +0,0 @@ -json([ - 'status' => 'success', - 'status_code' => 200 - ], 200); - } - - protected function successWithInfo($msg = '操作成功', $code = 200) - { - return response()->json([ - 'info' => $msg, - 'status' => 'success', - 'status_code' => $code - ], $code); - } - - - protected function getWebsocketClientId() - { - return request()->header('X-Socket-Id'); - } - - - - protected function successWithData($data = [], $code = 200) - { - return response()->json([ - 'data' => $data, - 'status' => 'success', - 'status_code' => $code - ], $code); - } - - protected function error() - { - return response()->json([ - 'status' => 'error', - 'status_code' => 404 - ], 404); - } - - protected function errorWithInfo($msg = '操作失败', $code = 404) - { - return response()->json([ - 'info' => $msg, - 'status' => 'error', - 'status_code' => $code - ], $code); - } - - protected function errorWithData($data = [], $code = 404) - { - return response()->json([ - 'data' => $data, - 'status' => 'error', - 'status_code' => $code - ], $code); - } - - protected function receiveFile() - { - $file = request()->file('file'); - if ($file->isValid()) { - $domain = getDomain(); - $fileName = $file->store('', 'public'); - $file = Storage::url($fileName); - $path = $domain.$file; - return $path; - } else { - return ''; - } - } - - protected function deleteAvatar($url) { - $domain = getDomain(); - $path = $domain.'/storage/'; - $file = str_replace($path, '', $url); - $address = storage_path('app/public'); - $fileName = $address.'/'.$file; - if (file_exists($fileName)) { - unlink($fileName); - } - } -} diff --git a/api/app/Http/Controllers/Admin/UserController.php b/api/app/Http/Controllers/Admin/UserController.php deleted file mode 100644 index 7caa9e77..00000000 --- a/api/app/Http/Controllers/Admin/UserController.php +++ /dev/null @@ -1,408 +0,0 @@ - "nickname", - "登录名" => "email", - "手机号码" => "phone", - "密码" => "password" - ]; // 导入导出时候 数据表字段与说明的映射表 中文名称=>字段名 - - /** - * 会员列表 - * @param Request $request - * @return mixed - */ - public function index(Request $request) - { - // 显示订单列表 - $pageSize = $request->input('pageSize', 10); - return $this->getListData($pageSize); - } - - protected function getListData($pageSize){ - // 当前列表数据 对应于原来的index - $data = $this->model::paginate($pageSize); - return new $this->resourceCollection($data); - } - - /** - * 会员详情 - * @param $id - * @return mixed - */ - public function show($id){ - $data = $this->model::find($id); - return new $this->resource($data); - } - - /** - * 添加会员 - * @param Request $request - * @return \Illuminate\Http\JsonResponse - */ - public function store(Request $request) - { -// 1. 获取前端数据 - - $data = $request->only($this->fillable); -// 2. 验证数据 - if (method_exists($this, 'message')){ - $validator = Validator::make($data, $this->storeRule(), $this->message()); - } else { - $validator = Validator::make($data, $this->storeRule()); - } - - if ($validator->fails()){ - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } -// 3.数据无误,进一步处理后保存到数据表里面,有的表需要处理,有的不需要 - - $data = $this->storeHandle($data); - if ($this->model::create($data)) { - return $this->successWithInfo('新增数据成功', 201); - } else { - return $this->error(); - } - - } - - - protected function storeHandle($data) - { - $data['password'] = bcrypt($data['password']); - if (empty($data['phone'])) { - unset($data['phone']); - } - unset($data['password_confirmation']); - return $data; // TODO: Change the autogenerated stub - } - - protected function getErrorInfo($validator) - { - $errors = $validator->errors(); - $errorTips = ''; - foreach($errors->all() as $message){ - $errorTips = $errorTips.$message.','; - } - $errorTips = substr($errorTips, 0, strlen($errorTips)-1); - return $errorTips; - } - - /** - * 修改会员 - * @param Request $request - * @param $id - * @return \Illuminate\Http\JsonResponse - */ - public function update(Request $request, $id) - { - $action = request('action', 'update'); - if ($action === 'update') { - $data = $request->only($this->fillable); - if (method_exists($this, 'message')){ - $validator = Validator::make($data, $this->updateRule($id), $this->message()); - } else { - $validator = Validator::make($data, $this->updateRule($id)); - } - if ($validator->fails()){ - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } - } - // 进一步处理数据 - switch ($action) { - case 'status': - $status = $request->input('status'); - if (in_array($status, [0,1])) { - $this->model::where('id', $id)->update([ - 'status' => $status - ]); - } else { - return $this->errorWithInfo('必须填写状态标识', 422); - } - return $this->successWithInfo('用户状态修改完成'); - break; - case 'reset': - $pwd = $request->input('password'); - if ($pwd){ - $this->model::where('id', $id)->update([ - 'password' => bcrypt($pwd) - ]); - } else { - return $this->errorWithInfo( '必须填写密码' , 422); - } - return $this->successWithInfo('用户密码修改完成'); - break; - default: - $avatar = $data['avatar']; - $oldAvatar = $this->model::find($id)->avatar; - if ($avatar !== $oldAvatar && !empty($oldAvatar)) { - // 删除旧的头像文件 http://lv6.test//storage/axS9bUx4LkOFqwFmmfB5f2TRJBXWGmX4neGMR7RR.png - $this->deleteAvatar($oldAvatar); - } - $data = $this->updateHandle($data); - if ($this->model::where('id', $id)->update($data)) { - return $this->successWithInfo('数据修改成功', 201); - } else { - return $this->error(); - } - } - } - - protected function updateHandle($data){ - return $data; - } - - /** - * 删除会员 - * @param $id - * @return \Illuminate\Http\JsonResponse - */ - public function destroy($id) - { - if ($this->destroyHandle($id)){ - return $this->successWithInfo('数据删除成功'); - } else { - return $this->errorWithInfo('数据删除失败,请查看指定的数据是否存在'); - } - } - - protected function destroyHandle($id) { - DB::transaction(function () use($id) { - // 删除逻辑 注意多表关联的情况 - $this->model::where('id', $id)->delete(); - }); - return true; - } - - - public function deleteAll() - { - // 前端利用json格式传递数据 - $ids = json_decode(request()->input('ids'),true); - foreach ($ids as $id) { - $this->destoryHandle($id); - } - return $this->successWithInfo('批量删除数据成功', 204); - } - - - public function export() - { - $data = $this->model::all(); - $data = $data->toArray(); - $arr = $this->exportHandle($data); - $data = collect($arr); - $fileName = time().'.xlsx'; - $file = 'xls\\'.$fileName; - (new FastExcel($data))->export($file); - return $this->successWithInfo($file); - } - - protected function exportHandle($arrData){ - // 默认会根据$map进行处理, - $arr = []; - foreach ($arrData as $item) { - $tempArr = $this->handleItem($item, 'export'); - // 根据需要$tempArr可以进一步处理,特殊的内容,默认$tempArr是根据$this->map来处理 - $arr[] = $tempArr; - } - return $arr; - } - - - /** - * 根据map表,处理数据 - * @param $data - */ - protected function handleItem($data, $type = 'export'){ - $arr = []; - if ($type === 'export'){ - foreach ($this->map as $key => $item){ - if (!isset($data[$item])){ - continue; - } - $arr[$key] = $data[$item]; - } - } - if ($type === 'import'){ - foreach ($this->map as $key => $item){ - if (!isset($data[$key])){ - continue; - } - $arr[$item] = $data[$key]; - } - } - return $arr; - } - - /** - * 导入会员 - */ - public function import() - { -// 1.接收文件,打开数据 -// 2. 处理打开的数据,循环转换 -// 3. 导入到数据库 - $action = request()->input('action', 'import'); - switch ($action) { - case 'download': - $result = []; - $result [] = [ - "昵称" => "wmhello", - "登录名" => "wmhello", - "密码" => "123456", - "手机号码" => "13577700001" - ]; - $list = collect($result); - // 直接下载 - return (FastExcel::data($list))->download('template.xlsx'); - break; - default: - $data = FastExcel::import(request()->file('file')); - $arrData = $data->toArray(); - $arr = $this->importHandle($arrData); - $this->model::insert($arr['successData']); - $tips = '当前操作导入数据成功' . $arr['successCount'] . '条'; - if ($arr['isError']) { - // 有失败的数据,无法插入,要显示出来,让前端能下载 - $file = time() . '.xlsx'; - $fileName = public_path('xls') . '\\' . $file; - $file = 'xls\\' . $file; - $data = collect($arr['errorData']); - (FastExcel::data($data))->export($fileName); - $tips .= ',失败' . $arr['errorCount'] . '条'; - return response()->json([ - 'info' => $tips, - 'fileName' => $file, - 'status' => 'error', - 'status_code' => 422 - ], 422); - } else { - return $this->successWithInfo($tips, 201); - } - } - } - - protected function importHandle($arrData){ -// 1. 要对每一条记录进行校验 - -// 2. 根据校验的结果,计算出可以导入的条数,以及错误的内容 - - $error = []; // 错误的具体信息 - $isError = false; // 是否存在信息错误 - $successCount = 0; // 统计数据导入成功的条数 - $errorCount = 0; // 出错的条数 - $arr = []; // 正确的内容存储之后,返回数据 - foreach ($arrData as $key => $item) { - $data = $this->handleItem($item, 'import'); - $data['password'] = bcrypt($data['password']); - $data['created_at'] = Carbon::now(); - $this->validatorData($item,$data,$error, $isError ,$successCount, $errorCount,$arr); - // 可以根据需要,进一步处理数据 - } - return [ - 'successData' => $arr, - 'errorData' => $error, - 'isError' => $isError, - 'errorCount' => $errorCount, - 'successCount' => $successCount, - ]; - } - - - protected function validatorData($item, $data, &$error, &$isError ,&$successCount, &$errorCount,&$arr){ - if (method_exists($this, 'message')){ - $validator = Validator::make($data,[ - "email" => "required|unique:users", - "phone" => "nullable|size:11|unique:users" - ],$this->message()); - } else { - $validator = Validator::make($data,[ - "email" => "required|unique:users", - "phone" => "nullable|size:11|unique:users" - ]); - } - if ($validator->fails()){ - // 获取相关的错误信息,并且把错误信息单独存放 - $errors = $validator->errors($validator); - $tips = ''; - foreach ($errors->all() as $message){ - $tips .= $message.','; - } - $tips = substr($tips,0,strlen($tips)-1); - // 状态信息 - $item['错误原因'] = $tips; - $error[] = $item; - $isError = true; - $errorCount ++; - } else { - // 没有出错的,我们先存在正确的数组 - unset($data['password_confirmation']); - $arr[] = $data; - $successCount ++; - } - } - - - protected function storeRule(){ - return [ - "email" => "required|unique:users", - "password" => "required|confirmed", - "phone" => "nullable|size:11|unique:users" - ]; - } - - protected function UpdateRule($id){ - return [ - "email" =>[ - "required", - Rule::unique("users")->ignore($id) - ], - "phone" => [ - "nullable", - "size:11", - Rule::unique("users")->ignore($id) - ], - ]; - } - - - protected function message(){ - return [ - "email.required" => "登录名必须填写", - "email.unique" => "登录名不能重复", - "password.required" => "密码必须填写", - "password.confirmed" => "两次输入的密码必须一致", - "phone.size" => "电话号码输入有误,长度必须是11位", - "phone.unique" => "电话号码不能重复", - ]; - } - - -} diff --git a/api/app/Http/Controllers/Admin/Validate.php b/api/app/Http/Controllers/Admin/Validate.php deleted file mode 100644 index 72c40928..00000000 --- a/api/app/Http/Controllers/Admin/Validate.php +++ /dev/null @@ -1,60 +0,0 @@ -storeRule(), $this->message()); - if ($validator->fails()) { - $errors = $validator->errors()->toArray(); - $msg = $this->tranMessage($errors); - return $msg; - }else { - return true; - } - - } - - public function validateUpdate($data, $id) - { - - $validator = Validator::make($data, $this->updateRule($id), $this->message()); - if ($validator->fails()) { - $errors = $validator->errors()->toArray(); - $msg = $this->tranMessage($errors); - return $msg; - }else { - return true; - } - - } - - /** - * 错误信息转换 - * @param $errors - * @return string - */ - protected function tranMessage($errors) - { - $tips = ''; - foreach ($errors as $k => $v) { - foreach ($v as $v1) { - $tips .= $v1.','; - } - } - $end = strrpos($tips,','); - $tips = substr($tips, 0, $end); - return $tips; - } -} diff --git a/api/app/Http/Controllers/Admin/WechatController.php b/api/app/Http/Controllers/Admin/WechatController.php deleted file mode 100644 index d48fea60..00000000 --- a/api/app/Http/Controllers/Admin/WechatController.php +++ /dev/null @@ -1,285 +0,0 @@ -input('pageSize', 10); - return $this->getListData($pageSize); - } - - protected function getListData($pageSize){ - // 当前列表数据 对应于原来的index - $data = $this->model::App_id()->App_secret()->paginate($pageSize); - return new $this->resourceCollection($data); - } - - - public function show($id){ - $data = $this->model::find($id); - return new $this->resource($data); - } - - public function store(Request $request) - { -// 1. 获取前端数据 - - $data = $request->only($this->fillable); -// 2. 验证数据 - if (method_exists($this, 'message')){ - $validator = Validator::make($data, $this->storeRule(), $this->message()); - } else { - $validator = Validator::make($data, $this->storeRule()); - } - - if ($validator->fails()){ - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } -// 3.数据无误,进一步处理后保存到数据表里面,有的表需要处理,有的不需要 - $data = $this->storeHandle($data); - if ($this->model::create($data)) { - return $this->successWithInfo('新增数据成功', 201); - } else { - return $this->error(); - } - } - - - protected function storeHandle($data) - { - return $data; // TODO: Change the autogenerated stub - } - - protected function getErrorInfo($validator) - { - $errors = $validator->errors(); - $errorTips = ''; - foreach($errors->all() as $message){ - $errorTips = $errorTips.$message.','; - } - $errorTips = substr($errorTips, 0, strlen($errorTips)-1); - return $errorTips; - } - - - public function update(Request $request, $id) - { - $data = $request->only($this->fillable); - if (method_exists($this, 'message')){ - $validator = Validator::make($data, $this->updateRule($id), $this->message()); - } else { - $validator = Validator::make($data, $this->updateRule($id)); - } - if ($validator->fails()){ - // 有错误,处理错误信息并且返回 - $errorTips = $this->getErrorInfo($validator); - return $this->errorWithInfo($errorTips, 422); - } - // 进一步处理数据 - $data = $this->updateHandle($data); - // 更新到数据表 - if ($this->model::where('id', $id)->update($data)){ - return $this->successWithInfo('数据更新成功'); - } else { - return $this->errorWithInfo('数据更新失败'); - } - } - - protected function updateHandle($data){ - return $data; - } - - public function destroy($id) - { - if ($this->destroyHandle($id)){ - return $this->successWithInfo('数据删除成功', 204); - } else { - return $this->errorWithInfo('数据删除失败,请查看指定的数据是否存在'); - } - } - - protected function destroyHandle($id) { - DB::transaction(function () use($id) { - // 删除逻辑 注意多表关联的情况 - $this->model::where('id', $id)->delete(); - }); - return true; - } - public function deleteAll() - { - // 前端利用json格式传递数据 - $ids = json_decode(request()->input('ids'),true); - foreach ($ids as $id) { - $this->destoryHandle($id); - } - return $this->successWithInfo('批量删除数据成功', 204); - } - - - - public function export() - { - $data = $this->model::all(); - $data = $data->toArray(); - $arr = $this->exportHandle($data); - $data = collect($arr); - $fileName = time().'.xlsx'; - $file = 'xls\\'.$fileName; - (new FastExcel($data))->export($file); - return $this->successWithInfo($file); - } - - protected function exportHandle($arrData){ - // 默认会根据$map进行处理, - $arr = []; - foreach ($arrData as $item) { - $tempArr = $this->handleItem($item, 'export'); - // 根据需要$tempArr可以进一步处理,特殊的内容,默认$tempArr是根据$this->map来处理 - $arr[] = $tempArr; - } - return $arr; - } - - - /** - * 根据map表,处理数据 - * @param $data - */ - protected function handleItem($data, $type = 'export'){ - $arr = []; - if ($type === 'export'){ - foreach ($this->map as $key => $item){ - if (!isset($data[$item])){ - continue; - } - $arr[$key] = $data[$item]; - } - } - if ($type === 'import'){ - foreach ($this->map as $key => $item){ - if (!isset($data[$key])){ - continue; - } - $arr[$item] = $data[$key]; - } - } - return $arr; - } - - - public function import() - { -// 1.接收文件,打开数据 -// 2. 处理打开的数据,循环转换 -// 3. 导入到数据库 - $data = (new FastExcel())->import(request()->file('file')); - $arrData = $data->toArray(); - $arr = $this->importHandle($arrData); - $this->model::insert($arr['successData']); - $tips = '当前操作导入数据成功'.$arr['successCount'].'条'; - if ($arr['isError']) { - // 有失败的数据,无法插入,要显示出来,让前端能下载 - $file = time().'.xlsx'; - $fileName = public_path('xls').'\\'.$file; - $file = 'xls\\'.$file; - $data = collect($arr['errorData']); - (new FastExcel($data))->export($fileName); - $tips .= ',失败'.$arr['errorCount'].'条'; - return response()->json([ - 'info' => $tips, - 'fileName' => $file, - 'status' => 'error', - 'status_code' => 422 - ], 422); - } else { - return $this->successWithInfo($tips, 201); - } - } - - protected function importHandle($arrData){ -// 1. 要对每一条记录进行校验 - -// 2. 根据校验的结果,计算出可以导入的条数,以及错误的内容 - - $error = []; // 错误的具体信息 - $isError = false; // 是否存在信息错误 - $successCount = 0; // 统计数据导入成功的条数 - $errorCount = 0; // 出错的条数 - $arr = []; // 正确的内容存储之后,返回数据 - foreach ($arrData as $key => $item) { - $data = $this->handleItem($item, 'import'); - $data['created_at'] = Carbon::now(); - // 可以根据需要,进一步处理数据 - $this->validatorData($item,$data,$error, $isError ,$successCount, $errorCount,$arr); - } - return [ - 'successData' => $arr, - 'errorData' => $error, - 'isError' => $isError, - 'errorCount' => $errorCount, - 'successCount' => $successCount, - ]; - } - - - protected function validatorData($item, $data, &$error, &$isError ,&$successCount, &$errorCount,&$arr){ - if (method_exists($this, 'message')){ - $validator = Validator::make($data,$this->storeRule(),$this->message()); - } else { - $validator = Validator::make($data,$this->storeRule()); - } - if ($validator->fails()){ - // 获取相关的错误信息,并且把错误信息单独存放 - $errors = $validator->errors($validator); - $tips = ''; - foreach ($errors->all() as $message){ - $tips .= $message.','; - } - $tips = substr($tips,0,strlen($tips)-1); - // 状态信息 - $item['错误原因'] = $tips; - $error[] = $item; - $isError = true; - $errorCount ++; - } else { - // 没有出错的,我们先存在正确的数组 - $arr[] = $data; - $successCount ++; - } - } - - - protected function storeRule(){ - return []; - } - - protected function UpdateRule($id){ - return []; - } - - - protected function message(){ - return []; - } - -} \ No newline at end of file diff --git a/api/app/Http/Controllers/Auth/ConfirmPasswordController.php b/api/app/Http/Controllers/Auth/ConfirmPasswordController.php deleted file mode 100644 index 138c1f08..00000000 --- a/api/app/Http/Controllers/Auth/ConfirmPasswordController.php +++ /dev/null @@ -1,40 +0,0 @@ -middleware('auth'); - } -} diff --git a/api/app/Http/Controllers/Auth/LoginController.php b/api/app/Http/Controllers/Auth/LoginController.php deleted file mode 100644 index 18a0d088..00000000 --- a/api/app/Http/Controllers/Auth/LoginController.php +++ /dev/null @@ -1,40 +0,0 @@ -middleware('guest')->except('logout'); - } -} diff --git a/api/app/Http/Controllers/Auth/VerificationController.php b/api/app/Http/Controllers/Auth/VerificationController.php deleted file mode 100644 index 5e749af8..00000000 --- a/api/app/Http/Controllers/Auth/VerificationController.php +++ /dev/null @@ -1,42 +0,0 @@ -middleware('auth'); - $this->middleware('signed')->only('verify'); - $this->middleware('throttle:6,1')->only('verify', 'resend'); - } -} diff --git a/api/app/Http/Controllers/Controller.php b/api/app/Http/Controllers/Controller.php deleted file mode 100644 index a0a2a8a3..00000000 --- a/api/app/Http/Controllers/Controller.php +++ /dev/null @@ -1,13 +0,0 @@ -first(); - $item->action = $action; - $item->open_id = $open_id; - $item->updated_at = Carbon::now(); - $item->save(); - return $this->successWithInfo('小程序端扫描验证操作已经完成,请在PC端执行相关操作'); - } else { - return $this->errorWithInfo('扫描验证出错', 400); - } - } - - public function subject() // 获取学科 - { - $school_id = $this->getSchoolIdByOpenid(); - $type_no = School::find($school_id)->type_no; - $params = floor((int)$type_no / 100); - $result = DB::table('subject')->where('type_no', $params)->orderBy('order', 'asc')->select(['name as label', 'id as value'])->get(); - return $this->successWithData($result); - } - - public function tech() // 获取职称等 - { - $params = (int)request('identify', '1'); - $result = DB::table('tech_category')->where('class', $params)->orderBy('order', 'asc')->get(); - return $this->successWithData($result); - } - - - public function getAllArea() - { - $sql = << $v) { - $v = (array)$v; - $v['label'] = $v['name']; - $v['value'] = $v['no']; - if ($t['level'] === $v['level']) { - $v['extra'] = $index; - $index ++; - $t = $v; - } else { - $index = 0; - $v['extra'] = $index; - $index ++; - $t = $v; - } - $arr[] = $v; - } - $result = $this->get_tree($arr, '100000'); - - return $this->successWithData($result); - } - - public function nation() // 获取民族接口 - { - $result = DB::table('nation')->select(['id', 'nation as text', 'nation as label', 'nation as value'])->get(); - return $this->successWithData($result); - } - - public function community() - { - - $sql = << $v) { - $v = (array)$v; - $v['label'] = $v['name']; - $v['value'] = $v['no']; - if ($t['level'] === $v['level']) { - $v['extra'] = $index; - $index ++; - $t = $v; - } else { - $index = 0; - $v['extra'] = $index; - $index ++; - $t = $v; - } - $arr[] = $v; - } - $result = $this->get_tree($arr); - return $this->successWithData($result); - } - - - public function area() - { - $area_no = request('area_no', '530402'); - $sql = << $v) { - $v = (array)$v; - $v['label'] = $v['name']; - $v['value'] = $v['no']; - if ($t['level'] === $v['level']) { - $v['extra'] = $index; - $index ++; - $t = $v; - } else { - $index = 0; - $v['extra'] = $index; - $index ++; - $t = $v; - } - $arr[] = $v; - } - $result = $this->get_tree($arr, $area_no, 'no', 'p_no', 'children', 2); - return $this->successWithData($result); - } - - - - - protected function get_tree($arr, $pid = '530400', $id = 'no', $pname = 'p_no', $child = 'children',$deep=1) - { - $tree = array(); - foreach ($arr as $k => $value) { - if ($value[$pname] == $pid) { - $value[$child] = $this->get_tree($arr, $value[$id], $id = 'no', $pname = 'p_no', $child = 'children', $deep + 1); - if ($value[$child] == null) { - unset($value[$child]); - } - $value['deep'] = $deep; - $tree[] = $value; - } - } - return $tree; - } - - - public function getStuType() - { - $result = DB::table('stu_type')->select(['name as text', 'name as label'])->get(); - return $this->successWithData($result); - } - - -} diff --git a/api/app/Http/Controllers/MP/Controller.php b/api/app/Http/Controllers/MP/Controller.php deleted file mode 100644 index 5b863c82..00000000 --- a/api/app/Http/Controllers/MP/Controller.php +++ /dev/null @@ -1,21 +0,0 @@ - 'wx7f8da3ac0cdfe244', - 'secret' => '1ac50578f8d1d3663d202b4a89b923fa', - - // 下面为可选项 - // 指定 API 调用返回结果的类型:array(default)/collection/object/raw/自定义类名 - 'response_type' => 'array', - - 'log' => [ - 'level' => 'debug', - 'file' => __DIR__.'/wechat.log', - ], - ]; - - public function getCode(Request $request) - { - $code = $request->input('code', ''); - if (empty($code)) { - return [ - 'status' => 'error', - 'status_code' => 400, - 'msg' => '没有参数', - ]; - } - $mp = Factory::miniProgram($this->config); - $data = $mp->auth->session($code); -// unset($data['openid']); - return $data; - } - - public function getInfo(Request $request) - { - - $openid = $request->input('openid', ''); - $sessionKey = $request->input('session_key'); - $iv = $request->input('iv', ''); - $encryptedData = $request->input('encryptedData'); - $mp = Factory::miniProgram($this->config); - $data = $mp->encryptor->decryptData($sessionKey, $iv, $encryptedData); - $member = User::where('open_id', $data['openId'])->first(); - if (! $member) { - $member = User::create([ - 'open_id' => $data['openId'], - 'nickname'=> $data['nickName'], - 'avatar' => $data['avatarUrl'], - 'gender' => $data['gender'], - 'country' => $data['country'], - 'province' => $data['province'], - 'city' => $data['city'] - ]); - } else { - $member->avatar = $data['avatarUrl']; - $member->gender = $data['gender']; - $member->country = $data['country']; - $member->province = $data['province']; - $member->city = $data['city']; - $member->updated_at = Carbon::now(); - $member->update(); - } - $member = $member->toArray(); - $openid = $member['open_id']; - unset($member['openid']); - $result = [ - 'token' => $openid, - 'data' => $member - ]; - return $result; - } - - public function getRun(Request $request) - { - - $sessionKey = $request->input('session_key'); - $iv = $request->input('iv', ''); - $encryptedData = $request->input('encryptedData'); - $mp = Factory::miniProgram($this->config); - $data = $mp->encryptor->decryptData($sessionKey, $iv, $encryptedData); - $phone = $data['phoneNumber']; - $user_id = $this->getUserIdByOpenid(); - User::where('id', $user_id)->update([ - 'phone' => $phone - ]); - return $data; - } - - - public function saveUserInfo() - { - $data = request()->only([ 'avatar', 'gender', 'nickname', 'country', 'province', 'city']); - $open_id = request('open_id'); - $bool = false; - $item = User::where('open_id', $open_id)->first(); - if ($item) { - $bool = User::where('open_id', $open_id)->update($data); - } else { - $data['open_id'] = $open_id; - $bool = User::create($data); - } -// $bool = User::updateOrCreate([ -// 'open_id' => $open_id -// ], $data); - if ($bool) { - return $this->success(); - } else { - return $this->error(); - } - - } - - - public function scan_login() - { - $data = request()->only([ - 'open_id', 'guid' - ]); - $action = request('action'); - switch ($action) { - case 'getRoles': - // code... - $teacher_id = $this->getTeacherIdByOpenid(); - $phone = Teacher::where('id', $teacher_id)->value('phone'); - $result = DB::table('v_admin_roles')->where('phone', $phone)->select(['role_id','desc'])->get(); - if ($result) { - return $this->successWithData($result); - } else { - return $this->errorWithInfo('获取用户角色失败', 400); - } - break; - case 'setRoles': - $role_id = request('role_id', null); - DB::table('scan_login')->where('guid', $data['guid'])->update([ - 'open_id' => $data['open_id'], - 'role_id' => $role_id - ]); - return $this->successWithInfo('扫码已经完成,稍后即将登陆'); - break; - default: - // code... - DB::table('scan_login')->where('guid', $data['guid'])->update([ - 'open_id' => $data['open_id'], - ]); - return $this->successWithInfo('扫码已经完成,稍后即将登陆'); - break; - } - - - } - -} diff --git a/api/app/Http/Controllers/MP/Tool.php b/api/app/Http/Controllers/MP/Tool.php deleted file mode 100644 index 0eeccb2b..00000000 --- a/api/app/Http/Controllers/MP/Tool.php +++ /dev/null @@ -1,139 +0,0 @@ -json([ - 'status' => 'success', - 'status_code' => 200 - ], 200); - } - - protected function successWithInfo($msg = '操作成功', $code = 200) - { - return response()->json([ - 'info' => $msg, - 'status' => 'success', - 'status_code' => $code - ], $code); - } - - protected function successWithData($data = [], $code = 200) - { - return response()->json([ - 'data' => $data, - 'status' => 'success', - 'status_code' => $code - ], $code); - } - - protected function error() - { - return response()->json([ - 'status' => 'error', - 'status_code' => 404 - ], 404); - } - - protected function errorWithInfo($msg = '操作失败', $code = 404) - { - return response()->json([ - 'info' => $msg, - 'status' => 'error', - 'status_code' => $code - ], $code); - } - - protected function errorWithData($data = [], $code = 404) - { - return response()->json([ - 'data' => $data, - 'status' => 'error', - 'status_code' => $code - ], $code); - } - - protected function receiveFile() - { - $file = request()->file('file'); - if ($file->isValid()) { - $domain = getDomain(); - $fileName = $file->store('', 'public'); - $file = Storage::url($fileName); - $path = $domain.$file; - return $path; - } else { - return ''; - } - } - - - - - - public function getUserIdByOpenid() - { - $request = request(); - $auth = $request->header('Authorization'); - $arrTemp = explode(' ', $auth); - if (count($arrTemp) === 2 && $arrTemp[0] === 'Bearer') { - // 根据令牌获取openid,然后去查看是否有该用户 - $token = $arrTemp[1]; - $openId = $token; - // 用户没有注册,也许是使用postman等直接调用的 - $member = User::where('open_id', $openId)->first(); - if (!$member) { - return response()->json([ - 'msg' => '没有找到指定的内容,请用微信登录', - 'status' => 'error', - 'status_code' => 400 - ], 400); - } else { - return $member->id; - } - - } - } - - - - public function getTeacherIdByOpenid() - { - $user_id = $this->getUserIdByOpenid(); - $teacher_id = DB::table('user_teachers')->where('user_id',$user_id)->value('teacher_id'); - return $teacher_id; - } - - - public function getSchoolIdByOpenid() - { - $user_id = $this->getUserIdByOpenid(); - $teacher_id = DB::table('user_teachers')->where('user_id',$user_id)->value('teacher_id'); - $school_id = DB::table('teachers')->where('id', $teacher_id)->value('school_id'); - return $school_id; - } - - public function getStudentIdByOpenid(){ - $user_id = $this->getUserIdByOpenid(); - $student_id = DB::table('user_students')->where('user_id',$user_id)->value('student_id'); - return $student_id; - } - - public function getSchoolIdByStudentId(){ - $student_id = $this->getStudentIdByOpenid(); - $school_id = DB::table('students')->where('id', $student_id)->value('school_id'); - return school_id; - } - - -} diff --git a/api/app/Http/Controllers/MP/Validate.php b/api/app/Http/Controllers/MP/Validate.php deleted file mode 100644 index 0f992dbb..00000000 --- a/api/app/Http/Controllers/MP/Validate.php +++ /dev/null @@ -1,169 +0,0 @@ -storeRule(), $this->message()); - if ($validator->fails()) { - $errors = $validator->errors()->toArray(); - $msg = $this->tranMessage($errors); - return $msg; - }else { - return true; - } - - } - - public function validateUpdate($data, $id) - { - - $validator = Validator::make($data, $this->updateRule($id), $this->message()); - if ($validator->fails()) { - $errors = $validator->errors()->toArray(); - $msg = $this->tranMessage($errors); - return $msg; - }else { - return true; - } - - } - - /** - * 错误信息转换 - * @param $errors - * @return string - */ - protected function tranMessage($errors) - { - $tips = ''; - foreach ($errors as $k => $v) { - foreach ($v as $v1) { - $tips .= $v1.','; - } - } - $end = strrpos($tips,','); - $tips = substr($tips, 0, $end); - return $tips; - } - - protected function checkIdCard($idcard){ - - $City = array(11=>"北京",12=>"天津",13=>"河北",14=>"山西",15=>"内蒙古",21=>"辽宁",22=>"吉林",23=>"黑龙江",31=>"上海",32=>"江苏",33=>"浙江",34=>"安徽",35=>"福建",36=>"江西",37=>"山东",41=>"河南",42=>"湖北",43=>"湖南",44=>"广东",45=>"广西",46=>"海南",50=>"重庆",51=>"四川",52=>"贵州",53=>"云南",54=>"西藏",61=>"陕西",62=>"甘肃",63=>"青海",64=>"宁夏",65=>"新疆",71=>"台湾",81=>"香港",82=>"澳门",91=>"国外"); - $iSum = 0; - $idCardLength = strlen($idcard); - //长度验证 -// if(!preg_match('/^d{17}(d|x)$/i',$idcard) and!preg_match('/^d{15}$/i',$idcard)) -// dd(preg_match('/^d{17}(d|x|X)$/i',$idcard)); - // 长度只能为18位或者15为 - if ($idCardLength !== 18 && $idCardLength !== 15){ -// dd('长度必须为18位或者15位'); - return false; - } - if (preg_match('/^d{17}(d|x|X)$/i',$idcard)!== 0) - { -// dd('18长度校验不过'); - return false; - } else if (preg_match('/^d{15}$/i',$idcard)!== 0) - { -// dd('15长度校验不过'); - return false; - } - - //地区验证 - if(!array_key_exists(intval(substr($idcard,0,2)),$City)) - { -// dd('地区校验不过'); - return false; - } - // 15位身份证验证生日,转换为18位 - if ($idCardLength === 15) - { - $sBirthday = '19'.substr($idcard,6,2).'-'.substr($idcard,8,2).'-'.substr($idcard,10,2); - $d = new \DateTime($sBirthday); - $dd = $d->format('Y-m-d'); - if($sBirthday != $dd) - { - return false; - } - $idcard = substr($idcard,0,6)."19".substr($idcard,6,9);//15to18 - $Bit18 = $this->getVerifyBit($idcard);//算出第18位校验码 - $idcard = $idcard.$Bit18; - } - // 判断是否大于2078年,小于1900年 - $year = substr($idcard,6,4); - if ($year > 2078 && $year < 1900 ) - { - return false; - } - - //18位身份证处理 - $sBirthday = substr($idcard,6,4).'-'.substr($idcard,10,2).'-'.substr($idcard,12,2); - $d = new \DateTime($sBirthday); - $dd = $d->format('Y-m-d'); - if($sBirthday != $dd) - { -// dd('出生年月校验不过'); - return false; - } - //身份证编码规范验证 - $idcard_base = substr($idcard,0,17); - if(strtoupper(substr($idcard,17,1)) !== $this->getVerifyBit($idcard_base)) - { -// dd('编码规范校验不过'); - return false; - } - return true; - } - - protected function isPhone($phone) { - $result = false; - if(preg_match("/^1[3456789]\d{9}$/", $phone)){ - //这里有无限想象 - $result = true; - } - return $result; - } - - protected function checkPassword($password) { - // 密码长度必须大于8个字符,含有小写和特殊符号 - $result = false; - if (strlen($password)>=8 && preg_match("/[a-z]/", $password)>=0 && preg_match("/[@#%$&]/", $password)>=0) { - $result = true; - } - return $result; - } - - - // 计算身份证校验码,根据国家标准GB 11643-1999 - protected function getVerifyBit($idcard_base) - { - if(strlen($idcard_base) != 17) - { - return false; - } - //加权因子 - $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); - //校验码对应值 - $verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4','3', '2'); - $checksum = 0; - for ($i = 0; $i < strlen($idcard_base); $i++) - { - $checksum += substr($idcard_base, $i, 1) * $factor[$i]; - } - $mod = $checksum % 11; - $verify_number = $verify_number_list[$mod]; - return $verify_number; - } -} diff --git a/api/app/Http/Controllers/MP/wechat.log b/api/app/Http/Controllers/MP/wechat.log deleted file mode 100644 index 1720b64b..00000000 --- a/api/app/Http/Controllers/MP/wechat.log +++ /dev/null @@ -1,816 +0,0 @@ -[2021-10-03T23:02:01.777111+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=003RDWkl2lTqR74zNdnl24Mc2L1RDWkC&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:02:01 GMT -Content-Length: 82 - -{"session_key":"UTGFNMNLjdLKzUjwMFb1tg==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:03:45.732076+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=0230ybGa1B43SB0RpJFa1dlWPU00ybGi&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:03:45 GMT -Content-Length: 82 - -{"session_key":"UTGFNMNLjdLKzUjwMFb1tg==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:08:21.826666+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=053OYFkl2jMIR74c8dll2N2QLy4OYFk0&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:08:21 GMT -Content-Length: 82 - -{"session_key":"kDTCApvePVFsb82fKefymQ==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:11:34.865107+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=043ZdXkl22gsR74u9xol22LkKr1ZdXk4&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:11:34 GMT -Content-Length: 82 - -{"session_key":"0QkxQpLzWGr0jAF7VW8+4w==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:14:58.199181+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=073TY9100G0cyM1yww300EwEZN0TY91B&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:14:58 GMT -Content-Length: 82 - -{"session_key":"9WUfUdktQmWv0Un7J+26MA==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:18:00.094365+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=083hCXkl2eurR74ROGml2wD6My4hCXkV&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:18:00 GMT -Content-Length: 83 - -{"session_key":"+Olu+AsoOkvCXW\/YiqvySw==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:18:07.095705+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=023bhnFa1VDMRB0iynHa1qq8EH1bhnFx&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:18:07 GMT -Content-Length: 83 - -{"session_key":"+Olu+AsoOkvCXW\/YiqvySw==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:24:44.432577+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=053mVKGa1hVuSB0AjCIa1TONye2mVKGV&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:24:44 GMT -Content-Length: 83 - -{"session_key":"0SvL\/fqcHUPaejUltgGcGQ==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:24:46.770880+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=073U1Ykl2sCkR74UDOkl2xs5Mo2U1Yk3&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:24:46 GMT -Content-Length: 83 - -{"session_key":"0SvL\/fqcHUPaejUltgGcGQ==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:39:40.703383+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=013clm000IpHwM1Flr0009YCJ50clm0Y&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:39:40 GMT -Content-Length: 82 - -{"session_key":"SJKBhLISuFoeMALiDLH2CQ==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:40:55.241022+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=003nFoFa1p9HRB02vEHa1ITaEH1nFoFX&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:40:55 GMT -Content-Length: 82 - -{"session_key":"SJKBhLISuFoeMALiDLH2CQ==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:41:12.374253+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=09302Zkl2p1mR74wzynl2pdzCR302ZkC&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:41:12 GMT -Content-Length: 82 - -{"session_key":"SJKBhLISuFoeMALiDLH2CQ==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:44:32.415450+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=023AeZkl2RLlR7491Vml2bIxWk1AeZkR&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:44:32 GMT -Content-Length: 82 - -{"session_key":"+VLMgGi1JqfiKC42vvtUSw==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:44:35.917194+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=093PeZkl2qLlR74nvMll2QyaTz4PeZkr&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:44:35 GMT -Content-Length: 82 - -{"session_key":"+VLMgGi1JqfiKC42vvtUSw==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:46:08.479682+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=033CJm000vEHwM1dq0300dt5Fn2CJm0H&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:46:08 GMT -Content-Length: 82 - -{"session_key":"+VLMgGi1JqfiKC42vvtUSw==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:46:11.574129+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=063PJm000RDHwM1c6S300qi3Fu0PJm0-&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:46:11 GMT -Content-Length: 82 - -{"session_key":"+VLMgGi1JqfiKC42vvtUSw==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:47:42.336477+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=083uM5000tLYwM1NtZ100ZKk173uM50y&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:47:42 GMT -Content-Length: 83 - -{"session_key":"5\/DJUMsi6nSexm9qguvs+Q==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:49:47.911479+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=043tyZkl2gxkR743yell2y4BHa1tyZk9&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:49:47 GMT -Content-Length: 82 - -{"session_key":"LIjL1v1cNwCsreINBcHbsg==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:49:57.330879+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=0735Cgll2RG9S74zN5ml24tCxh15CglT&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:49:57 GMT -Content-Length: 82 - -{"session_key":"LIjL1v1cNwCsreINBcHbsg==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:50:23.773840+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=033OGxll2pySR741eUkl2F8K6I2OGxlq&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:50:23 GMT -Content-Length: 82 - -{"session_key":"LIjL1v1cNwCsreINBcHbsg==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:51:34.811033+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=013fIgll2rP9S74TwEkl2ePTcd4fIglZ&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:51:34 GMT -Content-Length: 82 - -{"session_key":"LIjL1v1cNwCsreINBcHbsg==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:52:11.854100+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=003wEIkl2lHBR74J3Wll2Zd6Wf0wEIkw&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:52:11 GMT -Content-Length: 83 - -{"session_key":"QEGqzD7FEr7duib\/Lbu9ig==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-03T23:54:49.227210+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=033pjE000KrxxM1Tvr200GD7Cv2pjE0l&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 15:54:49 GMT -Content-Length: 82 - -{"session_key":"hFOwJJ4uopkWcdk6202ciw==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:06:22.987898+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=093CdqFa1MrIRB0DZCGa176xDM2CdqFn&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:06:22 GMT -Content-Length: 82 - -{"session_key":"KEhVi0wiNr1dQ5H+rA1t9w==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:07:00.893065+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=023yB0ll2WZnR74Y0gll2xjizy1yB0lQ&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:07:00 GMT -Content-Length: 82 - -{"session_key":"KEhVi0wiNr1dQ5H+rA1t9w==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:07:04.732336+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=023MyJkl2i3FR74Rxell21fOmq3MyJkj&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:07:04 GMT -Content-Length: 82 - -{"session_key":"KEhVi0wiNr1dQ5H+rA1t9w==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:08:39.178501+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=013dmqFa1dhJRB0qFHHa1w5n3L1dmqFx&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:08:39 GMT -Content-Length: 82 - -{"session_key":"+k4Bsy002XHmP1AhwG58gA==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:08:44.807246+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=0933470003A2xM1Wv1100Q2Hog134702&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:08:44 GMT -Content-Length: 82 - -{"session_key":"+k4Bsy002XHmP1AhwG58gA==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:10:13.954189+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=093GKJkl2T6FR74merll2TXSSn0GKJkX&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:10:13 GMT -Content-Length: 82 - -{"session_key":"+k4Bsy002XHmP1AhwG58gA==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:10:17.357600+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=033UKJkl286FR74IAXnl2fcPJr1UKJko&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:10:17 GMT -Content-Length: 82 - -{"session_key":"+k4Bsy002XHmP1AhwG58gA==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:10:59.967595+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=013yc7000Ld2xM1yMf100bFvV24yc70e&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:10:59 GMT -Content-Length: 82 - -{"session_key":"0LeZqo3mRi4jyowJ2gDNPg==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:11:03.695093+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=013Nc7000sd2xM1Pqu000i8l173Nc70F&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:11:03 GMT -Content-Length: 82 - -{"session_key":"0LeZqo3mRi4jyowJ2gDNPg==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:13:42.707608+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=023QXJkl20GER74IlTkl21YUiD4QXJk0&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:13:42 GMT -Content-Length: 82 - -{"session_key":"OqP9nzCWq++zTFc7CZsMwQ==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:17:42.252165+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=093Yf1ll23qmR74kGSml2rbpNK3Yf1lF&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:17:42 GMT -Content-Length: 82 - -{"session_key":"D7+FZrVFujFsHh5DboLKJQ==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:17:49.834421+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=083UUqFa1RyHRB0mWxGa1D662a2UUqFn&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:17:49 GMT -Content-Length: 82 - -{"session_key":"D7+FZrVFujFsHh5DboLKJQ==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:34:47.860974+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=063yfLkl2XqyR74yidll2vCmyo4yfLkt&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:34:47 GMT -Content-Length: 82 - -{"session_key":"tOKmCUDbvYHFJOFPSHNS+w==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:34:53.792745+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=003WfLkl25oyR74UMIll2ZRAaR2WfLkn&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:34:53 GMT -Content-Length: 82 - -{"session_key":"tOKmCUDbvYHFJOFPSHNS+w==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:36:04.156265+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=033qSX0003NcxM1jmF100Pdeqb0qSX0e&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:36:04 GMT -Content-Length: 82 - -{"session_key":"tOKmCUDbvYHFJOFPSHNS+w==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:36:07.257653+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=063wJ8000CJVwM1FkT200rzctf4wJ803&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:36:07 GMT -Content-Length: 82 - -{"session_key":"tOKmCUDbvYHFJOFPSHNS+w==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:39:45.590250+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=063lB2ll2hphR74SnYnl2Ch5le4lB2ls&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:39:45 GMT -Content-Length: 82 - -{"session_key":"daCaE+oHcfJnYLfKpkAXpQ==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:39:49.947017+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=073CB2ll2XnhR744Qeml2VbTVf0CB2lD&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:39:49 GMT -Content-Length: 82 - -{"session_key":"daCaE+oHcfJnYLfKpkAXpQ==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:42:37.242078+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=0938JLkl2q2yR74RwWml2xeNTO28JLkp&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:42:37 GMT -Content-Length: 82 - -{"session_key":"lJrdVelX7243hf6ipKT3Eg==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:42:52.623884+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=003aQjll2ma6S746Krll2zfWM94aQjlz&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:42:52 GMT -Content-Length: 82 - -{"session_key":"lJrdVelX7243hf6ipKT3Eg==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:45:56.354809+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=033FVLkl24UxR74MCOnl2WBYt52FVLk1&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:45:56 GMT -Content-Length: 82 - -{"session_key":"P0ld0W2PhR5cHgo2a8kNlw==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:45:59.649848+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=003Rk9000ojVwM1X3x000clqwt0Rk90L&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:45:59 GMT -Content-Length: 82 - -{"session_key":"P0ld0W2PhR5cHgo2a8kNlw==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:46:31.296974+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=083SXLkl2MVxR745Aanl2BptA40SXLky&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:46:31 GMT -Content-Length: 82 - -{"session_key":"P0ld0W2PhR5cHgo2a8kNlw==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:46:35.055007+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=023FL0Ga1p8aSB0KFrGa18wKkN1FL0G4&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:46:35 GMT -Content-Length: 82 - -{"session_key":"P0ld0W2PhR5cHgo2a8kNlw==","openid":"oShlA5WUNq40eOpK6-YrL9Pancv4"} --------- -NULL -[2021-10-04T00:50:43.810812+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=021LC9000M8VwM1dpg100OXkkI0LC90l&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:50:43 GMT -Content-Length: 83 - -{"session_key":"ogSfXCS\/wm7eMXnBE6pBbg==","openid":"oShlA5V70X493FmKzdfw66HsbWKY"} --------- -NULL -[2021-10-04T00:50:48.077281+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=0012D9000d9VwM1tiH200BhM6y02D90E&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:50:48 GMT -Content-Length: 83 - -{"session_key":"ogSfXCS\/wm7eMXnBE6pBbg==","openid":"oShlA5V70X493FmKzdfw66HsbWKY"} --------- -NULL -[2021-10-04T00:53:12.490341+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=021D4tFa1iFBRB04dGIa1AgRfG3D4tFw&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:53:12 GMT -Content-Length: 82 - -{"session_key":"EfPi2h2qX2q+wFNPeOdIAg==","openid":"oShlA5V70X493FmKzdfw66HsbWKY"} --------- -NULL -[2021-10-04T00:53:15.692223+08:00] EasyWeChat.DEBUG: >>>>>>>> -GET /sns/jscode2session?access_token=49_Gi3XDzWoBeu864O_ZeNLVtUPN2TWXl1QfkwqSm_arylaMEY7O0PsfF4LNsIdWJdN8DDOU-ZvA3xuOuhoZN_bIb-_d3bw6XX86fmwAh-MN67d13mdXusJuF2QAzjfu57AsSbvySmIY1OpvNDMNPMdAAAGIF&appid=wx7f8da3ac0cdfe244&secret=1ac50578f8d1d3663d202b4a89b923fa&js_code=011oq3ll2pvgR74tDmll2VFPgQ0oq3l1&grant_type=authorization_code HTTP/1.1 -Host: api.weixin.qq.com -User-Agent: GuzzleHttp/7 - - -<<<<<<<< -HTTP/1.1 200 OK -Connection: keep-alive -Content-Type: text/plain -Date: Sun, 03 Oct 2021 16:53:15 GMT -Content-Length: 82 - -{"session_key":"EfPi2h2qX2q+wFNPeOdIAg==","openid":"oShlA5V70X493FmKzdfw66HsbWKY"} --------- -NULL diff --git a/api/app/Http/Controllers/Wx/Controller.php b/api/app/Http/Controllers/Wx/Controller.php deleted file mode 100644 index d8390899..00000000 --- a/api/app/Http/Controllers/Wx/Controller.php +++ /dev/null @@ -1,140 +0,0 @@ -input("action", "import"); - switch ($action) { - case 'download': - $result = []; - $result [] = [ - "昵称" => "xpyzwm", - "登录名" => "xpyzwm", - "电话号码" => "13577728948", - "角色" => 'user' - ]; - $list = collect($result); - // 直接下载 - return (FastExcel::data($list))->download('template.xlsx'); - break; - default: - $data = FastExcel::import(request()->file('file')); - $arrData = $data->toArray(); - $arr = $this->importHandle($arrData); - $this->model::insert($arr['successData']); - $tips = '当前操作导入数据成功' . $arr['successCount'] . '条'; - if ($arr['isError']) { - // 有失败的数据,无法插入,要显示出来,让前端能下载 - $file = time() . '.xlsx'; - $fileName = public_path('xls') . '\\' . $file; - $file = 'xls\\' . $file; - $data = collect($arr['errorData']); - (new FastExcel($data))->export($fileName); - $tips .= ',失败' . $arr['errorCount'] . '条'; - return response()->json([ - 'info' => $tips, - 'fileName' => $file, - 'status' => 'error', - 'status_code' => 422 - ], 422); - } else { - return $this->successWithInfo($tips, 201); - } - } - } - - /** - * 1. 要对每一条记录进行校验 - * 2. 根据校验的结果,计算出可以导入的条数,以及错误的内容 - * @param $arrData - * @return array - */ - protected function importHandle($arrData){ - $error = []; // 错误的具体信息 - $isError = false; // 是否存在信息错误 - $successCount = 0; // 统计数据导入成功的条数 - $errorCount = 0; // 出错的条数 - $arr = []; // 正确的内容存储之后,返回数据 - foreach ($arrData as $key => $item) { - $data = $this->handleItem($item, 'import'); - $data['created_at'] = Carbon::now(); - // 可以根据需要,进一步处理数据 - $this->validatorData($item,$data,$error, $isError ,$successCount, $errorCount,$arr); - } - return [ - 'successData' => $arr, - 'errorData' => $error, - 'isError' => $isError, - 'errorCount' => $errorCount, - 'successCount' => $successCount, - ]; - } - - protected function validatorData($item, $data, &$error, &$isError ,&$successCount, &$errorCount,&$arr){ - if (method_exists($this, 'message')){ - $validator = Validator::make($data,$this->storeRule(),$this->message()); - } else { - $validator = Validator::make($data,$this->storeRule()); - } - if ($validator->fails()){ - // 获取相关的错误信息,并且把错误信息单独存放 - $errors = $validator->errors($validator); - $tips = ''; - foreach ($errors->all() as $message){ - $tips .= $message.','; - } - $tips = substr($tips,0,strlen($tips)-1); - // 状态信息 - $item['错误原因'] = $tips; - $error[] = $item; - $isError = true; - $errorCount ++; - } else { - // 没有出错的,我们先存在正确的数组 - $arr[] = $data; - $successCount ++; - } - } - - protected function storeRule(){ - return []; - } - - protected function UpdateRule($id){ - return []; - } - - -// protected function message(){ -// return []; -// } - - - - -} diff --git a/api/app/Http/Controllers/Wx/Tool.php b/api/app/Http/Controllers/Wx/Tool.php deleted file mode 100644 index e891e914..00000000 --- a/api/app/Http/Controllers/Wx/Tool.php +++ /dev/null @@ -1,87 +0,0 @@ -json([ - 'status' => 'success', - 'status_code' => 200 - ], 200); - } - - protected function successWithInfo($msg = '操作成功', $code = 200) - { - return response()->json([ - 'info' => $msg, - 'status' => 'success', - 'status_code' => $code - ], $code); - } - - protected function successWithData($data = [], $code = 200) - { - return response()->json([ - 'data' => $data, - 'status' => 'success', - 'status_code' => $code - ], $code); - } - - protected function error() - { - return response()->json([ - 'status' => 'error', - 'status_code' => 404 - ], 404); - } - - protected function errorWithInfo($msg = '操作失败', $code = 404) - { - return response()->json([ - 'info' => $msg, - 'status' => 'error', - 'status_code' => $code - ], $code); - } - - protected function errorWithData($data = [], $code = 404) - { - return response()->json([ - 'data' => $data, - 'status' => 'error', - 'status_code' => $code - ], $code); - } - - protected function receiveFile() - { - $file = request()->file('file'); - if ($file->isValid()) { - $domain = getDomain(); - $fileName = $file->store('', 'public'); - $file = Storage::url($fileName); - $path = $domain.$file; - return $path; - } else { - return ''; - } - } - - protected function deleteAvatar($url) { - $domain = getDomain(); - $path = $domain.'/storage/'; - $file = str_replace($path, '', $url); - $address = storage_path('app/public'); - $fileName = $address.'/'.$file; - if (file_exists($fileName)) { - unlink($fileName); - } - } -} diff --git a/api/app/Http/Controllers/Wx/Validate.php b/api/app/Http/Controllers/Wx/Validate.php deleted file mode 100644 index acd8bc5d..00000000 --- a/api/app/Http/Controllers/Wx/Validate.php +++ /dev/null @@ -1,60 +0,0 @@ -storeRule(), $this->message()); - if ($validator->fails()) { - $errors = $validator->errors()->toArray(); - $msg = $this->tranMessage($errors); - return $msg; - }else { - return true; - } - - } - - public function validateUpdate($data, $id) - { - - $validator = Validator::make($data, $this->updateRule($id), $this->message()); - if ($validator->fails()) { - $errors = $validator->errors()->toArray(); - $msg = $this->tranMessage($errors); - return $msg; - }else { - return true; - } - - } - - /** - * 错误信息转换 - * @param $errors - * @return string - */ - protected function tranMessage($errors) - { - $tips = ''; - foreach ($errors as $k => $v) { - foreach ($v as $v1) { - $tips .= $v1.','; - } - } - $end = strrpos($tips,','); - $tips = substr($tips, 0, $end); - return $tips; - } -} diff --git a/api/app/Http/Controllers/Wx/WxController.php b/api/app/Http/Controllers/Wx/WxController.php deleted file mode 100644 index 8d94f89d..00000000 --- a/api/app/Http/Controllers/Wx/WxController.php +++ /dev/null @@ -1,479 +0,0 @@ -format('Y-m-d'); - break; - case '卡通': - return new Image("PNUS_gthOqh84QBcEPZh1tzAgAxZDg3_VffU1kzE9Rw"); - break; - default: - return '谢谢使用,请输入其它信息查询'; - } - } - - protected function eventHandle($event, $message){ - switch ($event) { - case 'subscribe': - return '谢谢你的关注'; - break; - case 'unsubscribe': - return "取消关注"; - break; - case 'CLICK': - return $message['EventKey']; - break; - case 'scancode_push': - - return $message['EventKey']; - break; - case 'scancode_waitmsg': - // logger($message); - return $message['ScanCodeInfo']['ScanResult']; - break; - case 'pic_sysphoto': - return $message['SendPicsInfo']['count']; - break; - case 'pic_photo_or_album': - return $message['SendPicsInfo']['count']; - break; - case 'pic_weixin': - return $message['SendPicsInfo']['count']; - break; - case 'SCAN': - //return header("Location:http://www.baidu.com"); - return $message['EventKey']; - break; - default: - return '收到事件消息'; - } - } - - public function serve() - { - $app = app('wechat.official_account'); - - $app->server->push(function ($message) use($app) { - switch ($message['MsgType']) { - case 'event': - return $this->eventHandle($message['Event'],$message); - break; - case 'text': - return $this->textHandle($message['Content']); - break; - case 'image': - return '收到图片消息'; - break; - case 'voice': - return '收到语音消息'; - break; - case 'video': - return '收到视频消息'; - break; - case 'location': - return '收到坐标消息'; - break; - case 'link': - return '收到链接消息'; - break; - case 'file': - return '收到文件消息'; - // ... 其它消息 - default: - return '收到其它消息'; - break; - } - - // ... - }); - return $app->server->serve(); - } - - public function createMenu() - { - $app = app('wechat.official_account'); - $buttons = [ - [ - "name" => "扫码", - "sub_button" => [ - [ - "type" => "scancode_waitmsg", - "name" => "扫码带提示", - "key" =>"rselfmenu_0_0" - ], - [ - "type" => "scancode_push", - "name" => "扫码推事件", - "key" => "rselfmenu_0_1" - ] - ] - ], - [ - "name" => "发图", - "sub_button" => [ - [ - "type"=> "pic_sysphoto", - "name"=> "系统拍照发图", - "key"=> "rselfmenu_1_0", - ], - [ - "type"=> "pic_photo_or_album", - "name"=> "拍照或者相册发图", - "key"=> "rselfmenu_1_1" - ], - [ - "type"=> "pic_weixin", - "name"=> "微信相册发图", - "key"=> "rselfmenu_1_2" - ] - ] - ], - [ - "name" => "菜单", - "sub_button" => [ - [ - "type" => "view", - "name" => "H5页面", - "url" => "http://wechat.halian.net/" - ] - ], - ], - ]; - $app->menu->create($buttons); - } - - public function customMenu() - { - $app = app('wechat.official_account'); - $buttons = [ - [ - "name" => "扫码", - "sub_button" => [ - [ - "type" => "scancode_waitmsg", - "name" => "扫码带提示", - "key" =>"rselfmenu_0_0" - ], - [ - "type" => "scancode_push", - "name" => "扫码推事件", - "key" => "rselfmenu_0_1" - ] - ] - ], - [ - "name" => "菜单", - "sub_button" => [ - [ - "type" => "view", - "name" => "百度", - "url" => "http://www.baidu.com/" - ], - [ - "type" => "view", - "name" => "业务(SPA)", - "url" => "http://wechat.halian.net/" - ] - ], - ], - ]; - - $matchRule = [ - "tag_id" => "100" - ]; - $app->menu->create($buttons, $matchRule); - } - - public function show() - { - $app = app('wechat.official_account'); - $oauth = $app->oauth; - $oauth->redirect()->send(); - } - - public function callback() - { - $app = app('wechat.official_account'); - $oauth = $app->oauth; - // 获取 OAuth 授权结果用户信息 - $user = $oauth->user()->toArray(); - $user_original = $user['original']; - $token = $user['token']; - $openId = $user['id']; - $expireTime = Carbon::now()->addMinutes(120); - Cache::put($token, $openId, $expireTime); - $url = env('FRONTEND_CALLBACK')."?token=$token"; - header('location: '.$url); - exit; - dd($user); - // 保存个人信息 - // 设置token与openid的缓存 - // 后端带着token跳转到前端 - - return view('user',compact(['user','user_original'])); - } - - public function uploadImg() - { - $result = $app->material->uploadImage("d:/wmhello.mynatapp.cc/wx/public/img/kt.jpg"); -// => [ -// "media_id" => "PNUS_gthOqh84QBcEPZh1tzAgAxZDg3_VffU1kzE9Rw", -// "url" => "http://mmbiz.qpic.cn/mmbiz_jpg/06Lwyviae1AYfW237R4p9yOmHwzvAK8hbISn3lCRgfsdAMMohSRGrZlXK3eWYJwfLNl4gjJwbvO1M5ep5tetPIA/0?wx_fmt=jpeg", -// "item" => [], -// ] - - } - - public function oauth1() - { - $config = [ - // ... - 'app_id' => config('wechat.official_account.default.app_id', 'your-app-id'), // AppID - 'secret' => config('wechat.official_account.default.secret', 'your-app-secret'), // AppSecret - 'token' => config('wechat.official_account.default.token', 'your-token'), // Token - 'aes_key' => config('wechat.official_account.default.aes_key', ''), // EncodingAESKey - 'oauth' => [ - 'scopes' => ['snsapi_userinfo'], - 'callback' => 'http://wmhello.mymynatapp.cc/api/callback1', - ], - ]; - $app = Factory::officialAccount($config); - // $oauth = $app->oauth; - $response = $app->oauth->scopes(['snsapi_userinfo']) - ->redirect('http://wmhello.mynatapp.cc/api/callback1'); - return $response; - } - - public function callback1() - { - $config = [ - // ... - 'app_id' => config('wechat.official_account.default.app_id', 'your-app-id'), // AppID - 'secret' => config('wechat.official_account.default.secret', 'your-app-secret'), // AppSecret - 'token' => config('wechat.official_account.default.token', 'your-token'), // Token - 'aes_key' => config('wechat.official_account.default.aes_key', ''), // EncodingAESKey - 'oauth' => [ - 'scopes' => ['snsapi_userinfo'], - 'callback' => 'http://wmhello.mymynatapp.cc/api/callback1', - ], - ]; - $app = Factory::officialAccount($config); - $oauth = $app->oauth; - - // 获取 OAuth 授权结果用户信息 - $user = $oauth->user()->toArray(); - return view('jssdk', compact(['app', 'user'])); - } - - public function pay_callback() // 支付完成后的回调 - { - - $config = config('wechat.payment.default'); - $pay = Factory::payment($config); - return $pay->handlePaidNotify( - function ($message, $fail) { - logger($message); - if ($message['result_code'] === 'FAIL') { - logger()->warning('WXPAY_CALLBACK', ['FAIL', $message]); - return true; - } else if ($message['return_code'] === 'SUCCESS') { - // TODO: 你的发货逻辑 -// [2020-02-02 03:18:43] local.DEBUG: array ( -// 'appid' => 'wxbd2f8115c5684e21', -// 'bank_type' => 'OTHERS', -// 'cash_fee' => '1', -// 'fee_type' => 'CNY', -// 'is_subscribe' => 'Y', -// 'mch_id' => '1564743201', -// 'nonce_str' => '5e363f8acc401', -// 'openid' => 'ofLgTxGoQtXnjaVC5nFf14ofA0QI', -// 'out_trade_no' => 'no_80110', -// 'result_code' => 'SUCCESS', -// 'return_code' => 'SUCCESS', -// 'sign' => '79173E6161A055A776CC1A70B625BA38', -// 'time_end' => '20200202112205', -// 'total_fee' => '1', -// 'trade_type' => 'JSAPI', -// 'transaction_id' => '4200000488202002024179085143', -// ) - $payId = $message['transaction_id']; // 微信订单的流水号,对于微信支付来说是唯一 - - return true; - } - } - ); - - } - - public function pay(Request $request) // 生成预支付订单 - { -// $config = [ -// // 必要配置 -// 'app_id' => env('WECHAT_PAYMENT_APPID', ''), -// 'mch_id' => env('WECHAT_PAYMENT_MCH_ID', 'your-mch-id'), -// 'key' => env('WECHAT_PAYMENT_KEY', 'key-for-signature'), // API 密钥 -// -// // 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书) -// 'cert_path' => env('WECHAT_PAYMENT_CERT_PATH', 'path/to/cert/apiclient_cert.pem'), // XXX: 绝对路径!!!! -// 'key_path' => env('WECHAT_PAYMENT_KEY_PATH', 'path/to/cert/apiclient_key.pem'), // XXX: 绝对路径!!!! -// 'notify_url' => env('WECHAT_PAYMENT_NOTIFY_URL','http://example.com/payments/wechat-notify') -// ]; -// -// $app = Factory::payment($config); - $pay = $request->input('priec'); - $app = app('wechat.payment'); - $open_id = $request->input('open_id'); - $result = $app->order->unify([ - 'body' => '动物认养', - 'out_trade_no' => 'no_'.random_int(10000, 99999), // 日期时分秒+6位 - 'total_fee' => 1, // 价格 以分为单位 - 'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型 - 'openid' => $open_id, - ]); - if ($result['return_code'] === 'FAIL') { - return $result; - } - if ($result['result_code'] === 'FAIL') { - return $result; - } - $payId = $result['prepay_id']; - $jssdk = $app->jssdk; - $config = $jssdk->bridgeConfig($payId); - return $config; - } - - public function spaPay(Request $request) // 生成预支付订单 - { -// $config = [ -// // 必要配置 -// 'app_id' => env('WECHAT_PAYMENT_APPID', ''), -// 'mch_id' => env('WECHAT_PAYMENT_MCH_ID', 'your-mch-id'), -// 'key' => env('WECHAT_PAYMENT_KEY', 'key-for-signature'), // API 密钥 -// -// // 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书) -// 'cert_path' => env('WECHAT_PAYMENT_CERT_PATH', 'path/to/cert/apiclient_cert.pem'), // XXX: 绝对路径!!!! -// 'key_path' => env('WECHAT_PAYMENT_KEY_PATH', 'path/to/cert/apiclient_key.pem'), // XXX: 绝对路径!!!! -// 'notify_url' => env('WECHAT_PAYMENT_NOTIFY_URL','http://example.com/payments/wechat-notify') -// ]; -// - - logger(' 支付测试 TEST'); - $pay = $request->input('price'); - $token = $request->header('Authorization'); - $open_id = $request->input('open_id'); - - $payment = app('wechat.payment'); - $result = $payment->order->unify([ - 'body' => '动物认养', - 'out_trade_no' => 'no_'.random_int(10000, 99999).'_'.random_int(10000, 99999), // 日期时分秒+6位 - 'total_fee' => 1, // 价格 以分为单位 - 'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型 - 'openid' => $open_id, - ]); - if ($result['return_code'] === 'FAIL') { - return $result; - } - if ($result['result_code'] === 'FAIL') { - return $result; - } - logger($result); - $payId = $result['prepay_id']; - $jssdk = $payment->jssdk; - $config = $jssdk->sdkConfig($payId); - // $config = $jssdk->bridgeConfig($payId); - logger($config); - return $config; - } - - public function getOpenId(Request $request) { - //$params = explode(' ', $token); - $t = $request->input('token'); - if (Cache::has($t)){ - $openId = Cache::get($t); - if (empty($openId)) { - var_dump('empty'); - } else { - return response()->json(Cache::get($t),200); - } - - } else { - return ''; - } - } - - // SPA下授权和获取jssdk签名 - - public function oauth(Request $request) - { - $end_url = request('end_url'); - $app = app('wechat.official_account'); - $oauth = $app->oauth; - $user = $oauth->user(); - $info = $user->getOriginal(); - $data = array( - 'openid' => $info['openid'], - 'nickname' => $info['nickname'], - 'gender' => $info['sex'], - 'avatar' => $info['headimgurl'], - 'province' => $info['province'] ?? '', - 'city' => $info['city'] ?? '', - 'country' => $info['country']??'', - 'follow' => $info['subscribe'] ?? 0, - 'follow_time' => $info['subscribe_time'] ?? 0 - ); - $token = $user['token']; //md5(uniqid()); - $expiresAt = Carbon::now()->addDays(7); - Cache::put($token,$data['openid'], $expiresAt); - $url="$end_url?token=".$token.'&openid='.$data['openid']; // - header('location: '.$url); - exit; - } - - public function start_oauth(Request $request) - { - $end_url = $request->input('end_url'); - $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://"; - $http_host = "$protocol$_SERVER[HTTP_HOST]"; - $config = [ - // ... - 'app_id' => config('wechat.official_account.default.app_id', 'your-app-id'), // AppID - 'secret' => config('wechat.official_account.default.secret', 'your-app-secret'), // AppSecret - 'token' => config('wechat.official_account.default.token', 'your-token'), // Token - 'aes_key' => config('wechat.official_account.default.aes_key', ''), // EncodingAESKey - 'oauth' => [ - 'scopes' => ['snsapi_userinfo'], - 'callback' => $http_host.'/api/wx/oauth?end_url='.$end_url - ], - ]; - $app = Factory::officialAccount($config); - $oauth=$app->oauth; - return $oauth->redirect()->send(); - } - - public function config(Request $request) // jssdk配置 - { - $api = $request->input('api', []); - $url = $request->input('url', env('FRONTEND_CALL')); - $app = app('wechat.official_account'); - // $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://"; -// $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; - $app->jssdk->setUrl($url); - $config = $app->jssdk->buildConfig($api, true, false,true); - return $config; - } - -} diff --git a/api/app/Http/Kernel.php b/api/app/Http/Kernel.php deleted file mode 100644 index acd3f396..00000000 --- a/api/app/Http/Kernel.php +++ /dev/null @@ -1,86 +0,0 @@ - [ - \App\Http\Middleware\EncryptCookies::class, - \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, - \Illuminate\Session\Middleware\StartSession::class, - // \Illuminate\Session\Middleware\AuthenticateSession::class, - \Illuminate\View\Middleware\ShareErrorsFromSession::class, - \App\Http\Middleware\VerifyCsrfToken::class, - \Illuminate\Routing\Middleware\SubstituteBindings::class, - ], - - 'api' => [ - 'throttle:60,1', - \Illuminate\Routing\Middleware\SubstituteBindings::class, - ], - ]; - - /** - * The application's route middleware. - * - * These middleware may be assigned to groups or used individually. - * - * @var array - */ - protected $routeMiddleware = [ - 'auth' => \App\Http\Middleware\Authenticate::class, - 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, - 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, - 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, - 'can' => \Illuminate\Auth\Middleware\Authorize::class, - 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, - 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, - 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, - 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, - 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, - 'check.mp' => \App\Http\Middleware\CheckMiniProgram::class, - 'check.source' => \App\Http\Middleware\CheckSource::class, - 'role' => Role::class, - ]; - - /** - * The priority-sorted list of middleware. - * - * This forces non-global middleware to always be in the given order. - * - * @var array - */ - protected $middlewarePriority = [ - \Illuminate\Session\Middleware\StartSession::class, - \Illuminate\View\Middleware\ShareErrorsFromSession::class, - \App\Http\Middleware\Authenticate::class, - \Illuminate\Routing\Middleware\ThrottleRequests::class, - \Illuminate\Session\Middleware\AuthenticateSession::class, - \Illuminate\Routing\Middleware\SubstituteBindings::class, - \Illuminate\Auth\Middleware\Authorize::class, - ]; -} diff --git a/api/app/Http/Middleware/Authenticate.php b/api/app/Http/Middleware/Authenticate.php deleted file mode 100644 index 704089a7..00000000 --- a/api/app/Http/Middleware/Authenticate.php +++ /dev/null @@ -1,21 +0,0 @@ -expectsJson()) { - return route('login'); - } - } -} diff --git a/api/app/Http/Middleware/CheckForMaintenanceMode.php b/api/app/Http/Middleware/CheckForMaintenanceMode.php deleted file mode 100644 index 35b9824b..00000000 --- a/api/app/Http/Middleware/CheckForMaintenanceMode.php +++ /dev/null @@ -1,17 +0,0 @@ -header('Authorization'); - $arrTemp = explode(' ', $auth); - if (count($arrTemp)===2 && $arrTemp[0] === 'Bearer'){ - // 根据令牌获取openid,然后去查看是否有该用户 - $token = $arrTemp[1]; - $openId = $token; - // 用户没有注册,也许是使用postman等直接调用的 - $member = User::where('open_id', $openId)->first(); - if (!$member){ - return response()->json( [ - 'msg' => '没有找到指定的内容,请用微信登录', - 'status' => 'error', - 'status_code' => 400 - ], 400); - } - return $next($request); - } else { - return response()->json( [ - 'msg' => '指定的令牌不对', - 'status' => 'error', - 'status_code' => 400 - ], 400); - } - - } -} diff --git a/api/app/Http/Middleware/CheckSource.php b/api/app/Http/Middleware/CheckSource.php deleted file mode 100644 index 99511a9f..00000000 --- a/api/app/Http/Middleware/CheckSource.php +++ /dev/null @@ -1,31 +0,0 @@ -json([ - 'info' => '请使用微信访问', - 'status' => 'ok', - 'status_code' => 200 - ], 200); - - } - } -} diff --git a/api/app/Http/Middleware/Role.php b/api/app/Http/Middleware/Role.php deleted file mode 100644 index 6735bad9..00000000 --- a/api/app/Http/Middleware/Role.php +++ /dev/null @@ -1,72 +0,0 @@ -check()){ - $id = $request->user()->id; - // 2. 判断当前用户是否是系统管理员 ’admin', 是就直接放行 - $roles = DB::table('v_admin_roles')->find($id)->name; - if ($roles === 'admin') { - return $next($request); - } else { -// 3. 如果不是管理员,进一步验证权限,如果是管理员,则无条件放行 - $route = Route::currentRouteName(); - $permisions = []; - $whiteList = ['admins.login', 'admins.logout','admins.me', 'admins.refresh', - 'logs.show', 'logs.index', 'admins.modify', 'admins.show', - 'kefu.menu', 'chat.menu', 'medias.store']; - if (in_array($route, $whiteList)) { - return $next($request); - } else { - $arrPermissons = DB::table('v_admin_permissions')->where('id', $id)->pluck('full_permissions')->toArray(); - // 获取当前用户所有角色的功能 - if (in_array($route, $arrPermissons)){ - return $next($request); - } else { - return response()->json([ - 'status' => 'error', - 'status_code' => 403, - 'info' => '无法访问指定的接口,请授权后再访问' - ], 403); - } - } - - } - } else { - // 没有登录 - return response()->json([ - "status"=> 'error', - "status_code" => 401, - "info" => "无法访问指定的接口,请登录后再试" - ], 401); - } - // 同意放行 - } - - public function getAdmin() - { - return 'admin'; - } - - -} - diff --git a/api/app/Http/Middleware/TrustProxies.php b/api/app/Http/Middleware/TrustProxies.php deleted file mode 100644 index ee5b5958..00000000 --- a/api/app/Http/Middleware/TrustProxies.php +++ /dev/null @@ -1,23 +0,0 @@ - $this->id, - 'nickname' => $this->nickname, - "email" => $this->email, - "phone" => $this->phone, - "avatar" => $this->avatar, - "status" => $this->status, - 'roles' => AdminRole::collection($this->admin_roles), - 'permissions' => $this->getPermissions($this->id) - ]; - } - - public function with($request) - { - return [ - 'status' => 'success', - 'status_code' => 200 - ]; - } - - protected function getPermissions($id) - { - - $data = DB::table('v_admin_permissions')->where('admin_id', $id)->pluck('full_permissions'); - return $data; - } - -} diff --git a/api/app/Http/Resources/AdminCollection.php b/api/app/Http/Resources/AdminCollection.php deleted file mode 100644 index 7cdfcf4e..00000000 --- a/api/app/Http/Resources/AdminCollection.php +++ /dev/null @@ -1,23 +0,0 @@ - $this->collection, - 'status' => 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/AdminRole.php b/api/app/Http/Resources/AdminRole.php deleted file mode 100644 index 5d8b36df..00000000 --- a/api/app/Http/Resources/AdminRole.php +++ /dev/null @@ -1,35 +0,0 @@ - $this->id, - 'admin_id' => $this->admin_id, - 'admin_nickname' => $this->admin->nickname, - 'role_id' => $this->role_id, - 'role_name' => $this->role->name, - 'role_desc' => $this->role->desc - - ]; - } - - public function with($request) - { - return [ - 'status' => 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/AdminRoleCollection.php b/api/app/Http/Resources/AdminRoleCollection.php deleted file mode 100644 index 8ef21fee..00000000 --- a/api/app/Http/Resources/AdminRoleCollection.php +++ /dev/null @@ -1,23 +0,0 @@ - $this->collection, - 'status' => 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/Article.php b/api/app/Http/Resources/Article.php deleted file mode 100644 index 91bde6ac..00000000 --- a/api/app/Http/Resources/Article.php +++ /dev/null @@ -1,31 +0,0 @@ -category; - $data['created_at'] = $data['created_at'] * 1000; - $data['updated_at'] = $data['updated_at'] * 1000; - return $data; - } - - public function with($request) - { - return [ - 'status' => 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/ArticleCategory.php b/api/app/Http/Resources/ArticleCategory.php deleted file mode 100644 index 0a4779a3..00000000 --- a/api/app/Http/Resources/ArticleCategory.php +++ /dev/null @@ -1,31 +0,0 @@ -articles; - $data['created_at'] = $data['created_at'] * 1000; - $data['updated_at'] = $data['updated_at'] * 1000; - return $data; - } - - public function with($request) - { - return [ - 'status' => 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/ArticleCategoryCollection.php b/api/app/Http/Resources/ArticleCategoryCollection.php deleted file mode 100644 index 94b7c302..00000000 --- a/api/app/Http/Resources/ArticleCategoryCollection.php +++ /dev/null @@ -1,24 +0,0 @@ - $this->collection, - 'status' => 'success', - 'status_code' => 200 - ]; - - } -} diff --git a/api/app/Http/Resources/ArticleCollection.php b/api/app/Http/Resources/ArticleCollection.php deleted file mode 100644 index 8a697a32..00000000 --- a/api/app/Http/Resources/ArticleCollection.php +++ /dev/null @@ -1,24 +0,0 @@ - $this->collection, - 'status' => 'success', - 'status_code' => 200 - ]; - - } -} diff --git a/api/app/Http/Resources/Carousel.php b/api/app/Http/Resources/Carousel.php deleted file mode 100644 index 42c5340d..00000000 --- a/api/app/Http/Resources/Carousel.php +++ /dev/null @@ -1,30 +0,0 @@ - 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/CarouselCollection.php b/api/app/Http/Resources/CarouselCollection.php deleted file mode 100644 index 6ce4b119..00000000 --- a/api/app/Http/Resources/CarouselCollection.php +++ /dev/null @@ -1,24 +0,0 @@ - $this->collection, - 'status' => 'success', - 'status_code' => 200 - ]; - - } -} diff --git a/api/app/Http/Resources/Code.php b/api/app/Http/Resources/Code.php deleted file mode 100644 index 81880b57..00000000 --- a/api/app/Http/Resources/Code.php +++ /dev/null @@ -1,31 +0,0 @@ - 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/CodeCollection.php b/api/app/Http/Resources/CodeCollection.php deleted file mode 100644 index 54e64398..00000000 --- a/api/app/Http/Resources/CodeCollection.php +++ /dev/null @@ -1,23 +0,0 @@ - $this->collection, - 'status' => 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/CodeConfig.php b/api/app/Http/Resources/CodeConfig.php deleted file mode 100644 index f45ab9c0..00000000 --- a/api/app/Http/Resources/CodeConfig.php +++ /dev/null @@ -1,32 +0,0 @@ - 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/CodeConfigCollection.php b/api/app/Http/Resources/CodeConfigCollection.php deleted file mode 100644 index f36cb185..00000000 --- a/api/app/Http/Resources/CodeConfigCollection.php +++ /dev/null @@ -1,23 +0,0 @@ - $this->collection, - 'status' => 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/CodeSnippet.php b/api/app/Http/Resources/CodeSnippet.php deleted file mode 100644 index de86d39a..00000000 --- a/api/app/Http/Resources/CodeSnippet.php +++ /dev/null @@ -1,29 +0,0 @@ - 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/CodeSnippetCollection.php b/api/app/Http/Resources/CodeSnippetCollection.php deleted file mode 100644 index e564a28e..00000000 --- a/api/app/Http/Resources/CodeSnippetCollection.php +++ /dev/null @@ -1,23 +0,0 @@ - $this->collection, - 'status' => 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/Module.php b/api/app/Http/Resources/Module.php deleted file mode 100644 index 6ad34449..00000000 --- a/api/app/Http/Resources/Module.php +++ /dev/null @@ -1,34 +0,0 @@ - $this->id, - 'name' => $this->name, - 'desc' => $this->desc, - 'permissions' => Permission::collection($this->permissions), - 'created_at' => $this->created_at - ]; - } - - public function with($request) - { - return [ - 'status' => 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/ModuleCollection.php b/api/app/Http/Resources/ModuleCollection.php deleted file mode 100644 index b75eb795..00000000 --- a/api/app/Http/Resources/ModuleCollection.php +++ /dev/null @@ -1,24 +0,0 @@ - $this->collection, - 'status' => 'success', - 'status_code' => 200 - ]; - - } -} diff --git a/api/app/Http/Resources/Permission.php b/api/app/Http/Resources/Permission.php deleted file mode 100644 index 0273e255..00000000 --- a/api/app/Http/Resources/Permission.php +++ /dev/null @@ -1,36 +0,0 @@ - $this->id, - 'name' => $this->name, - 'desc' => $this->desc, - 'module_id' => $this->module_id, - 'module_name' => $this->module->name, - 'module_desc' => $this->module->desc, - 'permission_name' => $this->module->name.'.'.$this->name, - 'created_at' => $this->created_at - ]; - } - - public function with($request) - { - return [ - 'status' => 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/Role.php b/api/app/Http/Resources/Role.php deleted file mode 100644 index 5fccea71..00000000 --- a/api/app/Http/Resources/Role.php +++ /dev/null @@ -1,33 +0,0 @@ - $this->id, - 'name' => $this->name, - 'desc' => $this->desc, - 'role_permissions' => RolePermission::collection($this->role_permissions), - 'created_at' => $this->created_at - ]; - } - - public function with($request) - { - return [ - 'status' => 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/RolePermission.php b/api/app/Http/Resources/RolePermission.php deleted file mode 100644 index aa5d2ce6..00000000 --- a/api/app/Http/Resources/RolePermission.php +++ /dev/null @@ -1,39 +0,0 @@ - $this->id, - 'role_id' => $this->role_id, - 'role_name' => $this->role->name, - 'role_desc' => $this->role->desc, - 'permission_id' => $this->permission_id, - 'permission_name' => $this->permission->name, - 'permission_desc' => $this->permission->desc, - 'module_id' => $this->permission->module->id, - 'module_name' => $this->permission->module->name, - 'module_desc' => $this->permission->module->desc, - 'module_permission' => $this->permission->module->name.'.'.$this->permission->name - ]; - } - - public function with($request) - { - return [ - 'status' => 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/RolePermissionCollection.php b/api/app/Http/Resources/RolePermissionCollection.php deleted file mode 100644 index d2b7e0cb..00000000 --- a/api/app/Http/Resources/RolePermissionCollection.php +++ /dev/null @@ -1,23 +0,0 @@ - $this->collection, - 'status' => 'success', - 'status_code' => 200 - ];; - } -} diff --git a/api/app/Http/Resources/Table.php b/api/app/Http/Resources/Table.php deleted file mode 100644 index a96af260..00000000 --- a/api/app/Http/Resources/Table.php +++ /dev/null @@ -1,36 +0,0 @@ - $this->id, - 'table_name' => $this->table_name, - 'engine' => $this->engine, - 'table_collation' => $this->table_collation, - 'table_comment' => $this->table_comment, - 'create_time' => $this->create_time, - 'table_config' => $this->table_config - ]; - return $data; - } - - public function with($request) - { - return [ - 'status' => 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/TableCollection.php b/api/app/Http/Resources/TableCollection.php deleted file mode 100644 index 0c3def59..00000000 --- a/api/app/Http/Resources/TableCollection.php +++ /dev/null @@ -1,23 +0,0 @@ - $this->collection, - 'status' => 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/TableConfig.php b/api/app/Http/Resources/TableConfig.php deleted file mode 100644 index 303bab34..00000000 --- a/api/app/Http/Resources/TableConfig.php +++ /dev/null @@ -1,40 +0,0 @@ - $this->id?:0, -// 'table_name' => $this->table_name, -// 'column_name' => $this->column_name, -// 'data_type' => $this->data_type, -// 'column_comment' => $this->column_comment, -// 'is_required' => is_bool($this->is_required)?$this->is_required:false, -// -// ]; - - // 数据转换 - $data = parent::toArray($request); - return $data; - } - - public function with($request) - { - return [ - 'status' => 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/TableConfigCollection.php b/api/app/Http/Resources/TableConfigCollection.php deleted file mode 100644 index 7fb71b67..00000000 --- a/api/app/Http/Resources/TableConfigCollection.php +++ /dev/null @@ -1,23 +0,0 @@ - $this->collection, - 'status' => 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/Template.php b/api/app/Http/Resources/Template.php deleted file mode 100644 index 51c3311b..00000000 --- a/api/app/Http/Resources/Template.php +++ /dev/null @@ -1,30 +0,0 @@ - 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/TemplateCollection.php b/api/app/Http/Resources/TemplateCollection.php deleted file mode 100644 index 43e9180f..00000000 --- a/api/app/Http/Resources/TemplateCollection.php +++ /dev/null @@ -1,23 +0,0 @@ - $this->collection, - 'status' => 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/User.php b/api/app/Http/Resources/User.php deleted file mode 100644 index 115491dd..00000000 --- a/api/app/Http/Resources/User.php +++ /dev/null @@ -1,37 +0,0 @@ - $this->id, - 'nickname' => $this->nickname, - "email" => $this->email, - "phone" => $this->phone, - "avatar" => $this->avatar, - "status" => $this->status, - 'open_id' => $this->open_id, - 'union_id' => $this->union_id, - 'created_at' => $this->created_at - ]; - } - - public function with($request) - { - return [ - 'status' => 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/UserCollection.php b/api/app/Http/Resources/UserCollection.php deleted file mode 100644 index acb40668..00000000 --- a/api/app/Http/Resources/UserCollection.php +++ /dev/null @@ -1,23 +0,0 @@ - $this->collection, - 'status' => 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Http/Resources/Wechat.php b/api/app/Http/Resources/Wechat.php deleted file mode 100644 index 1efcf195..00000000 --- a/api/app/Http/Resources/Wechat.php +++ /dev/null @@ -1,31 +0,0 @@ - 'success', - 'status_code' => 200 - ]; - } -} \ No newline at end of file diff --git a/api/app/Http/Resources/WechatCollection.php b/api/app/Http/Resources/WechatCollection.php deleted file mode 100644 index 0ef13ad4..00000000 --- a/api/app/Http/Resources/WechatCollection.php +++ /dev/null @@ -1,23 +0,0 @@ - $this->collection, - 'status' => 'success', - 'status_code' => 200 - ]; - } -} diff --git a/api/app/Models/Admin.php b/api/app/Models/Admin.php deleted file mode 100644 index 7bd1a96b..00000000 --- a/api/app/Models/Admin.php +++ /dev/null @@ -1,94 +0,0 @@ - 'timestamp', - 'updated_at' => 'timestamp', - 'status' => 'boolean' - ]; - // 多个字段来验证 - public function findForPassport($username) - { - return $this->orWhere('email', $username)->orWhere('phone', $username)->first(); - } - - public function scopeEmail($query) - { - $params = request()->input('email'); - if ($params) { - return $query = $query->where('email', like, "%".$params."%"); - } else { - return $query; - } - } - - public function scopePhone($query) - { - $params = request()->input('phone'); - if ($params) { - return $query = $query->where('phone', like, "%".$params."%"); - } else { - return $query; - } - } - - public function admin_roles() - { - return $this->hasMany(AdminRole::class); - } - -} diff --git a/api/app/Models/AdminPermission.php b/api/app/Models/AdminPermission.php deleted file mode 100644 index 92bb160e..00000000 --- a/api/app/Models/AdminPermission.php +++ /dev/null @@ -1,29 +0,0 @@ -belongsTo(Admin::class); - } - - public function role() - { - return $this->belongsTo(Role::class); - } -} diff --git a/api/app/Models/Article.php b/api/app/Models/Article.php deleted file mode 100644 index 8401ea57..00000000 --- a/api/app/Models/Article.php +++ /dev/null @@ -1,50 +0,0 @@ - 'timestamp', - 'updated_at' => 'timestamp', - 'status' => 'boolean' - ]; - - public function category() - { - return $this->belongsTo(ArticleCategory::class, 'article_category_id', 'id'); - } -} diff --git a/api/app/Models/ArticleCategory.php b/api/app/Models/ArticleCategory.php deleted file mode 100644 index a04db6ba..00000000 --- a/api/app/Models/ArticleCategory.php +++ /dev/null @@ -1,44 +0,0 @@ - 'timestamp', - 'updated_at' => 'timestamp', - 'status' => 'boolean' - ]; - - public function articles() - { - return $this->hasMany(Article::class); - } -} diff --git a/api/app/Models/Carousel.php b/api/app/Models/Carousel.php deleted file mode 100644 index 1b407b47..00000000 --- a/api/app/Models/Carousel.php +++ /dev/null @@ -1,39 +0,0 @@ - 'timestamp', - 'updated_at' => 'timestamp' - ]; -} diff --git a/api/app/Models/Code.php b/api/app/Models/Code.php deleted file mode 100644 index d7b565de..00000000 --- a/api/app/Models/Code.php +++ /dev/null @@ -1,15 +0,0 @@ - 'timestamp', - 'updated_at' => 'timestamp' - ]; - - protected $guarded = []; - - -} diff --git a/api/app/Models/CodeSnippet.php b/api/app/Models/CodeSnippet.php deleted file mode 100644 index 5bec1315..00000000 --- a/api/app/Models/CodeSnippet.php +++ /dev/null @@ -1,15 +0,0 @@ - 'timestamp' - ]; - - public function permissions() - { - return $this->hasMany(Permission::class); - } - -} diff --git a/api/app/Models/Permission.php b/api/app/Models/Permission.php deleted file mode 100644 index 67be6c8e..00000000 --- a/api/app/Models/Permission.php +++ /dev/null @@ -1,47 +0,0 @@ - 'timestamp' - ]; - - public function module() - { - return $this->belongsTo(Module::class); - } - - public function role_permissions() - { - return $this->hasMany(RolePermission::class); - } -} diff --git a/api/app/Models/Role.php b/api/app/Models/Role.php deleted file mode 100644 index 2dbf14cf..00000000 --- a/api/app/Models/Role.php +++ /dev/null @@ -1,54 +0,0 @@ - 'timestamp', - 'updated_at' => 'timestamp', - ]; - - public function role_permissions() - { - return $this->hasMany(RolePermission::class); - } - - public function permissions() - { - return $this->hasManyThrough(Permission::class, RolePermission::class); - } - - public function admin_roles() - { - return $this->hasMany(AdminRole::class); - } -} diff --git a/api/app/Models/RolePermission.php b/api/app/Models/RolePermission.php deleted file mode 100644 index cd5db03f..00000000 --- a/api/app/Models/RolePermission.php +++ /dev/null @@ -1,48 +0,0 @@ -belongsTo(Role::class); - } - - public function permission() - { - return $this->belongsTo(Permission::class); - } - - public function module(){ - return $this->hasManyThrough(Module::class,Permission::class, 'id', 'id', - 'permission_id', 'module_id'); - } -} diff --git a/api/app/Models/Table.php b/api/app/Models/Table.php deleted file mode 100644 index 3c668e41..00000000 --- a/api/app/Models/Table.php +++ /dev/null @@ -1,25 +0,0 @@ - 'array' - ]; - protected $guarded = []; - - -} diff --git a/api/app/Models/TableConfig.php b/api/app/Models/TableConfig.php deleted file mode 100644 index 638cc29d..00000000 --- a/api/app/Models/TableConfig.php +++ /dev/null @@ -1,20 +0,0 @@ - 'boolean', - 'is_list' => 'boolean', - 'is_form' => 'boolean', - ]; - - protected $guarded = []; - - -} diff --git a/api/app/Models/Template.php b/api/app/Models/Template.php deleted file mode 100644 index 6d62de97..00000000 --- a/api/app/Models/Template.php +++ /dev/null @@ -1,14 +0,0 @@ - 'timestamp', - 'updated_at' => 'timestamp', - 'status' => 'boolean' - ]; - -} diff --git a/api/app/Models/Wechat.php b/api/app/Models/Wechat.php deleted file mode 100644 index bb4d1285..00000000 --- a/api/app/Models/Wechat.php +++ /dev/null @@ -1,35 +0,0 @@ -input('app_id'); - if ($params) { - return $query = $query->where('app_id', $params); - } else { - return $query; - } - } - public function scopeApp_secret($query) - { - $params = request()->input('app_secret'); - if ($params) { - return $query = $query->where('app_secret', 'like', "%".$params."%"); - } else { - return $query; - } - } - - - -} \ No newline at end of file diff --git a/api/app/Models/orders.php b/api/app/Models/orders.php deleted file mode 100644 index e5e41ea0..00000000 --- a/api/app/Models/orders.php +++ /dev/null @@ -1,21 +0,0 @@ -app->environment() !== 'production') { - $this->app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class); - } - // - } - - /** - * Bootstrap any application services. - * - * @return void - */ - public function boot() - { - // - } -} diff --git a/api/app/Providers/AuthServiceProvider.php b/api/app/Providers/AuthServiceProvider.php deleted file mode 100644 index 27179470..00000000 --- a/api/app/Providers/AuthServiceProvider.php +++ /dev/null @@ -1,39 +0,0 @@ - 'App\Policies\ModelPolicy', - ]; - - /** - * Register any authentication / authorization services. - * - * @return void - */ - public function boot() - { - $this->registerPolicies(); - Passport::routes(); - // passport 令牌的时间设置 - Passport::tokensExpireIn(now()->addMinutes(120)); // 2个小时的令牌过期时间 - Passport::refreshTokensExpireIn(now()->addDays(30)); // 30天的刷新令牌过期时间 - Passport::personalAccessTokensExpireIn(now()->addMonths(6)); - - // 私人访问令牌 - Passport::personalAccessClientId('1'); - - // - } -} diff --git a/api/app/Providers/EventServiceProvider.php b/api/app/Providers/EventServiceProvider.php deleted file mode 100644 index 723a290d..00000000 --- a/api/app/Providers/EventServiceProvider.php +++ /dev/null @@ -1,34 +0,0 @@ - [ - SendEmailVerificationNotification::class, - ], - ]; - - /** - * Register any events for your application. - * - * @return void - */ - public function boot() - { - parent::boot(); - - // - } -} diff --git a/api/bootstrap/app.php b/api/bootstrap/app.php deleted file mode 100644 index 037e17df..00000000 --- a/api/bootstrap/app.php +++ /dev/null @@ -1,55 +0,0 @@ -singleton( - Illuminate\Contracts\Http\Kernel::class, - App\Http\Kernel::class -); - -$app->singleton( - Illuminate\Contracts\Console\Kernel::class, - App\Console\Kernel::class -); - -$app->singleton( - Illuminate\Contracts\Debug\ExceptionHandler::class, - App\Exceptions\Handler::class -); - -/* -|-------------------------------------------------------------------------- -| Return The Application -|-------------------------------------------------------------------------- -| -| This script returns the application instance. The instance is given to -| the calling script so we can separate the building of the instances -| from the actual running of the application and sending responses. -| -*/ - -return $app; diff --git a/api/bootstrap/helpers.php b/api/bootstrap/helpers.php deleted file mode 100644 index b1e15e88..00000000 --- a/api/bootstrap/helpers.php +++ /dev/null @@ -1,25 +0,0 @@ -url(); - $path = request()->path(); - $domain = str_replace($path,"", $url); - return $domain; -} - //压缩整个文件夹以及过滤 - function zipFolder($basePath,$relativePath,$zip) - { - $handler = opendir($basePath.$relativePath); //打开当前文件夹 - while(($filename = readdir($handler))!==false){ //readdir() 函数返回目录中下一个文件的文件名 - if($filename != '.' && $filename != '..'){ //若文件为目录,则递归调用函数 - if(is_dir($basePath . $relativePath. '/' . $filename)){ - zipFolder($basePath, $relativePath. '/' . $filename, $zip); - }else{ - $zip->addFile($basePath . $relativePath. '/' .$filename, $relativePath. '/' . $filename); - } - } - } - closedir($handler); - } diff --git a/api/cmd.bat b/api/cmd.bat deleted file mode 100644 index d231b484..00000000 --- a/api/cmd.bat +++ /dev/null @@ -1,5 +0,0 @@ - -php artisan make:model Models\Wechat -all -php artisan make:resource Wechat -php artisan make:resource WechatCollection - diff --git a/api/composer.json b/api/composer.json deleted file mode 100644 index c37a2f2b..00000000 --- a/api/composer.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "name": "laravel/laravel", - "type": "project", - "description": "The Laravel Framework.", - "keywords": [ - "framework", - "laravel" - ], - "license": "MIT", - "require": { - "php": "^7.2.5|^8.0", - "doctrine/dbal": " ~2.3", - "fideloper/proxy": "^4.4", - "guzzlehttp/guzzle": "~6.0", - "laravel/framework": "6.20.*", - "laravel/passport": "9.*", - "laravel/socialite": "^5.2", - "laravel/tinker": "^2.5", - "mews/captcha": "3.2", - "overtrue/easy-sms": "^1.3", - "overtrue/laravel-wechat": "~5.0", - "overtrue/wechat": "^4.2", - "php-pdfbox/php-pdfbox": "^1.0", - "predis/predis": "^1.1", - "rap2hpoutre/fast-excel": "^3.0", - "sgh/pdfbox": "^1.0", - "smalot/pdfparser": "^1.1", - "barryvdh/laravel-ide-helper": "2.7.0" - }, - "require-dev": { - "barryvdh/laravel-ide-helper": "2.8.0", - "facade/ignition": "^1.16.15", - "fakerphp/faker": "^1.9.1", - "mockery/mockery": "^1.0", - "nunomaduro/collision": "^3.0", - "phpunit/phpunit": "^8.5.8|^9.3.3" - }, - "config": { - "optimize-autoloader": true, - "preferred-install": "dist", - "sort-packages": true, - "allow-plugins": { - "easywechat-composer/easywechat-composer": true - } - }, - "extra": { - "laravel": { - "dont-discover": [] - } - }, - "autoload": { - "psr-4": { - "App\\": "app/" - }, - "classmap": [ - "database/seeds", - "database/factories" - ], - "files":[ - "bootstrap/helpers.php" - ] - }, - "autoload-dev": { - "psr-4": { - "Tests\\": "tests/" - } - }, - "minimum-stability": "dev", - "prefer-stable": true, - "scripts": { - "post-autoload-dump": [ - "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", - "@php artisan package:discover --ansi" - ], - "post-root-package-install": [ - "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" - ], - "post-create-project-cmd": [ - "@php artisan key:generate --ansi" - ] - } -} diff --git a/api/composer.lock b/api/composer.lock deleted file mode 100644 index ed81d3e3..00000000 --- a/api/composer.lock +++ /dev/null @@ -1,11422 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "6c354a264b791d754058ca2b7da8cd03", - "packages": [ - { - "name": "box/spout", - "version": "v3.3.0", - "source": { - "type": "git", - "url": "https://github.com/box/spout.git", - "reference": "9bdb027d312b732515b884a341c0ad70372c6295" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/box/spout/zipball/9bdb027d312b732515b884a341c0ad70372c6295", - "reference": "9bdb027d312b732515b884a341c0ad70372c6295", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-dom": "*", - "ext-xmlreader": "*", - "ext-zip": "*", - "php": ">=7.2.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2", - "phpunit/phpunit": "^8" - }, - "suggest": { - "ext-iconv": "To handle non UTF-8 CSV files (if \"php-intl\" is not already installed or is too limited)", - "ext-intl": "To handle non UTF-8 CSV files (if \"iconv\" is not already installed)" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Box\\Spout\\": "src/Spout" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Adrien Loison", - "email": "adrien@box.com" - } - ], - "description": "PHP Library to read and write spreadsheet files (CSV, XLSX and ODS), in a fast and scalable way", - "homepage": "https://www.github.com/box/spout", - "keywords": [ - "OOXML", - "csv", - "excel", - "memory", - "odf", - "ods", - "office", - "open", - "php", - "read", - "scale", - "spreadsheet", - "stream", - "write", - "xlsx" - ], - "support": { - "issues": "https://github.com/box/spout/issues", - "source": "https://github.com/box/spout/tree/v3.3.0" - }, - "time": "2021-05-14T21:18:09+00:00" - }, - { - "name": "defuse/php-encryption", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/defuse/php-encryption.git", - "reference": "77880488b9954b7884c25555c2a0ea9e7053f9d2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/defuse/php-encryption/zipball/77880488b9954b7884c25555c2a0ea9e7053f9d2", - "reference": "77880488b9954b7884c25555c2a0ea9e7053f9d2", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-openssl": "*", - "paragonie/random_compat": ">= 2", - "php": ">=5.6.0" - }, - "require-dev": { - "phpunit/phpunit": "^4|^5|^6|^7|^8|^9" - }, - "bin": [ - "bin/generate-defuse-key" - ], - "type": "library", - "autoload": { - "psr-4": { - "Defuse\\Crypto\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Hornby", - "email": "taylor@defuse.ca", - "homepage": "https://defuse.ca/" - }, - { - "name": "Scott Arciszewski", - "email": "info@paragonie.com", - "homepage": "https://paragonie.com" - } - ], - "description": "Secure PHP Encryption Library", - "keywords": [ - "aes", - "authenticated encryption", - "cipher", - "crypto", - "cryptography", - "encrypt", - "encryption", - "openssl", - "security", - "symmetric key cryptography" - ], - "support": { - "issues": "https://github.com/defuse/php-encryption/issues", - "source": "https://github.com/defuse/php-encryption/tree/v2.3.1" - }, - "time": "2021-04-09T23:57:26+00:00" - }, - { - "name": "doctrine/cache", - "version": "2.1.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "331b4d5dbaeab3827976273e9356b3b453c300ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/331b4d5dbaeab3827976273e9356b3b453c300ce", - "reference": "331b4d5dbaeab3827976273e9356b3b453c300ce", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "~7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "alcaeus/mongo-php-adapter": "^1.1", - "cache/integration-tests": "dev-master", - "doctrine/coding-standard": "^8.0", - "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "predis/predis": "~1.0", - "psr/cache": "^1.0 || ^2.0 || ^3.0", - "symfony/cache": "^4.4 || ^5.2 || ^6.0@dev", - "symfony/var-exporter": "^4.4 || ^5.2 || ^6.0@dev" - }, - "suggest": { - "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", - "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", - "php", - "redis", - "xcache" - ], - "support": { - "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/2.1.1" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", - "type": "tidelift" - } - ], - "time": "2021-07-17T14:49:29+00:00" - }, - { - "name": "doctrine/dbal", - "version": "2.13.7", - "source": { - "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "6e22f6012b42d7932674857989fcf184e9e9b1c3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/6e22f6012b42d7932674857989fcf184e9e9b1c3", - "reference": "6e22f6012b42d7932674857989fcf184e9e9b1c3", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "doctrine/cache": "^1.0|^2.0", - "doctrine/deprecations": "^0.5.3", - "doctrine/event-manager": "^1.0", - "ext-pdo": "*", - "php": "^7.1 || ^8" - }, - "require-dev": { - "doctrine/coding-standard": "9.0.0", - "jetbrains/phpstorm-stubs": "2021.1", - "phpstan/phpstan": "1.3.0", - "phpunit/phpunit": "^7.5.20|^8.5|9.5.11", - "psalm/plugin-phpunit": "0.16.1", - "squizlabs/php_codesniffer": "3.6.2", - "symfony/cache": "^4.4", - "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", - "vimeo/psalm": "4.16.1" - }, - "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." - }, - "bin": [ - "bin/doctrine-dbal" - ], - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", - "homepage": "https://www.doctrine-project.org/projects/dbal.html", - "keywords": [ - "abstraction", - "database", - "db2", - "dbal", - "mariadb", - "mssql", - "mysql", - "oci8", - "oracle", - "pdo", - "pgsql", - "postgresql", - "queryobject", - "sasql", - "sql", - "sqlanywhere", - "sqlite", - "sqlserver", - "sqlsrv" - ], - "support": { - "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/2.13.7" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", - "type": "tidelift" - } - ], - "time": "2022-01-06T09:08:04+00:00" - }, - { - "name": "doctrine/deprecations", - "version": "v0.5.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "9504165960a1f83cc1480e2be1dd0a0478561314" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/9504165960a1f83cc1480e2be1dd0a0478561314", - "reference": "9504165960a1f83cc1480e2be1dd0a0478561314", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^7.1|^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0|^7.0|^8.0", - "phpunit/phpunit": "^7.0|^8.0|^9.0", - "psr/log": "^1.0" - }, - "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", - "homepage": "https://www.doctrine-project.org/", - "support": { - "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v0.5.3" - }, - "time": "2021-03-21T12:59:47+00:00" - }, - { - "name": "doctrine/event-manager", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/event-manager.git", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": "<2.9@dev" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", - "homepage": "https://www.doctrine-project.org/projects/event-manager.html", - "keywords": [ - "event", - "event dispatcher", - "event manager", - "event system", - "events" - ], - "support": { - "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/1.1.x" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", - "type": "tidelift" - } - ], - "time": "2020-05-29T18:28:51+00:00" - }, - { - "name": "doctrine/inflector", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", - "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^8.2", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "vimeo/psalm": "^4.10" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", - "homepage": "https://www.doctrine-project.org/projects/inflector.html", - "keywords": [ - "inflection", - "inflector", - "lowercase", - "manipulation", - "php", - "plural", - "singular", - "strings", - "uppercase", - "words" - ], - "support": { - "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.4" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", - "type": "tidelift" - } - ], - "time": "2021-10-22T20:16:43+00:00" - }, - { - "name": "doctrine/lexer", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11.8", - "phpunit/phpunit": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.1" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" - } - ], - "time": "2020-05-25T17:44:05+00:00" - }, - { - "name": "dragonmantank/cron-expression", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "65b2d8ee1f10915efb3b55597da3404f096acba2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/65b2d8ee1f10915efb3b55597da3404f096acba2", - "reference": "65b2d8ee1f10915efb3b55597da3404f096acba2", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^7.0|^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.4|^7.0|^8.0|^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "psr-4": { - "Cron\\": "src/Cron/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Chris Tankersley", - "email": "chris@ctankersley.com", - "homepage": "https://github.com/dragonmantank" - } - ], - "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", - "keywords": [ - "cron", - "schedule" - ], - "support": { - "issues": "https://github.com/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/v2.3.1" - }, - "funding": [ - { - "url": "https://github.com/dragonmantank", - "type": "github" - } - ], - "time": "2020-10-13T00:52:37+00:00" - }, - { - "name": "easywechat-composer/easywechat-composer", - "version": "1.4.1", - "source": { - "type": "git", - "url": "https://github.com/mingyoung/easywechat-composer.git", - "reference": "3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mingyoung/easywechat-composer/zipball/3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd", - "reference": "3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "composer-plugin-api": "^1.0 || ^2.0", - "php": ">=7.0" - }, - "require-dev": { - "composer/composer": "^1.0 || ^2.0", - "phpunit/phpunit": "^6.5 || ^7.0" - }, - "type": "composer-plugin", - "extra": { - "class": "EasyWeChatComposer\\Plugin" - }, - "autoload": { - "psr-4": { - "EasyWeChatComposer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "张铭阳", - "email": "mingyoungcheung@gmail.com" - } - ], - "description": "The composer plugin for EasyWeChat", - "support": { - "issues": "https://github.com/mingyoung/easywechat-composer/issues", - "source": "https://github.com/mingyoung/easywechat-composer/tree/1.4.1" - }, - "time": "2021-07-05T04:03:22+00:00" - }, - { - "name": "egulias/email-validator", - "version": "2.1.25", - "source": { - "type": "git", - "url": "https://github.com/egulias/EmailValidator.git", - "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4", - "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "doctrine/lexer": "^1.0.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.10" - }, - "require-dev": { - "dominicsayers/isemail": "^3.0.7", - "phpunit/phpunit": "^4.8.36|^7.5.15", - "satooshi/php-coveralls": "^1.0.1" - }, - "suggest": { - "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Egulias\\EmailValidator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eduardo Gulias Davis" - } - ], - "description": "A library for validating emails against several RFCs", - "homepage": "https://github.com/egulias/EmailValidator", - "keywords": [ - "email", - "emailvalidation", - "emailvalidator", - "validation", - "validator" - ], - "support": { - "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/2.1.25" - }, - "funding": [ - { - "url": "https://github.com/egulias", - "type": "github" - } - ], - "time": "2020-12-29T14:50:06+00:00" - }, - { - "name": "fideloper/proxy", - "version": "4.4.1", - "source": { - "type": "git", - "url": "https://github.com/fideloper/TrustedProxy.git", - "reference": "c073b2bd04d1c90e04dc1b787662b558dd65ade0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/c073b2bd04d1c90e04dc1b787662b558dd65ade0", - "reference": "c073b2bd04d1c90e04dc1b787662b558dd65ade0", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0|^9.0", - "php": ">=5.4.0" - }, - "require-dev": { - "illuminate/http": "^5.0|^6.0|^7.0|^8.0|^9.0", - "mockery/mockery": "^1.0", - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Fideloper\\Proxy\\TrustedProxyServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Fideloper\\Proxy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Fidao", - "email": "fideloper@gmail.com" - } - ], - "description": "Set trusted proxies for Laravel", - "keywords": [ - "load balancing", - "proxy", - "trusted proxy" - ], - "support": { - "issues": "https://github.com/fideloper/TrustedProxy/issues", - "source": "https://github.com/fideloper/TrustedProxy/tree/4.4.1" - }, - "time": "2020-10-22T13:48:01+00:00" - }, - { - "name": "firebase/php-jwt", - "version": "v5.5.1", - "source": { - "type": "git", - "url": "https://github.com/firebase/php-jwt.git", - "reference": "83b609028194aa042ea33b5af2d41a7427de80e6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/83b609028194aa042ea33b5af2d41a7427de80e6", - "reference": "83b609028194aa042ea33b5af2d41a7427de80e6", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": ">=4.8 <=9" - }, - "suggest": { - "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" - }, - "type": "library", - "autoload": { - "psr-4": { - "Firebase\\JWT\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Neuman Vong", - "email": "neuman+pear@twilio.com", - "role": "Developer" - }, - { - "name": "Anant Narayanan", - "email": "anant@php.net", - "role": "Developer" - } - ], - "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", - "homepage": "https://github.com/firebase/php-jwt", - "keywords": [ - "jwt", - "php" - ], - "support": { - "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v5.5.1" - }, - "time": "2021-11-08T20:18:51+00:00" - }, - { - "name": "guzzlehttp/guzzle", - "version": "6.5.5", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", - "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-json": "*", - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.6.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.17.0" - }, - "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "psr/log": "^1.1" - }, - "suggest": { - "psr/log": "Required for using the Log middleware" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.5-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "rest", - "web service" - ], - "support": { - "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/6.5" - }, - "time": "2020-06-16T21:01:06+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "1.5.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.5-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "support": { - "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.1" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", - "type": "tidelift" - } - ], - "time": "2021-10-22T20:56:57+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "1.8.3", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "1afdd860a2566ed3c2b0b4a3de6e23434a79ec85" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/1afdd860a2566ed3c2b0b4a3de6e23434a79ec85", - "reference": "1afdd860a2566ed3c2b0b4a3de6e23434a79ec85", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" - }, - "suggest": { - "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.7-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.8.3" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", - "type": "tidelift" - } - ], - "time": "2021-10-05T13:56:00+00:00" - }, - { - "name": "intervention/image", - "version": "2.7.0", - "source": { - "type": "git", - "url": "https://github.com/Intervention/image.git", - "reference": "9a8cc99d30415ec0b3f7649e1647d03a55698545" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Intervention/image/zipball/9a8cc99d30415ec0b3f7649e1647d03a55698545", - "reference": "9a8cc99d30415ec0b3f7649e1647d03a55698545", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-fileinfo": "*", - "guzzlehttp/psr7": "~1.1 || ^2.0", - "php": ">=5.4.0" - }, - "require-dev": { - "mockery/mockery": "~0.9.2", - "phpunit/phpunit": "^4.8 || ^5.7 || ^7.5.15" - }, - "suggest": { - "ext-gd": "to use GD library based image processing.", - "ext-imagick": "to use Imagick based image processing.", - "intervention/imagecache": "Caching extension for the Intervention Image library" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - }, - "laravel": { - "providers": [ - "Intervention\\Image\\ImageServiceProvider" - ], - "aliases": { - "Image": "Intervention\\Image\\Facades\\Image" - } - } - }, - "autoload": { - "psr-4": { - "Intervention\\Image\\": "src/Intervention/Image" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Oliver Vogel", - "email": "oliver@olivervogel.com", - "homepage": "http://olivervogel.com/" - } - ], - "description": "Image handling and manipulation library with support for Laravel integration", - "homepage": "http://image.intervention.io/", - "keywords": [ - "gd", - "image", - "imagick", - "laravel", - "thumbnail", - "watermark" - ], - "support": { - "issues": "https://github.com/Intervention/image/issues", - "source": "https://github.com/Intervention/image/tree/2.7.0" - }, - "funding": [ - { - "url": "https://www.paypal.me/interventionphp", - "type": "custom" - }, - { - "url": "https://github.com/Intervention", - "type": "github" - } - ], - "time": "2021-10-03T14:17:12+00:00" - }, - { - "name": "laminas/laminas-diactoros", - "version": "2.8.0", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-diactoros.git", - "reference": "0c26ef1d95b6d7e6e3943a243ba3dc0797227199" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/0c26ef1d95b6d7e6e3943a243ba3dc0797227199", - "reference": "0c26ef1d95b6d7e6e3943a243ba3dc0797227199", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^7.3 || ~8.0.0 || ~8.1.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0" - }, - "conflict": { - "phpspec/prophecy": "<1.9.0", - "zendframework/zend-diactoros": "*" - }, - "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "ext-curl": "*", - "ext-dom": "*", - "ext-gd": "*", - "ext-libxml": "*", - "http-interop/http-factory-tests": "^0.8.0", - "laminas/laminas-coding-standard": "~1.0.0", - "php-http/psr7-integration-tests": "^1.1", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.1", - "psalm/plugin-phpunit": "^0.14.0", - "vimeo/psalm": "^4.3" - }, - "type": "library", - "extra": { - "laminas": { - "config-provider": "Laminas\\Diactoros\\ConfigProvider", - "module": "Laminas\\Diactoros" - } - }, - "autoload": { - "files": [ - "src/functions/create_uploaded_file.php", - "src/functions/marshal_headers_from_sapi.php", - "src/functions/marshal_method_from_sapi.php", - "src/functions/marshal_protocol_version_from_sapi.php", - "src/functions/marshal_uri_from_sapi.php", - "src/functions/normalize_server.php", - "src/functions/normalize_uploaded_files.php", - "src/functions/parse_cookie_header.php", - "src/functions/create_uploaded_file.legacy.php", - "src/functions/marshal_headers_from_sapi.legacy.php", - "src/functions/marshal_method_from_sapi.legacy.php", - "src/functions/marshal_protocol_version_from_sapi.legacy.php", - "src/functions/marshal_uri_from_sapi.legacy.php", - "src/functions/normalize_server.legacy.php", - "src/functions/normalize_uploaded_files.legacy.php", - "src/functions/parse_cookie_header.legacy.php" - ], - "psr-4": { - "Laminas\\Diactoros\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "PSR HTTP Message implementations", - "homepage": "https://laminas.dev", - "keywords": [ - "http", - "laminas", - "psr", - "psr-17", - "psr-7" - ], - "support": { - "chat": "https://laminas.dev/chat", - "docs": "https://docs.laminas.dev/laminas-diactoros/", - "forum": "https://discourse.laminas.dev", - "issues": "https://github.com/laminas/laminas-diactoros/issues", - "rss": "https://github.com/laminas/laminas-diactoros/releases.atom", - "source": "https://github.com/laminas/laminas-diactoros" - }, - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2021-09-22T03:54:36+00:00" - }, - { - "name": "laravel/framework", - "version": "v6.20.42", - "source": { - "type": "git", - "url": "https://github.com/laravel/framework.git", - "reference": "251e09a2ecf41241b9892fe490eb301d5c9721b9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/251e09a2ecf41241b9892fe490eb301d5c9721b9", - "reference": "251e09a2ecf41241b9892fe490eb301d5c9721b9", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "doctrine/inflector": "^1.4|^2.0", - "dragonmantank/cron-expression": "^2.3.1", - "egulias/email-validator": "^2.1.10", - "ext-json": "*", - "ext-mbstring": "*", - "ext-openssl": "*", - "league/commonmark": "^1.3", - "league/flysystem": "^1.1", - "monolog/monolog": "^1.12|^2.0", - "nesbot/carbon": "^2.31", - "opis/closure": "^3.6", - "php": "^7.2.5|^8.0", - "psr/container": "^1.0", - "psr/simple-cache": "^1.0", - "ramsey/uuid": "^3.7", - "swiftmailer/swiftmailer": "^6.0", - "symfony/console": "^4.3.4", - "symfony/debug": "^4.3.4", - "symfony/finder": "^4.3.4", - "symfony/http-foundation": "^4.3.4", - "symfony/http-kernel": "^4.3.4", - "symfony/polyfill-php73": "^1.17", - "symfony/process": "^4.3.4", - "symfony/routing": "^4.3.4", - "symfony/var-dumper": "^4.3.4", - "tijsverkoyen/css-to-inline-styles": "^2.2.1", - "vlucas/phpdotenv": "^3.3" - }, - "conflict": { - "tightenco/collect": "<5.5.33" - }, - "replace": { - "illuminate/auth": "self.version", - "illuminate/broadcasting": "self.version", - "illuminate/bus": "self.version", - "illuminate/cache": "self.version", - "illuminate/config": "self.version", - "illuminate/console": "self.version", - "illuminate/container": "self.version", - "illuminate/contracts": "self.version", - "illuminate/cookie": "self.version", - "illuminate/database": "self.version", - "illuminate/encryption": "self.version", - "illuminate/events": "self.version", - "illuminate/filesystem": "self.version", - "illuminate/hashing": "self.version", - "illuminate/http": "self.version", - "illuminate/log": "self.version", - "illuminate/mail": "self.version", - "illuminate/notifications": "self.version", - "illuminate/pagination": "self.version", - "illuminate/pipeline": "self.version", - "illuminate/queue": "self.version", - "illuminate/redis": "self.version", - "illuminate/routing": "self.version", - "illuminate/session": "self.version", - "illuminate/support": "self.version", - "illuminate/translation": "self.version", - "illuminate/validation": "self.version", - "illuminate/view": "self.version" - }, - "require-dev": { - "aws/aws-sdk-php": "^3.155", - "doctrine/dbal": "^2.6", - "filp/whoops": "^2.8", - "guzzlehttp/guzzle": "^6.3.1|^7.0.1", - "league/flysystem-cached-adapter": "^1.0", - "mockery/mockery": "~1.3.3|^1.4.2", - "moontoast/math": "^1.1", - "orchestra/testbench-core": "^4.8", - "pda/pheanstalk": "^4.0", - "phpunit/phpunit": "^7.5.15|^8.4|^9.3.3", - "predis/predis": "^1.1.1", - "symfony/cache": "^4.3.4" - }, - "suggest": { - "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.155).", - "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).", - "ext-ftp": "Required to use the Flysystem FTP driver.", - "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", - "ext-memcached": "Required to use the memcache cache driver.", - "ext-pcntl": "Required to use all features of the queue worker.", - "ext-posix": "Required to use all features of the queue worker.", - "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", - "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", - "filp/whoops": "Required for friendly error pages in development (^2.8).", - "guzzlehttp/guzzle": "Required to use the Mailgun mail driver and the ping methods on schedules (^6.3.1|^7.0.1).", - "laravel/tinker": "Required to use the tinker console command (^2.0).", - "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", - "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", - "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", - "moontoast/math": "Required to use ordered UUIDs (^1.1).", - "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", - "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", - "predis/predis": "Required to use the predis connector (^1.1.2).", - "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", - "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0).", - "symfony/cache": "Required to PSR-6 cache bridge (^4.3.4).", - "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^1.2).", - "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.x-dev" - } - }, - "autoload": { - "files": [ - "src/Illuminate/Foundation/helpers.php", - "src/Illuminate/Support/helpers.php" - ], - "psr-4": { - "Illuminate\\": "src/Illuminate/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Laravel Framework.", - "homepage": "https://laravel.com", - "keywords": [ - "framework", - "laravel" - ], - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2021-12-07T14:56:23+00:00" - }, - { - "name": "laravel/passport", - "version": "v9.4.0", - "source": { - "type": "git", - "url": "https://github.com/laravel/passport.git", - "reference": "011bd500e8ae3d459b692467880a49ff1ecd60c0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/passport/zipball/011bd500e8ae3d459b692467880a49ff1ecd60c0", - "reference": "011bd500e8ae3d459b692467880a49ff1ecd60c0", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-json": "*", - "firebase/php-jwt": "^5.0", - "illuminate/auth": "^6.18.31|^7.22.4", - "illuminate/console": "^6.18.31|^7.22.4", - "illuminate/container": "^6.18.31|^7.22.4", - "illuminate/contracts": "^6.18.31|^7.22.4", - "illuminate/cookie": "^6.18.31|^7.22.4", - "illuminate/database": "^6.18.31|^7.22.4", - "illuminate/encryption": "^6.18.31|^7.22.4", - "illuminate/http": "^6.18.31|^7.22.4", - "illuminate/support": "^6.18.31|^7.22.4", - "laminas/laminas-diactoros": "^2.2", - "lcobucci/jwt": "^3.4|^4.0", - "league/oauth2-server": "^8.2.3", - "nyholm/psr7": "^1.0", - "php": "^7.2|^8.0", - "phpseclib/phpseclib": "^2.0", - "symfony/psr-http-message-bridge": "^2.0" - }, - "require-dev": { - "mockery/mockery": "^1.0", - "orchestra/testbench": "^4.4|^5.0", - "phpunit/phpunit": "^8.5|^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.x-dev" - }, - "laravel": { - "providers": [ - "Laravel\\Passport\\PassportServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Laravel\\Passport\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "Laravel Passport provides OAuth2 server support to Laravel.", - "keywords": [ - "laravel", - "oauth", - "passport" - ], - "support": { - "issues": "https://github.com/laravel/passport/issues", - "source": "https://github.com/laravel/passport" - }, - "time": "2020-12-04T09:37:12+00:00" - }, - { - "name": "laravel/socialite", - "version": "v5.2.6", - "source": { - "type": "git", - "url": "https://github.com/laravel/socialite.git", - "reference": "b5c67f187ddcf15529ff7217fa735b132620dfac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/b5c67f187ddcf15529ff7217fa735b132620dfac", - "reference": "b5c67f187ddcf15529ff7217fa735b132620dfac", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-json": "*", - "guzzlehttp/guzzle": "^6.0|^7.0", - "illuminate/http": "^6.0|^7.0|^8.0", - "illuminate/support": "^6.0|^7.0|^8.0", - "league/oauth1-client": "^1.0", - "php": "^7.2|^8.0" - }, - "require-dev": { - "illuminate/contracts": "^6.0|^7.0", - "mockery/mockery": "^1.0", - "orchestra/testbench": "^4.0|^5.0|^6.0", - "phpunit/phpunit": "^8.0|^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - }, - "laravel": { - "providers": [ - "Laravel\\Socialite\\SocialiteServiceProvider" - ], - "aliases": { - "Socialite": "Laravel\\Socialite\\Facades\\Socialite" - } - } - }, - "autoload": { - "psr-4": { - "Laravel\\Socialite\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "Laravel wrapper around OAuth 1 & OAuth 2 libraries.", - "homepage": "https://laravel.com", - "keywords": [ - "laravel", - "oauth" - ], - "support": { - "issues": "https://github.com/laravel/socialite/issues", - "source": "https://github.com/laravel/socialite" - }, - "time": "2021-12-07T16:32:57+00:00" - }, - { - "name": "laravel/tinker", - "version": "v2.6.3", - "source": { - "type": "git", - "url": "https://github.com/laravel/tinker.git", - "reference": "a9ddee4761ec8453c584e393b393caff189a3e42" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/a9ddee4761ec8453c584e393b393caff189a3e42", - "reference": "a9ddee4761ec8453c584e393b393caff189a3e42", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "illuminate/console": "^6.0|^7.0|^8.0", - "illuminate/contracts": "^6.0|^7.0|^8.0", - "illuminate/support": "^6.0|^7.0|^8.0", - "php": "^7.2.5|^8.0", - "psy/psysh": "^0.10.4", - "symfony/var-dumper": "^4.3.4|^5.0" - }, - "require-dev": { - "mockery/mockery": "~1.3.3|^1.4.2", - "phpunit/phpunit": "^8.5.8|^9.3.3" - }, - "suggest": { - "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - }, - "laravel": { - "providers": [ - "Laravel\\Tinker\\TinkerServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Laravel\\Tinker\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "Powerful REPL for the Laravel framework.", - "keywords": [ - "REPL", - "Tinker", - "laravel", - "psysh" - ], - "support": { - "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.6.3" - }, - "time": "2021-12-07T16:41:42+00:00" - }, - { - "name": "lcobucci/clock", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/lcobucci/clock.git", - "reference": "353d83fe2e6ae95745b16b3d911813df6a05bfb3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/lcobucci/clock/zipball/353d83fe2e6ae95745b16b3d911813df6a05bfb3", - "reference": "353d83fe2e6ae95745b16b3d911813df6a05bfb3", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "infection/infection": "^0.17", - "lcobucci/coding-standard": "^6.0", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-deprecation-rules": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/php-code-coverage": "9.1.4", - "phpunit/phpunit": "9.3.7" - }, - "type": "library", - "autoload": { - "psr-4": { - "Lcobucci\\Clock\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Luís Cobucci", - "email": "lcobucci@gmail.com" - } - ], - "description": "Yet another clock abstraction", - "support": { - "issues": "https://github.com/lcobucci/clock/issues", - "source": "https://github.com/lcobucci/clock/tree/2.0.x" - }, - "funding": [ - { - "url": "https://github.com/lcobucci", - "type": "github" - }, - { - "url": "https://www.patreon.com/lcobucci", - "type": "patreon" - } - ], - "time": "2020-08-27T18:56:02+00:00" - }, - { - "name": "lcobucci/jwt", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/lcobucci/jwt.git", - "reference": "55564265fddf810504110bd68ca311932324b0e9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/lcobucci/jwt/zipball/55564265fddf810504110bd68ca311932324b0e9", - "reference": "55564265fddf810504110bd68ca311932324b0e9", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-mbstring": "*", - "ext-openssl": "*", - "lcobucci/clock": "^2.0", - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "infection/infection": "^0.20", - "lcobucci/coding-standard": "^6.0", - "mikey179/vfsstream": "^1.6", - "phpbench/phpbench": "^0.17", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-deprecation-rules": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/php-invoker": "^3.1", - "phpunit/phpunit": "^9.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "psr-4": { - "Lcobucci\\JWT\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Luís Cobucci", - "email": "lcobucci@gmail.com", - "role": "Developer" - } - ], - "description": "A simple library to work with JSON Web Token and JSON Web Signature", - "keywords": [ - "JWS", - "jwt" - ], - "support": { - "issues": "https://github.com/lcobucci/jwt/issues", - "source": "https://github.com/lcobucci/jwt/tree/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/lcobucci", - "type": "github" - }, - { - "url": "https://www.patreon.com/lcobucci", - "type": "patreon" - } - ], - "time": "2021-09-28T19:18:28+00:00" - }, - { - "name": "league/commonmark", - "version": "1.6.6", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/commonmark.git", - "reference": "c4228d11e30d7493c6836d20872f9582d8ba6dcf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/c4228d11e30d7493c6836d20872f9582d8ba6dcf", - "reference": "c4228d11e30d7493c6836d20872f9582d8ba6dcf", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-mbstring": "*", - "php": "^7.1 || ^8.0" - }, - "conflict": { - "scrutinizer/ocular": "1.7.*" - }, - "require-dev": { - "cebe/markdown": "~1.0", - "commonmark/commonmark.js": "0.29.2", - "erusev/parsedown": "~1.0", - "ext-json": "*", - "github/gfm": "0.29.0", - "michelf/php-markdown": "~1.4", - "mikehaertl/php-shellcommand": "^1.4", - "phpstan/phpstan": "^0.12.90", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.2", - "scrutinizer/ocular": "^1.5", - "symfony/finder": "^4.2" - }, - "bin": [ - "bin/commonmark" - ], - "type": "library", - "autoload": { - "psr-4": { - "League\\CommonMark\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com", - "role": "Lead Developer" - } - ], - "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and Github-Flavored Markdown (GFM)", - "homepage": "https://commonmark.thephpleague.com", - "keywords": [ - "commonmark", - "flavored", - "gfm", - "github", - "github-flavored", - "markdown", - "md", - "parser" - ], - "support": { - "docs": "https://commonmark.thephpleague.com/", - "issues": "https://github.com/thephpleague/commonmark/issues", - "rss": "https://github.com/thephpleague/commonmark/releases.atom", - "source": "https://github.com/thephpleague/commonmark" - }, - "funding": [ - { - "url": "https://enjoy.gitstore.app/repositories/thephpleague/commonmark", - "type": "custom" - }, - { - "url": "https://www.colinodell.com/sponsor", - "type": "custom" - }, - { - "url": "https://www.paypal.me/colinpodell/10.00", - "type": "custom" - }, - { - "url": "https://github.com/colinodell", - "type": "github" - }, - { - "url": "https://www.patreon.com/colinodell", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/league/commonmark", - "type": "tidelift" - } - ], - "time": "2021-07-17T17:13:23+00:00" - }, - { - "name": "league/event", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/event.git", - "reference": "d2cc124cf9a3fab2bb4ff963307f60361ce4d119" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/event/zipball/d2cc124cf9a3fab2bb4ff963307f60361ce4d119", - "reference": "d2cc124cf9a3fab2bb4ff963307f60361ce4d119", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "henrikbjorn/phpspec-code-coverage": "~1.0.1", - "phpspec/phpspec": "^2.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Event\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frenky.net" - } - ], - "description": "Event package", - "keywords": [ - "emitter", - "event", - "listener" - ], - "support": { - "issues": "https://github.com/thephpleague/event/issues", - "source": "https://github.com/thephpleague/event/tree/master" - }, - "time": "2018-11-26T11:52:41+00:00" - }, - { - "name": "league/flysystem", - "version": "1.1.9", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem.git", - "reference": "094defdb4a7001845300334e7c1ee2335925ef99" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/094defdb4a7001845300334e7c1ee2335925ef99", - "reference": "094defdb4a7001845300334e7c1ee2335925ef99", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-fileinfo": "*", - "league/mime-type-detection": "^1.3", - "php": "^7.2.5 || ^8.0" - }, - "conflict": { - "league/flysystem-sftp": "<1.0.6" - }, - "require-dev": { - "phpspec/prophecy": "^1.11.1", - "phpunit/phpunit": "^8.5.8" - }, - "suggest": { - "ext-ftp": "Allows you to use FTP server storage", - "ext-openssl": "Allows you to use FTPS server storage", - "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", - "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", - "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", - "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", - "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", - "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", - "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", - "league/flysystem-webdav": "Allows you to use WebDAV storage", - "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", - "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", - "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Flysystem\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frenky.net" - } - ], - "description": "Filesystem abstraction: Many filesystems, one API.", - "keywords": [ - "Cloud Files", - "WebDAV", - "abstraction", - "aws", - "cloud", - "copy.com", - "dropbox", - "file systems", - "files", - "filesystem", - "filesystems", - "ftp", - "rackspace", - "remote", - "s3", - "sftp", - "storage" - ], - "support": { - "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/1.1.9" - }, - "funding": [ - { - "url": "https://offset.earth/frankdejonge", - "type": "other" - } - ], - "time": "2021-12-09T09:40:50+00:00" - }, - { - "name": "league/mime-type-detection", - "version": "1.9.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "aa70e813a6ad3d1558fc927863d47309b4c23e69" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/aa70e813a6ad3d1558fc927863d47309b4c23e69", - "reference": "aa70e813a6ad3d1558fc927863d47309b4c23e69", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-fileinfo": "*", - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.2", - "phpstan/phpstan": "^0.12.68", - "phpunit/phpunit": "^8.5.8 || ^9.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\MimeTypeDetection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "description": "Mime-type detection for Flysystem", - "support": { - "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.9.0" - }, - "funding": [ - { - "url": "https://github.com/frankdejonge", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/league/flysystem", - "type": "tidelift" - } - ], - "time": "2021-11-21T11:48:40+00:00" - }, - { - "name": "league/oauth1-client", - "version": "v1.10.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/oauth1-client.git", - "reference": "88dd16b0cff68eb9167bfc849707d2c40ad91ddc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/88dd16b0cff68eb9167bfc849707d2c40ad91ddc", - "reference": "88dd16b0cff68eb9167bfc849707d2c40ad91ddc", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-json": "*", - "ext-openssl": "*", - "guzzlehttp/guzzle": "^6.0|^7.0", - "guzzlehttp/psr7": "^1.7|^2.0", - "php": ">=7.1||>=8.0" - }, - "require-dev": { - "ext-simplexml": "*", - "friendsofphp/php-cs-fixer": "^2.17", - "mockery/mockery": "^1.3.3", - "phpstan/phpstan": "^0.12.42", - "phpunit/phpunit": "^7.5||9.5" - }, - "suggest": { - "ext-simplexml": "For decoding XML-based responses." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev", - "dev-develop": "2.0-dev" - } - }, - "autoload": { - "psr-4": { - "League\\OAuth1\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ben Corlett", - "email": "bencorlett@me.com", - "homepage": "http://www.webcomm.com.au", - "role": "Developer" - } - ], - "description": "OAuth 1.0 Client Library", - "keywords": [ - "Authentication", - "SSO", - "authorization", - "bitbucket", - "identity", - "idp", - "oauth", - "oauth1", - "single sign on", - "trello", - "tumblr", - "twitter" - ], - "support": { - "issues": "https://github.com/thephpleague/oauth1-client/issues", - "source": "https://github.com/thephpleague/oauth1-client/tree/v1.10.0" - }, - "time": "2021-08-15T23:05:49+00:00" - }, - { - "name": "league/oauth2-server", - "version": "8.3.3", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/oauth2-server.git", - "reference": "f5698a3893eda9a17bcd48636990281e7ca77b2a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth2-server/zipball/f5698a3893eda9a17bcd48636990281e7ca77b2a", - "reference": "f5698a3893eda9a17bcd48636990281e7ca77b2a", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "defuse/php-encryption": "^2.2.1", - "ext-json": "*", - "ext-openssl": "*", - "lcobucci/jwt": "^3.4.6 || ^4.0.4", - "league/event": "^2.2", - "php": "^7.2 || ^8.0", - "psr/http-message": "^1.0.1" - }, - "replace": { - "league/oauth2server": "*", - "lncd/oauth2": "*" - }, - "require-dev": { - "laminas/laminas-diactoros": "^2.4.1", - "phpstan/phpstan": "^0.12.57", - "phpstan/phpstan-phpunit": "^0.12.16", - "phpunit/phpunit": "^8.5.13", - "roave/security-advisories": "dev-master" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\OAuth2\\Server\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alex Bilbie", - "email": "hello@alexbilbie.com", - "homepage": "http://www.alexbilbie.com", - "role": "Developer" - }, - { - "name": "Andy Millington", - "email": "andrew@noexceptions.io", - "homepage": "https://www.noexceptions.io", - "role": "Developer" - } - ], - "description": "A lightweight and powerful OAuth 2.0 authorization and resource server library with support for all the core specification grants. This library will allow you to secure your API with OAuth and allow your applications users to approve apps that want to access their data from your API.", - "homepage": "https://oauth2.thephpleague.com/", - "keywords": [ - "Authentication", - "api", - "auth", - "authorisation", - "authorization", - "oauth", - "oauth 2", - "oauth 2.0", - "oauth2", - "protect", - "resource", - "secure", - "server" - ], - "support": { - "issues": "https://github.com/thephpleague/oauth2-server/issues", - "source": "https://github.com/thephpleague/oauth2-server/tree/8.3.3" - }, - "funding": [ - { - "url": "https://github.com/sephster", - "type": "github" - } - ], - "time": "2021-10-11T20:41:49+00:00" - }, - { - "name": "mews/captcha", - "version": "3.2.0", - "source": { - "type": "git", - "url": "https://github.com/mewebstudio/captcha.git", - "reference": "39569c990901820f3228853dd9471812b3227958" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mewebstudio/captcha/zipball/39569c990901820f3228853dd9471812b3227958", - "reference": "39569c990901820f3228853dd9471812b3227958", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-gd": "*", - "illuminate/config": "~5|^6|^7|^8", - "illuminate/filesystem": "~5|^6|^7|^8", - "illuminate/hashing": "~5|^6|^7|^8", - "illuminate/session": "~5|^6|^7|^8", - "illuminate/support": "~5|^6|^7|^8", - "intervention/image": "~2.5", - "php": "^7.2" - }, - "require-dev": { - "mockery/mockery": "^1.0", - "phpunit/phpunit": "^8.5" - }, - "type": "package", - "extra": { - "laravel": { - "providers": [ - "Mews\\Captcha\\CaptchaServiceProvider" - ], - "aliases": { - "Captcha": "Mews\\Captcha\\Facades\\Captcha" - } - } - }, - "autoload": { - "psr-4": { - "Mews\\Captcha\\": "src/" - }, - "files": [ - "src/helpers.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Muharrem ERİN", - "email": "me@mewebstudio.com", - "homepage": "https://github.com/mewebstudio", - "role": "Developer" - } - ], - "description": "Laravel 5 & 6 Captcha Package", - "homepage": "https://github.com/mewebstudio/captcha", - "keywords": [ - "captcha", - "laravel5 Security", - "laravel6 Captcha", - "laravel6 Security" - ], - "support": { - "issues": "https://github.com/mewebstudio/captcha/issues", - "source": "https://github.com/mewebstudio/captcha/tree/3.2.0" - }, - "time": "2020-09-10T22:33:58+00:00" - }, - { - "name": "monolog/monolog", - "version": "2.3.5", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "fd4380d6fc37626e2f799f29d91195040137eba9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd4380d6fc37626e2f799f29d91195040137eba9", - "reference": "fd4380d6fc37626e2f799f29d91195040137eba9", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.2", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" - }, - "provide": { - "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", - "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7", - "graylog2/gelf-php": "^1.4.2", - "mongodb/mongodb": "^1.8", - "php-amqplib/php-amqplib": "~2.4 || ^3", - "php-console/php-console": "^3.1.3", - "phpspec/prophecy": "^1.6.1", - "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5", - "predis/predis": "^1.1", - "rollbar/rollbar": "^1.3", - "ruflin/elastica": ">=0.90@dev", - "swiftmailer/swiftmailer": "^5.3|^6.0" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", - "ext-mbstring": "Allow to work properly with unicode symbols", - "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", - "ext-openssl": "Required to send log messages using SSL", - "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "php-console/php-console": "Allow sending log messages to Google Chrome", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Monolog\\": "src/Monolog" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "https://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ], - "support": { - "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.3.5" - }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", - "type": "tidelift" - } - ], - "time": "2021-10-01T21:08:31+00:00" - }, - { - "name": "nesbot/carbon", - "version": "2.55.2", - "source": { - "type": "git", - "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "8c2a18ce3e67c34efc1b29f64fe61304368259a2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/8c2a18ce3e67c34efc1b29f64fe61304368259a2", - "reference": "8c2a18ce3e67c34efc1b29f64fe61304368259a2", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-json": "*", - "php": "^7.1.8 || ^8.0", - "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" - }, - "require-dev": { - "doctrine/dbal": "^2.0 || ^3.0", - "doctrine/orm": "^2.7", - "friendsofphp/php-cs-fixer": "^3.0", - "kylekatarnls/multi-tester": "^2.0", - "phpmd/phpmd": "^2.9", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.54", - "phpunit/phpunit": "^7.5.20 || ^8.5.14", - "squizlabs/php_codesniffer": "^3.4" - }, - "bin": [ - "bin/carbon" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-3.x": "3.x-dev", - "dev-master": "2.x-dev" - }, - "laravel": { - "providers": [ - "Carbon\\Laravel\\ServiceProvider" - ] - }, - "phpstan": { - "includes": [ - "extension.neon" - ] - } - }, - "autoload": { - "psr-4": { - "Carbon\\": "src/Carbon/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Brian Nesbitt", - "email": "brian@nesbot.com", - "homepage": "https://markido.com" - }, - { - "name": "kylekatarnls", - "homepage": "https://github.com/kylekatarnls" - } - ], - "description": "An API extension for DateTime that supports 281 different languages.", - "homepage": "https://carbon.nesbot.com", - "keywords": [ - "date", - "datetime", - "time" - ], - "support": { - "docs": "https://carbon.nesbot.com/docs", - "issues": "https://github.com/briannesbitt/Carbon/issues", - "source": "https://github.com/briannesbitt/Carbon" - }, - "funding": [ - { - "url": "https://opencollective.com/Carbon", - "type": "open_collective" - }, - { - "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", - "type": "tidelift" - } - ], - "time": "2021-12-03T14:59:52+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v4.13.2", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "210577fe3cf7badcc5814d99455df46564f3c077" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", - "reference": "210577fe3cf7badcc5814d99455df46564f3c077", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-tokenizer": "*", - "php": ">=7.0" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.9-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2" - }, - "time": "2021-11-30T19:35:32+00:00" - }, - { - "name": "nyholm/psr7", - "version": "1.4.1", - "source": { - "type": "git", - "url": "https://github.com/Nyholm/psr7.git", - "reference": "2212385b47153ea71b1c1b1374f8cb5e4f7892ec" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Nyholm/psr7/zipball/2212385b47153ea71b1c1b1374f8cb5e4f7892ec", - "reference": "2212385b47153ea71b1c1b1374f8cb5e4f7892ec", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1", - "php-http/message-factory": "^1.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0" - }, - "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "http-interop/http-factory-tests": "^0.9", - "php-http/psr7-integration-tests": "^1.0", - "phpunit/phpunit": "^7.5 || 8.5 || 9.4", - "symfony/error-handler": "^4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "psr-4": { - "Nyholm\\Psr7\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com" - }, - { - "name": "Martijn van der Ven", - "email": "martijn@vanderven.se" - } - ], - "description": "A fast PHP7 implementation of PSR-7", - "homepage": "https://tnyholm.se", - "keywords": [ - "psr-17", - "psr-7" - ], - "support": { - "issues": "https://github.com/Nyholm/psr7/issues", - "source": "https://github.com/Nyholm/psr7/tree/1.4.1" - }, - "funding": [ - { - "url": "https://github.com/Zegnat", - "type": "github" - }, - { - "url": "https://github.com/nyholm", - "type": "github" - } - ], - "time": "2021-07-02T08:32:20+00:00" - }, - { - "name": "opis/closure", - "version": "3.6.2", - "source": { - "type": "git", - "url": "https://github.com/opis/closure.git", - "reference": "06e2ebd25f2869e54a306dda991f7db58066f7f6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/opis/closure/zipball/06e2ebd25f2869e54a306dda991f7db58066f7f6", - "reference": "06e2ebd25f2869e54a306dda991f7db58066f7f6", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^5.4 || ^7.0 || ^8.0" - }, - "require-dev": { - "jeremeamia/superclosure": "^2.0", - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.6.x-dev" - } - }, - "autoload": { - "psr-4": { - "Opis\\Closure\\": "src/" - }, - "files": [ - "functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marius Sarca", - "email": "marius.sarca@gmail.com" - }, - { - "name": "Sorin Sarca", - "email": "sarca_sorin@hotmail.com" - } - ], - "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", - "homepage": "https://opis.io/closure", - "keywords": [ - "anonymous functions", - "closure", - "function", - "serializable", - "serialization", - "serialize" - ], - "support": { - "issues": "https://github.com/opis/closure/issues", - "source": "https://github.com/opis/closure/tree/3.6.2" - }, - "time": "2021-04-09T13:42:10+00:00" - }, - { - "name": "overtrue/easy-sms", - "version": "1.3.2", - "source": { - "type": "git", - "url": "https://github.com/overtrue/easy-sms.git", - "reference": "daa0b4308ec0e3c112888c288d14d473be6aabee" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/overtrue/easy-sms/zipball/daa0b4308ec0e3c112888c288d14d473be6aabee", - "reference": "daa0b4308ec0e3c112888c288d14d473be6aabee", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-json": "*", - "guzzlehttp/guzzle": "^6.2 || ^7.0", - "php": ">=5.6" - }, - "require-dev": { - "mockery/mockery": "1.3.1", - "phpunit/phpunit": "^5.7 || ^7.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Overtrue\\EasySms\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "overtrue", - "email": "i@overtrue.me" - } - ], - "description": "The easiest way to send short message.", - "support": { - "issues": "https://github.com/overtrue/easy-sms/issues", - "source": "https://github.com/overtrue/easy-sms/tree/1.3.2" - }, - "time": "2021-01-22T06:52:59+00:00" - }, - { - "name": "overtrue/laravel-wechat", - "version": "5.1.0", - "source": { - "type": "git", - "url": "https://github.com/overtrue/laravel-wechat.git", - "reference": "1bc59aa52cf6bae2f4f388e9f20f7893305f2fe8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/overtrue/laravel-wechat/zipball/1bc59aa52cf6bae2f4f388e9f20f7893305f2fe8", - "reference": "1bc59aa52cf6bae2f4f388e9f20f7893305f2fe8", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "illuminate/container": "^5.1 || ^6.0 || ^7.0 || ^8.0", - "overtrue/wechat": "^4.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.16", - "laravel/framework": "^8.5" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Overtrue\\LaravelWeChat\\ServiceProvider" - ], - "aliases": { - "EasyWeChat": "Overtrue\\LaravelWeChat\\Facade" - } - } - }, - "autoload": { - "psr-4": { - "Overtrue\\LaravelWeChat\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "overtrue", - "email": "anzhengchao@gmail.com" - } - ], - "description": "微信 SDK for Laravel", - "keywords": [ - "laravel", - "sdk", - "wechat", - "weixin" - ], - "support": { - "issues": "https://github.com/overtrue/laravel-wechat/issues", - "source": "https://github.com/overtrue/laravel-wechat/tree/5.1.0" - }, - "time": "2020-09-27T08:32:30+00:00" - }, - { - "name": "overtrue/socialite", - "version": "2.0.24", - "source": { - "type": "git", - "url": "https://github.com/overtrue/socialite.git", - "reference": "ee7e7b000ec7d64f2b8aba1f6a2eec5cdf3f8bec" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/overtrue/socialite/zipball/ee7e7b000ec7d64f2b8aba1f6a2eec5cdf3f8bec", - "reference": "ee7e7b000ec7d64f2b8aba1f6a2eec5cdf3f8bec", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-json": "*", - "guzzlehttp/guzzle": "^5.0|^6.0|^7.0", - "php": ">=5.6", - "symfony/http-foundation": "^2.7|^3.0|^4.0|^5.0" - }, - "require-dev": { - "mockery/mockery": "~1.2", - "phpunit/phpunit": "^6.0|^7.0|^8.0|^9.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Overtrue\\Socialite\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "overtrue", - "email": "anzhengchao@gmail.com" - } - ], - "description": "A collection of OAuth 2 packages that extracts from laravel/socialite.", - "keywords": [ - "login", - "oauth", - "qq", - "social", - "wechat", - "weibo" - ], - "support": { - "issues": "https://github.com/overtrue/socialite/issues", - "source": "https://github.com/overtrue/socialite/tree/2.0.24" - }, - "funding": [ - { - "url": "https://www.patreon.com/overtrue", - "type": "patreon" - } - ], - "time": "2021-05-13T16:04:48+00:00" - }, - { - "name": "overtrue/wechat", - "version": "4.4.3", - "source": { - "type": "git", - "url": "https://github.com/w7corp/easywechat.git", - "reference": "4ec951ff1893ef5d4d798b1fe5fe5c85b77249e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/w7corp/easywechat/zipball/4ec951ff1893ef5d4d798b1fe5fe5c85b77249e5", - "reference": "4ec951ff1893ef5d4d798b1fe5fe5c85b77249e5", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "easywechat-composer/easywechat-composer": "^1.1", - "ext-fileinfo": "*", - "ext-openssl": "*", - "ext-simplexml": "*", - "guzzlehttp/guzzle": "^6.2 || ^7.0", - "monolog/monolog": "^1.22 || ^2.0", - "overtrue/socialite": "~2.0", - "php": ">=7.2", - "pimple/pimple": "^3.0", - "psr/simple-cache": "^1.0", - "symfony/cache": "^3.3 || ^4.3 || ^5.0", - "symfony/event-dispatcher": "^4.3 || ^5.0", - "symfony/http-foundation": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/psr-http-message-bridge": "^0.3 || ^1.0 || ^2.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.15", - "mikey179/vfsstream": "^1.6", - "mockery/mockery": "^1.2.3", - "phpstan/phpstan": "^0.12.0", - "phpunit/phpunit": "^7.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "EasyWeChat\\": "src/" - }, - "files": [ - "src/Kernel/Support/Helpers.php", - "src/Kernel/Helpers.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "overtrue", - "email": "anzhengchao@gmail.com" - } - ], - "description": "微信SDK", - "keywords": [ - "easywechat", - "sdk", - "wechat", - "weixin", - "weixin-sdk" - ], - "support": { - "issues": "https://github.com/w7corp/easywechat/issues", - "source": "https://github.com/w7corp/easywechat/tree/4.4.3" - }, - "funding": [ - { - "url": "https://www.easywechat.com/img/pay/wechat.jpg", - "type": "custom" - }, - { - "url": "https://github.com/overtrue", - "type": "github" - }, - { - "url": "https://www.patreon.com/overtrue", - "type": "patreon" - } - ], - "time": "2021-11-19T08:59:26+00:00" - }, - { - "name": "paragonie/random_compat", - "version": "v9.99.100", - "source": { - "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", - "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">= 7" - }, - "require-dev": { - "phpunit/phpunit": "4.*|5.*", - "vimeo/psalm": "^1" - }, - "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." - }, - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com" - } - ], - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", - "keywords": [ - "csprng", - "polyfill", - "pseudorandom", - "random" - ], - "support": { - "email": "info@paragonie.com", - "issues": "https://github.com/paragonie/random_compat/issues", - "source": "https://github.com/paragonie/random_compat" - }, - "time": "2020-10-15T08:29:30+00:00" - }, - { - "name": "php-http/message-factory", - "version": "v1.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-http/message-factory.git", - "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1", - "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.4", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "Factory interfaces for PSR-7 HTTP Message", - "homepage": "http://php-http.org", - "keywords": [ - "factory", - "http", - "message", - "stream", - "uri" - ], - "support": { - "issues": "https://github.com/php-http/message-factory/issues", - "source": "https://github.com/php-http/message-factory/tree/master" - }, - "time": "2015-12-19T14:08:53+00:00" - }, - { - "name": "php-pdfbox/php-pdfbox", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-pdfbox/php-pdfbox.git", - "reference": "2b2f1cd9927193f66de3c4093ef82790122c2229" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-pdfbox/php-pdfbox/zipball/2b2f1cd9927193f66de3c4093ef82790122c2229", - "reference": "2b2f1cd9927193f66de3c4093ef82790122c2229", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^7.1", - "psr/log": "^1.0", - "symfony/process": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "Pdfbox\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Stephan Wentz", - "email": "stephan@wentz.it", - "homepage": "http://www.wentz.it/" - } - ], - "description": "PHP-PDFBox", - "keywords": [ - "pdf", - "pdfbox" - ], - "support": { - "issues": "https://github.com/php-pdfbox/php-pdfbox/issues", - "source": "https://github.com/php-pdfbox/php-pdfbox/tree/master" - }, - "time": "2018-07-09T19:10:59+00:00" - }, - { - "name": "phpoption/phpoption", - "version": "1.8.1", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/php-option.git", - "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15", - "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^7.0 || ^8.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.8-dev" - } - }, - "autoload": { - "psr-4": { - "PhpOption\\": "src/PhpOption/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh" - }, - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - } - ], - "description": "Option Type for PHP", - "keywords": [ - "language", - "option", - "php", - "type" - ], - "support": { - "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.8.1" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", - "type": "tidelift" - } - ], - "time": "2021-12-04T23:24:31+00:00" - }, - { - "name": "phpseclib/phpseclib", - "version": "2.0.35", - "source": { - "type": "git", - "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "4e16cf3f5f927a7d3f5317820af795c0366c0420" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/4e16cf3f5f927a7d3f5317820af795c0366c0420", - "reference": "4e16cf3f5f927a7d3f5317820af795c0366c0420", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phing/phing": "~2.7", - "phpunit/phpunit": "^4.8.35|^5.7|^6.0|^9.4", - "squizlabs/php_codesniffer": "~2.0" - }, - "suggest": { - "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", - "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", - "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", - "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." - }, - "type": "library", - "autoload": { - "files": [ - "phpseclib/bootstrap.php" - ], - "psr-4": { - "phpseclib\\": "phpseclib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jim Wigginton", - "email": "terrafrost@php.net", - "role": "Lead Developer" - }, - { - "name": "Patrick Monnerat", - "email": "pm@datasphere.ch", - "role": "Developer" - }, - { - "name": "Andreas Fischer", - "email": "bantu@phpbb.com", - "role": "Developer" - }, - { - "name": "Hans-Jürgen Petrich", - "email": "petrich@tronic-media.com", - "role": "Developer" - }, - { - "name": "Graham Campbell", - "email": "graham@alt-three.com", - "role": "Developer" - } - ], - "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", - "homepage": "http://phpseclib.sourceforge.net", - "keywords": [ - "BigInteger", - "aes", - "asn.1", - "asn1", - "blowfish", - "crypto", - "cryptography", - "encryption", - "rsa", - "security", - "sftp", - "signature", - "signing", - "ssh", - "twofish", - "x.509", - "x509" - ], - "support": { - "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/2.0.35" - }, - "funding": [ - { - "url": "https://github.com/terrafrost", - "type": "github" - }, - { - "url": "https://www.patreon.com/phpseclib", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", - "type": "tidelift" - } - ], - "time": "2021-11-28T23:30:39+00:00" - }, - { - "name": "pimple/pimple", - "version": "v3.5.0", - "source": { - "type": "git", - "url": "https://github.com/silexphp/Pimple.git", - "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed", - "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.1 || ^2.0" - }, - "require-dev": { - "symfony/phpunit-bridge": "^5.4@dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4.x-dev" - } - }, - "autoload": { - "psr-0": { - "Pimple": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Pimple, a simple Dependency Injection Container", - "homepage": "https://pimple.symfony.com", - "keywords": [ - "container", - "dependency injection" - ], - "support": { - "source": "https://github.com/silexphp/Pimple/tree/v3.5.0" - }, - "time": "2021-10-28T11:13:42+00:00" - }, - { - "name": "predis/predis", - "version": "v1.1.9", - "source": { - "type": "git", - "url": "https://github.com/predis/predis.git", - "reference": "c50c3393bb9f47fa012d0cdfb727a266b0818259" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/predis/predis/zipball/c50c3393bb9f47fa012d0cdfb727a266b0818259", - "reference": "c50c3393bb9f47fa012d0cdfb727a266b0818259", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.3.9" - }, - "require-dev": { - "phpunit/phpunit": "~4.8" - }, - "suggest": { - "ext-curl": "Allows access to Webdis when paired with phpiredis", - "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol" - }, - "type": "library", - "autoload": { - "psr-4": { - "Predis\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniele Alessandri", - "email": "suppakilla@gmail.com", - "homepage": "http://clorophilla.net", - "role": "Creator & Maintainer" - }, - { - "name": "Till Krüss", - "homepage": "https://till.im", - "role": "Maintainer" - } - ], - "description": "Flexible and feature-complete Redis client for PHP and HHVM", - "homepage": "http://github.com/predis/predis", - "keywords": [ - "nosql", - "predis", - "redis" - ], - "support": { - "issues": "https://github.com/predis/predis/issues", - "source": "https://github.com/predis/predis/tree/v1.1.9" - }, - "funding": [ - { - "url": "https://github.com/sponsors/tillkruss", - "type": "github" - } - ], - "time": "2021-10-05T19:02:38+00:00" - }, - { - "name": "psr/cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/master" - }, - "time": "2016-08-06T20:24:11+00:00" - }, - { - "name": "psr/container", - "version": "1.1.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.4.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" - }, - "time": "2021-11-05T16:50:12+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.0.0", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" - }, - "time": "2019-04-30T12:38:16+00:00" - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/master" - }, - "time": "2016-08-06T14:39:51+00:00" - }, - { - "name": "psr/log", - "version": "1.1.4", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" - }, - "time": "2021-05-03T11:20:27+00:00" - }, - { - "name": "psr/simple-cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for simple caching", - "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" - ], - "support": { - "source": "https://github.com/php-fig/simple-cache/tree/master" - }, - "time": "2017-10-23T01:57:42+00:00" - }, - { - "name": "psy/psysh", - "version": "v0.10.12", - "source": { - "type": "git", - "url": "https://github.com/bobthecow/psysh.git", - "reference": "a0d9981aa07ecfcbea28e4bfa868031cca121e7d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/a0d9981aa07ecfcbea28e4bfa868031cca121e7d", - "reference": "a0d9981aa07ecfcbea28e4bfa868031cca121e7d", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-json": "*", - "ext-tokenizer": "*", - "nikic/php-parser": "~4.0|~3.0|~2.0|~1.3", - "php": "^8.0 || ^7.0 || ^5.5.9", - "symfony/console": "~5.0|~4.0|~3.0|^2.4.2|~2.3.10", - "symfony/var-dumper": "~5.0|~4.0|~3.0|~2.7" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.2", - "hoa/console": "3.17.*" - }, - "suggest": { - "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", - "ext-pdo-sqlite": "The doc command requires SQLite to work.", - "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", - "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.", - "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit." - }, - "bin": [ - "bin/psysh" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "0.10.x-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Psy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Justin Hileman", - "email": "justin@justinhileman.info", - "homepage": "http://justinhileman.com" - } - ], - "description": "An interactive shell for modern PHP.", - "homepage": "http://psysh.org", - "keywords": [ - "REPL", - "console", - "interactive", - "shell" - ], - "support": { - "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.10.12" - }, - "time": "2021-11-30T14:05:36+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" - }, - "time": "2019-03-08T08:55:37+00:00" - }, - { - "name": "ramsey/uuid", - "version": "3.9.6", - "source": { - "type": "git", - "url": "https://github.com/ramsey/uuid.git", - "reference": "ffa80ab953edd85d5b6c004f96181a538aad35a3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/ffa80ab953edd85d5b6c004f96181a538aad35a3", - "reference": "ffa80ab953edd85d5b6c004f96181a538aad35a3", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-json": "*", - "paragonie/random_compat": "^1 | ^2 | ^9.99.99", - "php": "^5.4 | ^7.0 | ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "replace": { - "rhumsaa/uuid": "self.version" - }, - "require-dev": { - "codeception/aspect-mock": "^1 | ^2", - "doctrine/annotations": "^1.2", - "goaop/framework": "1.0.0-alpha.2 | ^1 | >=2.1.0 <=2.3.2", - "mockery/mockery": "^0.9.11 | ^1", - "moontoast/math": "^1.1", - "nikic/php-parser": "<=4.5.0", - "paragonie/random-lib": "^2", - "php-mock/php-mock-phpunit": "^0.3 | ^1.1 | ^2.6", - "php-parallel-lint/php-parallel-lint": "^1.3", - "phpunit/phpunit": ">=4.8.36 <9.0.0 | >=9.3.0", - "squizlabs/php_codesniffer": "^3.5", - "yoast/phpunit-polyfills": "^1.0" - }, - "suggest": { - "ext-ctype": "Provides support for PHP Ctype functions", - "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator", - "ext-openssl": "Provides the OpenSSL extension for use with the OpenSslGenerator", - "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator", - "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).", - "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", - "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid", - "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Ramsey\\Uuid\\": "src/" - }, - "files": [ - "src/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ben Ramsey", - "email": "ben@benramsey.com", - "homepage": "https://benramsey.com" - }, - { - "name": "Marijn Huizendveld", - "email": "marijn.huizendveld@gmail.com" - }, - { - "name": "Thibaud Fabre", - "email": "thibaud@aztech.io" - } - ], - "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).", - "homepage": "https://github.com/ramsey/uuid", - "keywords": [ - "guid", - "identifier", - "uuid" - ], - "support": { - "issues": "https://github.com/ramsey/uuid/issues", - "rss": "https://github.com/ramsey/uuid/releases.atom", - "source": "https://github.com/ramsey/uuid", - "wiki": "https://github.com/ramsey/uuid/wiki" - }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", - "type": "tidelift" - } - ], - "time": "2021-09-25T23:07:42+00:00" - }, - { - "name": "rap2hpoutre/fast-excel", - "version": "v3.1.0", - "source": { - "type": "git", - "url": "https://github.com/rap2hpoutre/fast-excel.git", - "reference": "01e309600b2ead458ce0d4399c70746677b08cca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/rap2hpoutre/fast-excel/zipball/01e309600b2ead458ce0d4399c70746677b08cca", - "reference": "01e309600b2ead458ce0d4399c70746677b08cca", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "box/spout": "^3", - "illuminate/support": "5.3.* || 5.4.* || 5.5.* || 5.6.* || 5.7.* || 5.8.* || ^6.0 || ^7.0 || ^8.0", - "php": "^7.1|^8.0" - }, - "require-dev": { - "illuminate/database": "^6.20.12 || ^7.30.4 || ^8.24.0", - "phpunit/phpunit": "^9.5" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Rap2hpoutre\\FastExcel\\Providers\\FastExcelServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Rap2hpoutre\\FastExcel\\": "src/" - }, - "files": [ - "src/functions/fastexcel.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "rap2h", - "email": "raphaelht@gmail.com" - } - ], - "description": "Fast Excel import/export for Laravel", - "keywords": [ - "csv", - "excel", - "laravel", - "xls", - "xlsx" - ], - "support": { - "issues": "https://github.com/rap2hpoutre/fast-excel/issues", - "source": "https://github.com/rap2hpoutre/fast-excel/tree/v3.1.0" - }, - "time": "2021-10-13T20:12:19+00:00" - }, - { - "name": "sgh/pdfbox", - "version": "v1.0.0", - "source": { - "type": "git", - "url": "https://github.com/schmengler/PdfBox.git", - "reference": "4d277849df7e8084a65fa1afa53165e6469f7b5f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmengler/PdfBox/zipball/4d277849df7e8084a65fa1afa53165e6469f7b5f", - "reference": "4d277849df7e8084a65fa1afa53165e6469f7b5f", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit-dom-assertions": "1.0.*@dev" - }, - "type": "library", - "autoload": { - "psr-0": { - "SGH\\PdfBox": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD" - ], - "authors": [ - { - "name": "Fabian Schmengler", - "email": "fschmengler@sgh-it.eu" - } - ], - "description": "PHP5 wrapper for the Apache PdfBox ExtractText utility.", - "homepage": "https://github.com/schmengler/PdfBox", - "keywords": [ - "pdf", - "pdfbox" - ], - "support": { - "issues": "https://github.com/schmengler/PdfBox/issues", - "source": "https://github.com/schmengler/PdfBox/tree/master" - }, - "time": "2015-06-25T06:10:47+00:00" - }, - { - "name": "smalot/pdfparser", - "version": "v1.1.0", - "source": { - "type": "git", - "url": "https://github.com/smalot/pdfparser.git", - "reference": "43e436f32fd0e3d1f808c3b1768975c598c9a7df" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/smalot/pdfparser/zipball/43e436f32fd0e3d1f808c3b1768975c598c9a7df", - "reference": "43e436f32fd0e3d1f808c3b1768975c598c9a7df", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-zlib": "*", - "php": ">=7.1", - "symfony/polyfill-mbstring": "^1.18" - }, - "type": "library", - "autoload": { - "psr-0": { - "Smalot\\PdfParser\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0" - ], - "authors": [ - { - "name": "Sebastien MALOT", - "email": "sebastien@malot.fr" - } - ], - "description": "Pdf parser library. Can read and extract information from pdf file.", - "homepage": "https://www.pdfparser.org", - "keywords": [ - "extract", - "parse", - "parser", - "pdf", - "text" - ], - "support": { - "issues": "https://github.com/smalot/pdfparser/issues", - "source": "https://github.com/smalot/pdfparser/tree/v1.1.0" - }, - "time": "2021-08-03T08:33:34+00:00" - }, - { - "name": "swiftmailer/swiftmailer", - "version": "v6.3.0", - "source": { - "type": "git", - "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8a5d5072dca8f48460fce2f4131fcc495eec654c", - "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "egulias/email-validator": "^2.0|^3.1", - "php": ">=7.0.0", - "symfony/polyfill-iconv": "^1.0", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0" - }, - "require-dev": { - "mockery/mockery": "^1.0", - "symfony/phpunit-bridge": "^4.4|^5.4" - }, - "suggest": { - "ext-intl": "Needed to support internationalized email addresses" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.2-dev" - } - }, - "autoload": { - "files": [ - "lib/swift_required.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Corbyn" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Swiftmailer, free feature-rich PHP mailer", - "homepage": "https://swiftmailer.symfony.com", - "keywords": [ - "email", - "mail", - "mailer" - ], - "support": { - "issues": "https://github.com/swiftmailer/swiftmailer/issues", - "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.3.0" - }, - "funding": [ - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer", - "type": "tidelift" - } - ], - "abandoned": "symfony/mailer", - "time": "2021-10-18T15:26:12+00:00" - }, - { - "name": "symfony/cache", - "version": "v5.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache.git", - "reference": "d97d6d7f46cb69968f094e329abd987d5ee17c79" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/d97d6d7f46cb69968f094e329abd987d5ee17c79", - "reference": "d97d6d7f46cb69968f094e329abd987d5ee17c79", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.2.5", - "psr/cache": "^1.0|^2.0", - "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^1.1.7|^2", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/var-exporter": "^4.4|^5.0|^6.0" - }, - "conflict": { - "doctrine/dbal": "<2.13.1", - "symfony/dependency-injection": "<4.4", - "symfony/http-kernel": "<4.4", - "symfony/var-dumper": "<4.4" - }, - "provide": { - "psr/cache-implementation": "1.0|2.0", - "psr/simple-cache-implementation": "1.0|2.0", - "symfony/cache-implementation": "1.0|2.0" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/cache": "^1.6|^2.0", - "doctrine/dbal": "^2.13.1|^3.0", - "predis/predis": "^1.1", - "psr/simple-cache": "^1.0|^2.0", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/filesystem": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^4.4|^5.0|^6.0", - "symfony/messenger": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Cache\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an extended PSR-6, PSR-16 (and tags) implementation", - "homepage": "https://symfony.com", - "keywords": [ - "caching", - "psr6" - ], - "support": { - "source": "https://github.com/symfony/cache/tree/v5.4.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-11-23T18:51:45+00:00" - }, - { - "name": "symfony/cache-contracts", - "version": "v2.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache-contracts.git", - "reference": "ac2e168102a2e06a2624f0379bde94cd5854ced2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/ac2e168102a2e06a2624f0379bde94cd5854ced2", - "reference": "ac2e168102a2e06a2624f0379bde94cd5854ced2", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.2.5", - "psr/cache": "^1.0|^2.0|^3.0" - }, - "suggest": { - "symfony/cache-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Cache\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to caching", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v2.5.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-08-17T14:20:01+00:00" - }, - { - "name": "symfony/console", - "version": "v4.4.34", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "329b3a75cc6b16d435ba1b1a41df54a53382a3f0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/329b3a75cc6b16d435ba1b1a41df54a53382a3f0", - "reference": "329b3a75cc6b16d435ba1b1a41df54a53382a3f0", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2" - }, - "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3|>=5", - "symfony/lock": "<4.4", - "symfony/process": "<3.3" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" - }, - "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.3", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/var-dumper": "^4.3|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/console/tree/v4.4.34" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-11-04T12:23:33+00:00" - }, - { - "name": "symfony/css-selector", - "version": "v5.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/css-selector.git", - "reference": "44b933f98bb4b5220d10bed9ce5662f8c2d13dcc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/44b933f98bb4b5220d10bed9ce5662f8c2d13dcc", - "reference": "44b933f98bb4b5220d10bed9ce5662f8c2d13dcc", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\CssSelector\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Jean-François Simon", - "email": "jeanfrancois.simon@sensiolabs.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Converts CSS selectors to XPath expressions", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.4.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-09-09T08:06:01+00:00" - }, - { - "name": "symfony/debug", - "version": "v4.4.31", - "source": { - "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "43ede438d4cb52cd589ae5dc070e9323866ba8e0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/43ede438d4cb52cd589ae5dc070e9323866ba8e0", - "reference": "43ede438d4cb52cd589ae5dc070e9323866ba8e0", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1.3", - "psr/log": "^1|^2|^3" - }, - "conflict": { - "symfony/http-kernel": "<3.4" - }, - "require-dev": { - "symfony/http-kernel": "^3.4|^4.0|^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Debug\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools to ease debugging PHP code", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/debug/tree/v4.4.31" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-09-24T13:30:14+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8", - "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-07-12T14:48:14+00:00" - }, - { - "name": "symfony/error-handler", - "version": "v4.4.34", - "source": { - "type": "git", - "url": "https://github.com/symfony/error-handler.git", - "reference": "17785c374645def1e884d8ec49976c156c61db4d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/17785c374645def1e884d8ec49976c156c61db4d", - "reference": "17785c374645def1e884d8ec49976c156c61db4d", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1.3", - "psr/log": "^1|^2|^3", - "symfony/debug": "^4.4.5", - "symfony/var-dumper": "^4.4|^5.0" - }, - "require-dev": { - "symfony/http-kernel": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\ErrorHandler\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools to manage errors and ease debugging PHP code", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/error-handler/tree/v4.4.34" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-11-12T14:57:39+00:00" - }, - { - "name": "symfony/event-dispatcher", - "version": "v4.4.34", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "1a024b45369c9d55d76b6b8a241bd20c9ea1cbd8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1a024b45369c9d55d76b6b8a241bd20c9ea1cbd8", - "reference": "1a024b45369c9d55d76b6b8a241bd20c9ea1cbd8", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1.3", - "symfony/event-dispatcher-contracts": "^1.1", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "symfony/dependency-injection": "<3.4" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "1.1" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/error-handler": "~3.4|~4.4", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^3.4|^4.0|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/stopwatch": "^3.4|^4.0|^5.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.34" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-11-15T14:42:25+00:00" - }, - { - "name": "symfony/event-dispatcher-contracts", - "version": "v1.1.11", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "01e9a4efac0ee33a05dfdf93b346f62e7d0e998c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/01e9a4efac0ee33a05dfdf93b346f62e7d0e998c", - "reference": "01e9a4efac0ee33a05dfdf93b346f62e7d0e998c", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1.3" - }, - "suggest": { - "psr/event-dispatcher": "", - "symfony/event-dispatcher-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.1-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.11" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-03-23T15:25:38+00:00" - }, - { - "name": "symfony/finder", - "version": "v4.4.30", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "70362f1e112280d75b30087c7598b837c1b468b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/70362f1e112280d75b30087c7598b837c1b468b6", - "reference": "70362f1e112280d75b30087c7598b837c1b468b6", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/v4.4.30" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-08-04T20:31:23+00:00" - }, - { - "name": "symfony/http-client-contracts", - "version": "v2.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "ec82e57b5b714dbb69300d348bd840b345e24166" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ec82e57b5b714dbb69300d348bd840b345e24166", - "reference": "ec82e57b5b714dbb69300d348bd840b345e24166", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.2.5" - }, - "suggest": { - "symfony/http-client-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\HttpClient\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to HTTP clients", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v2.5.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-11-03T09:24:47+00:00" - }, - { - "name": "symfony/http-foundation", - "version": "v4.4.34", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "f4cbbb6fc428588ce8373802461e7fe84e6809ab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f4cbbb6fc428588ce8373802461e7fe84e6809ab", - "reference": "f4cbbb6fc428588ce8373802461e7fe84e6809ab", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1.3", - "symfony/mime": "^4.3|^5.0", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.16" - }, - "require-dev": { - "predis/predis": "~1.0", - "symfony/expression-language": "^3.4|^4.0|^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Defines an object-oriented layer for the HTTP specification", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/http-foundation/tree/v4.4.34" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-11-04T12:23:33+00:00" - }, - { - "name": "symfony/http-kernel", - "version": "v4.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "fb793f1381c34b79a43596a532a6a49bd729c9db" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/fb793f1381c34b79a43596a532a6a49bd729c9db", - "reference": "fb793f1381c34b79a43596a532a6a49bd729c9db", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1.3", - "psr/log": "^1|^2", - "symfony/error-handler": "^4.4", - "symfony/event-dispatcher": "^4.4", - "symfony/http-client-contracts": "^1.1|^2", - "symfony/http-foundation": "^4.4.30|^5.3.7", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "symfony/browser-kit": "<4.3", - "symfony/config": "<3.4", - "symfony/console": ">=5", - "symfony/dependency-injection": "<4.3", - "symfony/translation": "<4.2", - "twig/twig": "<1.43|<2.13,>=2" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" - }, - "require-dev": { - "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^4.3|^5.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/console": "^3.4|^4.0", - "symfony/css-selector": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^4.3|^5.0", - "symfony/dom-crawler": "^3.4|^4.0|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/routing": "^3.4|^4.0|^5.0", - "symfony/stopwatch": "^3.4|^4.0|^5.0", - "symfony/templating": "^3.4|^4.0|^5.0", - "symfony/translation": "^4.2|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^1.43|^2.13|^3.0.4" - }, - "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpKernel\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides a structured process for converting a Request into a Response", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/http-kernel/tree/v4.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-11-24T08:40:10+00:00" - }, - { - "name": "symfony/mime", - "version": "v5.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "d4365000217b67c01acff407573906ff91bcfb34" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/d4365000217b67c01acff407573906ff91bcfb34", - "reference": "d4365000217b67c01acff407573906ff91bcfb34", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "egulias/email-validator": "~3.0.0", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<4.4" - }, - "require-dev": { - "egulias/email-validator": "^2.1.10|^3.1", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/property-access": "^4.4|^5.1|^6.0", - "symfony/property-info": "^4.4|^5.1|^6.0", - "symfony/serializer": "^5.2|^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Mime\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Allows manipulating MIME messages", - "homepage": "https://symfony.com", - "keywords": [ - "mime", - "mime-type" - ], - "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-11-23T10:19:22+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-19T12:13:01+00:00" - }, - { - "name": "symfony/polyfill-iconv", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/63b5bb7db83e5673936d6e3b8b3e022ff6474933", - "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-iconv": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Iconv\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Iconv extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "iconv", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-27T09:27:20+00:00" - }, - { - "name": "symfony/polyfill-intl-idn", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", - "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Trevor Rowbotham", - "email": "trevor.rowbotham@pm.me" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-27T09:27:20+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-19T12:13:01+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.23.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-27T12:26:48+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-27T09:17:38+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-19T12:13:01+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.23.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-07-28T13:41:28+00:00" - }, - { - "name": "symfony/process", - "version": "v4.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "c2098705326addae6e6742151dfade47ac71da1b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/c2098705326addae6e6742151dfade47ac71da1b", - "reference": "c2098705326addae6e6742151dfade47ac71da1b", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v4.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-11-22T22:36:24+00:00" - }, - { - "name": "symfony/psr-http-message-bridge", - "version": "v2.1.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/psr-http-message-bridge.git", - "reference": "22b37c8a3f6b5d94e9cdbd88e1270d96e2f97b34" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/22b37c8a3f6b5d94e9cdbd88e1270d96e2f97b34", - "reference": "22b37c8a3f6b5d94e9cdbd88e1270d96e2f97b34", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1", - "psr/http-message": "^1.0", - "symfony/http-foundation": "^4.4 || ^5.0 || ^6.0" - }, - "require-dev": { - "nyholm/psr7": "^1.1", - "psr/log": "^1.1 || ^2 || ^3", - "symfony/browser-kit": "^4.4 || ^5.0 || ^6.0", - "symfony/config": "^4.4 || ^5.0 || ^6.0", - "symfony/event-dispatcher": "^4.4 || ^5.0 || ^6.0", - "symfony/framework-bundle": "^4.4 || ^5.0 || ^6.0", - "symfony/http-kernel": "^4.4 || ^5.0 || ^6.0", - "symfony/phpunit-bridge": "^5.4@dev || ^6.0" - }, - "suggest": { - "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" - }, - "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-main": "2.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bridge\\PsrHttpMessage\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "PSR HTTP message bridge", - "homepage": "http://symfony.com", - "keywords": [ - "http", - "http-message", - "psr-17", - "psr-7" - ], - "support": { - "issues": "https://github.com/symfony/psr-http-message-bridge/issues", - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.1.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-11-05T13:13:39+00:00" - }, - { - "name": "symfony/routing", - "version": "v4.4.34", - "source": { - "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "fc9dda0c8496f8ef0a89805c2eabfc43b8cef366" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/fc9dda0c8496f8ef0a89805c2eabfc43b8cef366", - "reference": "fc9dda0c8496f8ef0a89805c2eabfc43b8cef366", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "symfony/config": "<4.2", - "symfony/dependency-injection": "<3.4", - "symfony/yaml": "<3.4" - }, - "require-dev": { - "doctrine/annotations": "^1.10.4", - "psr/log": "^1|^2|^3", - "symfony/config": "^4.2|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^3.4|^4.0|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0" - }, - "suggest": { - "doctrine/annotations": "For using the annotation loader", - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/http-foundation": "For using a Symfony Request object", - "symfony/yaml": "For using the YAML loader" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Routing\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Maps an HTTP request to a set of configuration variables", - "homepage": "https://symfony.com", - "keywords": [ - "router", - "routing", - "uri", - "url" - ], - "support": { - "source": "https://github.com/symfony/routing/tree/v4.4.34" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-11-04T12:23:33+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v2.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", - "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-11-04T16:48:04+00:00" - }, - { - "name": "symfony/translation", - "version": "v4.4.34", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "26d330720627b234803595ecfc0191eeabc65190" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/26d330720627b234803595ecfc0191eeabc65190", - "reference": "26d330720627b234803595ecfc0191eeabc65190", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/translation-contracts": "^1.1.6|^2" - }, - "conflict": { - "symfony/config": "<3.4", - "symfony/dependency-injection": "<3.4", - "symfony/http-kernel": "<4.4", - "symfony/yaml": "<3.4" - }, - "provide": { - "symfony/translation-implementation": "1.0|2.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/console": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/finder": "~2.8|~3.0|~4.0|^5.0", - "symfony/http-kernel": "^4.4", - "symfony/intl": "^3.4|^4.0|^5.0", - "symfony/service-contracts": "^1.1.2|^2", - "symfony/yaml": "^3.4|^4.0|^5.0" - }, - "suggest": { - "psr/log-implementation": "To use logging capability in translator", - "symfony/config": "", - "symfony/yaml": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools to internationalize your application", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/translation/tree/v4.4.34" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-11-04T12:23:33+00:00" - }, - { - "name": "symfony/translation-contracts", - "version": "v2.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "d28150f0f44ce854e942b671fc2620a98aae1b1e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/d28150f0f44ce854e942b671fc2620a98aae1b1e", - "reference": "d28150f0f44ce854e942b671fc2620a98aae1b1e", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.2.5" - }, - "suggest": { - "symfony/translation-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Translation\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to translation", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v2.5.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-08-17T14:20:01+00:00" - }, - { - "name": "symfony/var-dumper", - "version": "v4.4.34", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "2d0c056b2faaa3d785bdbd5adecc593a5be9c16e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2d0c056b2faaa3d785bdbd5adecc593a5be9c16e", - "reference": "2d0c056b2faaa3d785bdbd5adecc593a5be9c16e", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php72": "~1.5", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", - "symfony/console": "<3.4" - }, - "require-dev": { - "ext-iconv": "*", - "symfony/console": "^3.4|^4.0|^5.0", - "symfony/process": "^4.4|^5.0", - "twig/twig": "^1.43|^2.13|^3.0.4" - }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" - }, - "bin": [ - "Resources/bin/var-dump-server" - ], - "type": "library", - "autoload": { - "files": [ - "Resources/functions/dump.php" - ], - "psr-4": { - "Symfony\\Component\\VarDumper\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides mechanisms for walking through any arbitrary PHP variable", - "homepage": "https://symfony.com", - "keywords": [ - "debug", - "dump" - ], - "support": { - "source": "https://github.com/symfony/var-dumper/tree/v4.4.34" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-11-12T10:50:54+00:00" - }, - { - "name": "symfony/var-exporter", - "version": "v5.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "d59446d6166b1643a8a3c30c2fa8e16e51cdbde7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/d59446d6166b1643a8a3c30c2fa8e16e51cdbde7", - "reference": "d59446d6166b1643a8a3c30c2fa8e16e51cdbde7", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" - }, - "require-dev": { - "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\VarExporter\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Allows exporting any serializable PHP data structure to plain PHP code", - "homepage": "https://symfony.com", - "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "serialize" - ], - "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.4.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-11-22T10:44:13+00:00" - }, - { - "name": "tijsverkoyen/css-to-inline-styles", - "version": "2.2.4", - "source": { - "type": "git", - "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "da444caae6aca7a19c0c140f68c6182e337d5b1c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/da444caae6aca7a19c0c140f68c6182e337d5b1c", - "reference": "da444caae6aca7a19c0c140f68c6182e337d5b1c", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "php": "^5.5 || ^7.0 || ^8.0", - "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "TijsVerkoyen\\CssToInlineStyles\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Tijs Verkoyen", - "email": "css_to_inline_styles@verkoyen.eu", - "role": "Developer" - } - ], - "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", - "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", - "support": { - "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", - "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.4" - }, - "time": "2021-12-08T09:12:39+00:00" - }, - { - "name": "vlucas/phpdotenv", - "version": "v3.6.9", - "source": { - "type": "git", - "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "a1bf4c9853d90ade427b4efe35355fc41b3d6988" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a1bf4c9853d90ade427b4efe35355fc41b3d6988", - "reference": "a1bf4c9853d90ade427b4efe35355fc41b3d6988", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^5.4 || ^7.0 || ^8.0", - "phpoption/phpoption": "^1.5.2", - "symfony/polyfill-ctype": "^1.17" - }, - "require-dev": { - "ext-filter": "*", - "ext-pcre": "*", - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.21" - }, - "suggest": { - "ext-filter": "Required to use the boolean validator.", - "ext-pcre": "Required to use most of the library." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.6-dev" - } - }, - "autoload": { - "psr-4": { - "Dotenv\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk" - }, - { - "name": "Vance Lucas", - "email": "vance@vancelucas.com" - } - ], - "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", - "keywords": [ - "dotenv", - "env", - "environment" - ], - "support": { - "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v3.6.9" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", - "type": "tidelift" - } - ], - "time": "2021-10-02T19:07:56+00:00" - } - ], - "packages-dev": [ - { - "name": "barryvdh/laravel-ide-helper", - "version": "v2.8.0", - "source": { - "type": "git", - "url": "https://github.com/barryvdh/laravel-ide-helper.git", - "reference": "ba95d18ef55c91295250ae8b7bfa73d8fb866b9b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/ba95d18ef55c91295250ae8b7bfa73d8fb866b9b", - "reference": "ba95d18ef55c91295250ae8b7bfa73d8fb866b9b", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "barryvdh/reflection-docblock": "^2.0.6", - "composer/composer": "^1.6 || ^2.0@dev", - "doctrine/dbal": "~2.3", - "illuminate/console": "^5.5 || ^6 || ^7", - "illuminate/filesystem": "^5.5 || ^6 || ^7", - "illuminate/support": "^5.5 || ^6 || ^7", - "php": ">=7.2", - "phpdocumentor/type-resolver": "^1.1.0" - }, - "require-dev": { - "illuminate/config": "^5.5 || ^6 || ^7", - "illuminate/view": "^5.5 || ^6 || ^7", - "mockery/mockery": "^1.3", - "orchestra/testbench": "^3.5 || ^4 || ^5", - "phpro/grumphp": "^0.19.0", - "spatie/phpunit-snapshot-assertions": "^1.4 || ^2.2 || ^3", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^3.12" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - }, - "laravel": { - "providers": [ - "Barryvdh\\LaravelIdeHelper\\IdeHelperServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Barryvdh\\LaravelIdeHelper\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" - } - ], - "description": "Laravel IDE Helper, generates correct PHPDocs for all Facade classes, to improve auto-completion.", - "keywords": [ - "autocomplete", - "codeintel", - "helper", - "ide", - "laravel", - "netbeans", - "phpdoc", - "phpstorm", - "sublime" - ], - "support": { - "issues": "https://github.com/barryvdh/laravel-ide-helper/issues", - "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v2.8.0" - }, - "funding": [ - { - "url": "https://github.com/barryvdh", - "type": "github" - } - ], - "time": "2020-08-10T08:22:48+00:00" - }, - { - "name": "barryvdh/reflection-docblock", - "version": "v2.0.6", - "source": { - "type": "git", - "url": "https://github.com/barryvdh/ReflectionDocBlock.git", - "reference": "6b69015d83d3daf9004a71a89f26e27d27ef6a16" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/6b69015d83d3daf9004a71a89f26e27d27ef6a16", - "reference": "6b69015d83d3daf9004a71a89f26e27d27ef6a16", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.0,<4.5" - }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "Barryvdh": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" - } - ], - "support": { - "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.0.6" - }, - "time": "2018-12-13T10:34:14+00:00" - }, - { - "name": "composer/ca-bundle", - "version": "1.3.1", - "source": { - "type": "git", - "url": "https://github.com/composer/ca-bundle.git", - "reference": "4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b", - "reference": "4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-openssl": "*", - "ext-pcre": "*", - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.55", - "psr/log": "^1.0", - "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\CaBundle\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", - "keywords": [ - "cabundle", - "cacert", - "certificate", - "ssl", - "tls" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.1" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-10-28T20:44:15+00:00" - }, - { - "name": "composer/composer", - "version": "2.2.11", - "source": { - "type": "git", - "url": "https://github.com/composer/composer.git", - "reference": "2f5bcf0480c13b4fa1ac490aa9344e4402507538" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/2f5bcf0480c13b4fa1ac490aa9344e4402507538", - "reference": "2f5bcf0480c13b4fa1ac490aa9344e4402507538", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "composer/ca-bundle": "^1.0", - "composer/metadata-minifier": "^1.0", - "composer/pcre": "^1.0", - "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.2", - "composer/xdebug-handler": "^2.0 || ^3.0", - "justinrainbow/json-schema": "^5.2.11", - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0 || ^2.0", - "react/promise": "^1.2 || ^2.7", - "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.0", - "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", - "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" - }, - "require-dev": { - "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" - }, - "suggest": { - "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", - "ext-zip": "Enabling the zip extension allows you to unzip archives", - "ext-zlib": "Allow gzip compression of HTTP requests" - }, - "bin": [ - "bin/composer" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.2-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\": "src/Composer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "https://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", - "homepage": "https://getcomposer.org/", - "keywords": [ - "autoload", - "dependency", - "package" - ], - "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.2.11" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-04-01T20:00:52+00:00" - }, - { - "name": "composer/metadata-minifier", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/composer/metadata-minifier.git", - "reference": "c549d23829536f0d0e984aaabbf02af91f443207" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/metadata-minifier/zipball/c549d23829536f0d0e984aaabbf02af91f443207", - "reference": "c549d23829536f0d0e984aaabbf02af91f443207", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "composer/composer": "^2", - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\MetadataMinifier\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Small utility library that handles metadata minification and expansion.", - "keywords": [ - "composer", - "compression" - ], - "support": { - "issues": "https://github.com/composer/metadata-minifier/issues", - "source": "https://github.com/composer/metadata-minifier/tree/1.0.0" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-04-07T13:37:33+00:00" - }, - { - "name": "composer/pcre", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/67a32d7d6f9f560b726ab25a061b38ff3a80c560", - "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", - "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" - ], - "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/1.0.1" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-01-21T20:24:37+00:00" - }, - { - "name": "composer/semver", - "version": "3.3.1", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "5d8e574bb0e69188786b8ef77d43341222a41a71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/5d8e574bb0e69188786b8ef77d43341222a41a71", - "reference": "5d8e574bb0e69188786b8ef77d43341222a41a71", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.1" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-03-16T11:22:07+00:00" - }, - { - "name": "composer/spdx-licenses", - "version": "1.5.6", - "source": { - "type": "git", - "url": "https://github.com/composer/spdx-licenses.git", - "reference": "a30d487169d799745ca7280bc90fdfa693536901" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/a30d487169d799745ca7280bc90fdfa693536901", - "reference": "a30d487169d799745ca7280bc90fdfa693536901", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Spdx\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "SPDX licenses list and validation library.", - "keywords": [ - "license", - "spdx", - "validator" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.6" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-11-18T10:14:14+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "ced299686f41dce890debac69273b47ffe98a40c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", - "reference": "ced299686f41dce890debac69273b47ffe98a40c", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "composer/pcre": "^1 || ^2 || ^3", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1 || ^2 || ^3" - }, - "require-dev": { - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-02-25T21:32:43+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^8.0", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2020-11-10T18:47:58+00:00" - }, - { - "name": "facade/flare-client-php", - "version": "1.9.1", - "source": { - "type": "git", - "url": "https://github.com/facade/flare-client-php.git", - "reference": "b2adf1512755637d0cef4f7d1b54301325ac78ed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facade/flare-client-php/zipball/b2adf1512755637d0cef4f7d1b54301325ac78ed", - "reference": "b2adf1512755637d0cef4f7d1b54301325ac78ed", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "facade/ignition-contracts": "~1.0", - "illuminate/pipeline": "^5.5|^6.0|^7.0|^8.0", - "php": "^7.1|^8.0", - "symfony/http-foundation": "^3.3|^4.1|^5.0", - "symfony/mime": "^3.4|^4.0|^5.1", - "symfony/var-dumper": "^3.4|^4.0|^5.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.14", - "phpunit/phpunit": "^7.5.16", - "spatie/phpunit-snapshot-assertions": "^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "Facade\\FlareClient\\": "src" - }, - "files": [ - "src/helpers.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Send PHP errors to Flare", - "homepage": "https://github.com/facade/flare-client-php", - "keywords": [ - "exception", - "facade", - "flare", - "reporting" - ], - "support": { - "issues": "https://github.com/facade/flare-client-php/issues", - "source": "https://github.com/facade/flare-client-php/tree/1.9.1" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2021-09-13T12:16:46+00:00" - }, - { - "name": "facade/ignition", - "version": "1.18.0", - "source": { - "type": "git", - "url": "https://github.com/facade/ignition.git", - "reference": "fca0cbe5f900f94773d821b481c16d4ea3503491" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facade/ignition/zipball/fca0cbe5f900f94773d821b481c16d4ea3503491", - "reference": "fca0cbe5f900f94773d821b481c16d4ea3503491", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-json": "*", - "ext-mbstring": "*", - "facade/flare-client-php": "^1.3", - "facade/ignition-contracts": "^1.0", - "filp/whoops": "^2.4", - "illuminate/support": "~5.5.0 || ~5.6.0 || ~5.7.0 || ~5.8.0 || ^6.0", - "monolog/monolog": "^1.12 || ^2.0", - "php": "^7.1|^8.0", - "scrivo/highlight.php": "^9.15", - "symfony/console": "^3.4 || ^4.0", - "symfony/var-dumper": "^3.4 || ^4.0" - }, - "require-dev": { - "mockery/mockery": "~1.3.3|^1.4.2", - "orchestra/testbench": "^3.5 || ^3.6 || ^3.7 || ^3.8 || ^4.0" - }, - "suggest": { - "laravel/telescope": "^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - }, - "laravel": { - "providers": [ - "Facade\\Ignition\\IgnitionServiceProvider" - ], - "aliases": { - "Flare": "Facade\\Ignition\\Facades\\Flare" - } - } - }, - "autoload": { - "psr-4": { - "Facade\\Ignition\\": "src" - }, - "files": [ - "src/helpers.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A beautiful error page for Laravel applications.", - "homepage": "https://github.com/facade/ignition", - "keywords": [ - "error", - "flare", - "laravel", - "page" - ], - "support": { - "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", - "forum": "https://twitter.com/flareappio", - "issues": "https://github.com/facade/ignition/issues", - "source": "https://github.com/facade/ignition" - }, - "time": "2021-08-02T07:45:03+00:00" - }, - { - "name": "facade/ignition-contracts", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/facade/ignition-contracts.git", - "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267", - "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^7.3|^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^v2.15.8", - "phpunit/phpunit": "^9.3.11", - "vimeo/psalm": "^3.17.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Facade\\IgnitionContracts\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://flareapp.io", - "role": "Developer" - } - ], - "description": "Solution contracts for Ignition", - "homepage": "https://github.com/facade/ignition-contracts", - "keywords": [ - "contracts", - "flare", - "ignition" - ], - "support": { - "issues": "https://github.com/facade/ignition-contracts/issues", - "source": "https://github.com/facade/ignition-contracts/tree/1.0.2" - }, - "time": "2020-10-16T08:27:54+00:00" - }, - { - "name": "fakerphp/faker", - "version": "v1.17.0", - "source": { - "type": "git", - "url": "https://github.com/FakerPHP/Faker.git", - "reference": "b85e9d44eae8c52cca7aa0939483611f7232b669" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/b85e9d44eae8c52cca7aa0939483611f7232b669", - "reference": "b85e9d44eae8c52cca7aa0939483611f7232b669", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^7.1 || ^8.0", - "psr/container": "^1.0 || ^2.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" - }, - "conflict": { - "fzaninotto/faker": "*" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "ext-intl": "*", - "symfony/phpunit-bridge": "^4.4 || ^5.2" - }, - "suggest": { - "ext-curl": "Required by Faker\\Provider\\Image to download images.", - "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", - "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", - "ext-mbstring": "Required for multibyte Unicode string functionality." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "v1.17-dev" - } - }, - "autoload": { - "psr-4": { - "Faker\\": "src/Faker/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "François Zaninotto" - } - ], - "description": "Faker is a PHP library that generates fake data for you.", - "keywords": [ - "data", - "faker", - "fixtures" - ], - "support": { - "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/v1.17.0" - }, - "time": "2021-12-05T17:14:47+00:00" - }, - { - "name": "filp/whoops", - "version": "2.14.4", - "source": { - "type": "git", - "url": "https://github.com/filp/whoops.git", - "reference": "f056f1fe935d9ed86e698905a957334029899895" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/f056f1fe935d9ed86e698905a957334029899895", - "reference": "f056f1fe935d9ed86e698905a957334029899895", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^5.5.9 || ^7.0 || ^8.0", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" - }, - "require-dev": { - "mockery/mockery": "^0.9 || ^1.0", - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", - "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" - }, - "suggest": { - "symfony/var-dumper": "Pretty print complex values better with var-dumper available", - "whoops/soap": "Formats errors as SOAP responses" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Whoops\\": "src/Whoops/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Filipe Dobreira", - "homepage": "https://github.com/filp", - "role": "Developer" - } - ], - "description": "php error handling for cool kids", - "homepage": "https://filp.github.io/whoops/", - "keywords": [ - "error", - "exception", - "handling", - "library", - "throwable", - "whoops" - ], - "support": { - "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.14.4" - }, - "funding": [ - { - "url": "https://github.com/denis-sokolov", - "type": "github" - } - ], - "time": "2021-10-03T12:00:00+00:00" - }, - { - "name": "hamcrest/hamcrest-php", - "version": "v2.0.1", - "source": { - "type": "git", - "url": "https://github.com/hamcrest/hamcrest-php.git", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^5.3|^7.0|^8.0" - }, - "replace": { - "cordoval/hamcrest-php": "*", - "davedevelopment/hamcrest-php": "*", - "kodova/hamcrest-php": "*" - }, - "require-dev": { - "phpunit/php-file-iterator": "^1.4 || ^2.0", - "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, - "autoload": { - "classmap": [ - "hamcrest" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "This is the PHP port of Hamcrest Matchers", - "keywords": [ - "test" - ], - "support": { - "issues": "https://github.com/hamcrest/hamcrest-php/issues", - "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" - }, - "time": "2020-07-09T08:09:16+00:00" - }, - { - "name": "justinrainbow/json-schema", - "version": "5.2.11", - "source": { - "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" - }, - "bin": [ - "bin/validate-json" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "JsonSchema\\": "src/JsonSchema/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" - } - ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", - "keywords": [ - "json", - "schema" - ], - "support": { - "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11" - }, - "time": "2021-07-22T09:24:00+00:00" - }, - { - "name": "mockery/mockery", - "version": "1.4.4", - "source": { - "type": "git", - "url": "https://github.com/mockery/mockery.git", - "reference": "e01123a0e847d52d186c5eb4b9bf58b0c6d00346" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/e01123a0e847d52d186c5eb4b9bf58b0c6d00346", - "reference": "e01123a0e847d52d186c5eb4b9bf58b0c6d00346", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "hamcrest/hamcrest-php": "^2.0.1", - "lib-pcre": ">=7.0", - "php": "^7.3 || ^8.0" - }, - "conflict": { - "phpunit/phpunit": "<8.0" - }, - "require-dev": { - "phpunit/phpunit": "^8.5 || ^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "psr-0": { - "Mockery": "library/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Pádraic Brady", - "email": "padraic.brady@gmail.com", - "homepage": "http://blog.astrumfutura.com" - }, - { - "name": "Dave Marshall", - "email": "dave.marshall@atstsolutions.co.uk", - "homepage": "http://davedevelopment.co.uk" - } - ], - "description": "Mockery is a simple yet flexible PHP mock object framework", - "homepage": "https://github.com/mockery/mockery", - "keywords": [ - "BDD", - "TDD", - "library", - "mock", - "mock objects", - "mockery", - "stub", - "test", - "test double", - "testing" - ], - "support": { - "issues": "https://github.com/mockery/mockery/issues", - "source": "https://github.com/mockery/mockery/tree/1.4.4" - }, - "time": "2021-09-13T15:28:59+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.10.2", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "replace": { - "myclabs/deep-copy": "self.version" - }, - "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2020-11-13T09:40:50+00:00" - }, - { - "name": "nunomaduro/collision", - "version": "v3.2.0", - "source": { - "type": "git", - "url": "https://github.com/nunomaduro/collision.git", - "reference": "f7c45764dfe4ba5f2618d265a6f1f9c72732e01d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/f7c45764dfe4ba5f2618d265a6f1f9c72732e01d", - "reference": "f7c45764dfe4ba5f2618d265a6f1f9c72732e01d", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "filp/whoops": "^2.1.4", - "php": "^7.2.5 || ^8.0", - "php-parallel-lint/php-console-highlighter": "0.5.*", - "symfony/console": "~2.8|~3.3|~4.0" - }, - "require-dev": { - "laravel/framework": "^6.0", - "phpunit/phpunit": "^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "NunoMaduro\\Collision\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "Cli error handling for console/command-line PHP applications.", - "keywords": [ - "artisan", - "cli", - "command-line", - "console", - "error", - "handling", - "laravel", - "laravel-zero", - "php", - "symfony" - ], - "support": { - "issues": "https://github.com/nunomaduro/collision/issues", - "source": "https://github.com/nunomaduro/collision" - }, - "funding": [ - { - "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - }, - { - "url": "https://www.patreon.com/nunomaduro", - "type": "patreon" - } - ], - "time": "2021-02-11T09:01:42+00:00" - }, - { - "name": "phar-io/manifest", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" - }, - "time": "2021-07-20T11:28:43+00:00" - }, - { - "name": "phar-io/version", - "version": "3.1.0", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "bae7c545bef187884426f042434e561ab1ddb182" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", - "reference": "bae7c545bef187884426f042434e561ab1ddb182", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.1.0" - }, - "time": "2021-02-23T14:00:09+00:00" - }, - { - "name": "php-parallel-lint/php-console-color", - "version": "v0.3", - "source": { - "type": "git", - "url": "https://github.com/php-parallel-lint/PHP-Console-Color.git", - "reference": "b6af326b2088f1ad3b264696c9fd590ec395b49e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-parallel-lint/PHP-Console-Color/zipball/b6af326b2088f1ad3b264696c9fd590ec395b49e", - "reference": "b6af326b2088f1ad3b264696c9fd590ec395b49e", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.4.0" - }, - "replace": { - "jakub-onderka/php-console-color": "*" - }, - "require-dev": { - "php-parallel-lint/php-code-style": "1.0", - "php-parallel-lint/php-parallel-lint": "1.0", - "php-parallel-lint/php-var-dump-check": "0.*", - "phpunit/phpunit": "~4.3", - "squizlabs/php_codesniffer": "1.*" - }, - "type": "library", - "autoload": { - "psr-4": { - "JakubOnderka\\PhpConsoleColor\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Jakub Onderka", - "email": "jakub.onderka@gmail.com" - } - ], - "support": { - "issues": "https://github.com/php-parallel-lint/PHP-Console-Color/issues", - "source": "https://github.com/php-parallel-lint/PHP-Console-Color/tree/master" - }, - "time": "2020-05-14T05:47:14+00:00" - }, - { - "name": "php-parallel-lint/php-console-highlighter", - "version": "v0.5", - "source": { - "type": "git", - "url": "https://github.com/php-parallel-lint/PHP-Console-Highlighter.git", - "reference": "21bf002f077b177f056d8cb455c5ed573adfdbb8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-parallel-lint/PHP-Console-Highlighter/zipball/21bf002f077b177f056d8cb455c5ed573adfdbb8", - "reference": "21bf002f077b177f056d8cb455c5ed573adfdbb8", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-tokenizer": "*", - "php": ">=5.4.0", - "php-parallel-lint/php-console-color": "~0.2" - }, - "replace": { - "jakub-onderka/php-console-highlighter": "*" - }, - "require-dev": { - "php-parallel-lint/php-code-style": "~1.0", - "php-parallel-lint/php-parallel-lint": "~1.0", - "php-parallel-lint/php-var-dump-check": "~0.1", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~1.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "JakubOnderka\\PhpConsoleHighlighter\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jakub Onderka", - "email": "acci@acci.cz", - "homepage": "http://www.acci.cz/" - } - ], - "description": "Highlight PHP code in terminal", - "support": { - "issues": "https://github.com/php-parallel-lint/PHP-Console-Highlighter/issues", - "source": "https://github.com/php-parallel-lint/PHP-Console-Highlighter/tree/master" - }, - "time": "2020-05-13T07:37:49+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" - }, - "time": "2021-10-19T17:43:47+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.5.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae", - "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.1" - }, - "time": "2021-10-02T14:08:47+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "v1.15.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.2", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0 || ^7.0", - "phpunit/phpunit": "^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" - }, - "time": "2021-12-08T12:19:24+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "9.2.10", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "d5850aaf931743067f4bfc1ae4cbd06468400687" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/d5850aaf931743067f4bfc1ae4cbd06468400687", - "reference": "d5850aaf931743067f4bfc1ae4cbd06468400687", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.13.0", - "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", - "theseer/tokenizer": "^1.2.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.10" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-12-05T09:12:13+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "3.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-12-02T12:48:52+00:00" - }, - { - "name": "phpunit/php-invoker", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-pcntl": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:58:55+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T05:33:50+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "5.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:16:10+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "9.5.10", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c814a05837f2edb0d1471d6e3f4ab3501ca3899a", - "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "doctrine/instantiator": "^1.3.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", - "php": ">=7.3", - "phpspec/prophecy": "^1.12.1", - "phpunit/php-code-coverage": "^9.2.7", - "phpunit/php-file-iterator": "^3.0.5", - "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.5", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.3", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^2.3.4", - "sebastian/version": "^3.0.2" - }, - "require-dev": { - "ext-pdo": "*", - "phpspec/prophecy-phpunit": "^2.0.1" - }, - "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.5-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ], - "files": [ - "src/Framework/Assert/Functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.10" - }, - "funding": [ - { - "url": "https://phpunit.de/donate.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-09-25T07:38:51+00:00" - }, - { - "name": "react/promise", - "version": "v2.9.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "React\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", - "keywords": [ - "promise", - "promises" - ], - "support": { - "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.9.0" - }, - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2022-02-11T10:27:51+00:00" - }, - { - "name": "scrivo/highlight.php", - "version": "v9.18.1.8", - "source": { - "type": "git", - "url": "https://github.com/scrivo/highlight.php.git", - "reference": "6d5049cd2578e19a06adbb6ac77879089be1e3f9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/6d5049cd2578e19a06adbb6ac77879089be1e3f9", - "reference": "6d5049cd2578e19a06adbb6ac77879089be1e3f9", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-json": "*", - "php": ">=5.4" - }, - "require-dev": { - "phpunit/phpunit": "^4.8|^5.7", - "sabberworm/php-css-parser": "^8.3", - "symfony/finder": "^2.8|^3.4", - "symfony/var-dumper": "^2.8|^3.4" - }, - "suggest": { - "ext-mbstring": "Allows highlighting code with unicode characters and supports language with unicode keywords" - }, - "type": "library", - "autoload": { - "psr-0": { - "Highlight\\": "", - "HighlightUtilities\\": "" - }, - "files": [ - "HighlightUtilities/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Geert Bergman", - "homepage": "http://www.scrivo.org/", - "role": "Project Author" - }, - { - "name": "Vladimir Jimenez", - "homepage": "https://allejo.io", - "role": "Maintainer" - }, - { - "name": "Martin Folkers", - "homepage": "https://twobrain.io", - "role": "Contributor" - } - ], - "description": "Server side syntax highlighter that supports 185 languages. It's a PHP port of highlight.js", - "keywords": [ - "code", - "highlight", - "highlight.js", - "highlight.php", - "syntax" - ], - "support": { - "issues": "https://github.com/scrivo/highlight.php/issues", - "source": "https://github.com/scrivo/highlight.php" - }, - "funding": [ - { - "url": "https://github.com/allejo", - "type": "github" - } - ], - "time": "2021-10-24T00:28:14+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", - "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:08:49+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "1.0.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:08:54+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:30:19+00:00" - }, - { - "name": "sebastian/comparator", - "version": "4.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T15:49:45+00:00" - }, - { - "name": "sebastian/complexity", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "nikic/php-parser": "^4.7", - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", - "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T15:52:27+00:00" - }, - { - "name": "sebastian/diff", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "symfony/process": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:10:38+00:00" - }, - { - "name": "sebastian/environment", - "version": "5.1.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:52:38+00:00" - }, - { - "name": "sebastian/exporter", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-11-11T14:18:36+00:00" - }, - { - "name": "sebastian/global-state", - "version": "5.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/23bd5951f7ff26f12d4e3242864df3e08dec4e49", - "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-06-11T13:31:12+00:00" - }, - { - "name": "sebastian/lines-of-code", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "nikic/php-parser": "^4.6", - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", - "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-28T06:42:11+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:12:34+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:14:26+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:17:30+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:45:17+00:00" - }, - { - "name": "sebastian/type", - "version": "2.3.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914", - "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/2.3.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-06-15T12:49:02+00:00" - }, - { - "name": "sebastian/version", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:39:44+00:00" - }, - { - "name": "seld/jsonlint", - "version": "1.9.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "4211420d25eba80712bff236a98960ef68b866b7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", - "reference": "4211420d25eba80712bff236a98960ef68b866b7", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^5.3 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.5", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" - }, - "bin": [ - "bin/jsonlint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Seld\\JsonLint\\": "src/Seld/JsonLint/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "JSON Linter", - "keywords": [ - "json", - "linter", - "parser", - "validator" - ], - "support": { - "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" - }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", - "type": "tidelift" - } - ], - "time": "2022-04-01T13:37:23+00:00" - }, - { - "name": "seld/phar-utils", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "9f3452c93ff423469c0d56450431562ca423dcee" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/9f3452c93ff423469c0d56450431562ca423dcee", - "reference": "9f3452c93ff423469c0d56450431562ca423dcee", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\PharUtils\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "PHAR file format utilities, for when PHP phars you up", - "keywords": [ - "phar" - ], - "support": { - "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.2.0" - }, - "time": "2021-12-10T11:20:11+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v5.4.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "3a4442138d80c9f7b600fb297534ac718b61d37f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/3a4442138d80c9f7b600fb297534ac718b61d37f", - "reference": "3a4442138d80c9f7b600fb297534ac718b61d37f", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.7" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-04-01T12:33:59+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2021-07-28T10:34:58+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.10.0" - }, - "time": "2021-03-09T10:59:23+00:00" - } - ], - "aliases": [], - "minimum-stability": "dev", - "stability-flags": [], - "prefer-stable": true, - "prefer-lowest": false, - "platform": { - "php": "^7.2.5|^8.0" - }, - "platform-dev": [], - "plugin-api-version": "2.1.0" -} diff --git a/api/config/app.php b/api/config/app.php deleted file mode 100644 index 76cc67eb..00000000 --- a/api/config/app.php +++ /dev/null @@ -1,231 +0,0 @@ - env('APP_NAME', 'Laravel'), - - /* - |-------------------------------------------------------------------------- - | Application Environment - |-------------------------------------------------------------------------- - | - | This value determines the "environment" your application is currently - | running in. This may determine how you prefer to configure various - | services the application utilizes. Set this in your ".env" file. - | - */ - - 'env' => env('APP_ENV', 'production'), - - /* - |-------------------------------------------------------------------------- - | Application Debug Mode - |-------------------------------------------------------------------------- - | - | When your application is in debug mode, detailed error messages with - | stack traces will be shown on every error that occurs within your - | application. If disabled, a simple generic error page is shown. - | - */ - - 'debug' => (bool) env('APP_DEBUG', false), - - /* - |-------------------------------------------------------------------------- - | Application URL - |-------------------------------------------------------------------------- - | - | This URL is used by the console to properly generate URLs when using - | the Artisan command line tool. You should set this to the root of - | your application so that it is used when running Artisan tasks. - | - */ - - 'url' => env('APP_URL', 'http://localhost'), - - 'asset_url' => env('ASSET_URL', null), - - /* - |-------------------------------------------------------------------------- - | Application Timezone - |-------------------------------------------------------------------------- - | - | Here you may specify the default timezone for your application, which - | will be used by the PHP date and date-time functions. We have gone - | ahead and set this to a sensible default for you out of the box. - | - */ - - 'timezone' => 'PRC', - - /* - |-------------------------------------------------------------------------- - | Application Locale Configuration - |-------------------------------------------------------------------------- - | - | The application locale determines the default locale that will be used - | by the translation service provider. You are free to set this value - | to any of the locales which will be supported by the application. - | - */ - - 'locale' => 'zh-CN', - - /* - |-------------------------------------------------------------------------- - | Application Fallback Locale - |-------------------------------------------------------------------------- - | - | The fallback locale determines the locale to use when the current one - | is not available. You may change the value to correspond to any of - | the language folders that are provided through your application. - | - */ - - 'fallback_locale' => 'en', - - /* - |-------------------------------------------------------------------------- - | Faker Locale - |-------------------------------------------------------------------------- - | - | This locale will be used by the Faker PHP library when generating fake - | data for your database seeds. For example, this will be used to get - | localized telephone numbers, street address information and more. - | - */ - - 'faker_locale' => 'zh_CN', - - /* - |-------------------------------------------------------------------------- - | Encryption Key - |-------------------------------------------------------------------------- - | - | This key is used by the Illuminate encrypter service and should be set - | to a random, 32 character string, otherwise these encrypted strings - | will not be safe. Please do this before deploying an application! - | - */ - - 'key' => env('APP_KEY'), - - 'cipher' => 'AES-256-CBC', - - /* - |-------------------------------------------------------------------------- - | Autoloaded Service Providers - |-------------------------------------------------------------------------- - | - | The service providers listed here will be automatically loaded on the - | request to your application. Feel free to add your own services to - | this array to grant expanded functionality to your applications. - | - */ - - 'providers' => [ - - /* - * Laravel Framework Service Providers... - */ - Illuminate\Auth\AuthServiceProvider::class, - Illuminate\Broadcasting\BroadcastServiceProvider::class, - Illuminate\Bus\BusServiceProvider::class, - Illuminate\Cache\CacheServiceProvider::class, - Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, - Illuminate\Cookie\CookieServiceProvider::class, - Illuminate\Database\DatabaseServiceProvider::class, - Illuminate\Encryption\EncryptionServiceProvider::class, - Illuminate\Filesystem\FilesystemServiceProvider::class, - Illuminate\Foundation\Providers\FoundationServiceProvider::class, - Illuminate\Hashing\HashServiceProvider::class, - Illuminate\Mail\MailServiceProvider::class, - Illuminate\Notifications\NotificationServiceProvider::class, - Illuminate\Pagination\PaginationServiceProvider::class, - Illuminate\Pipeline\PipelineServiceProvider::class, - Illuminate\Queue\QueueServiceProvider::class, - Illuminate\Redis\RedisServiceProvider::class, - Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, - Illuminate\Session\SessionServiceProvider::class, - Illuminate\Translation\TranslationServiceProvider::class, - Illuminate\Validation\ValidationServiceProvider::class, - Illuminate\View\ViewServiceProvider::class, - Illuminate\Broadcasting\BroadcastServiceProvider::class, - /* - * Package Service Providers... - */ - - /* - * Application Service Providers... - */ - App\Providers\AppServiceProvider::class, - App\Providers\AuthServiceProvider::class, - App\Providers\BroadcastServiceProvider::class, - App\Providers\EventServiceProvider::class, - App\Providers\RouteServiceProvider::class, - - ], - - /* - |-------------------------------------------------------------------------- - | Class Aliases - |-------------------------------------------------------------------------- - | - | This array of class aliases will be registered when this application - | is started. However, feel free to register as many as you wish as - | the aliases are "lazy" loaded so they don't hinder performance. - | - */ - - 'aliases' => [ - - 'App' => Illuminate\Support\Facades\App::class, - 'Arr' => Illuminate\Support\Arr::class, - 'Artisan' => Illuminate\Support\Facades\Artisan::class, - 'Auth' => Illuminate\Support\Facades\Auth::class, - 'Blade' => Illuminate\Support\Facades\Blade::class, - 'Broadcast' => Illuminate\Support\Facades\Broadcast::class, - 'Bus' => Illuminate\Support\Facades\Bus::class, - 'Cache' => Illuminate\Support\Facades\Cache::class, - 'Config' => Illuminate\Support\Facades\Config::class, - 'Cookie' => Illuminate\Support\Facades\Cookie::class, - 'Crypt' => Illuminate\Support\Facades\Crypt::class, - 'DB' => Illuminate\Support\Facades\DB::class, - 'Eloquent' => Illuminate\Database\Eloquent\Model::class, - 'Event' => Illuminate\Support\Facades\Event::class, - 'File' => Illuminate\Support\Facades\File::class, - 'Gate' => Illuminate\Support\Facades\Gate::class, - 'Hash' => Illuminate\Support\Facades\Hash::class, - 'Lang' => Illuminate\Support\Facades\Lang::class, - 'Log' => Illuminate\Support\Facades\Log::class, - 'Mail' => Illuminate\Support\Facades\Mail::class, - 'Notification' => Illuminate\Support\Facades\Notification::class, - 'Password' => Illuminate\Support\Facades\Password::class, - 'Queue' => Illuminate\Support\Facades\Queue::class, - 'Redirect' => Illuminate\Support\Facades\Redirect::class, - 'Redis' => Illuminate\Support\Facades\Redis::class, - 'Request' => Illuminate\Support\Facades\Request::class, - 'Response' => Illuminate\Support\Facades\Response::class, - 'Route' => Illuminate\Support\Facades\Route::class, - 'Schema' => Illuminate\Support\Facades\Schema::class, - 'Session' => Illuminate\Support\Facades\Session::class, - 'Storage' => Illuminate\Support\Facades\Storage::class, - 'Str' => Illuminate\Support\Str::class, - 'URL' => Illuminate\Support\Facades\URL::class, - 'Validator' => Illuminate\Support\Facades\Validator::class, - 'View' => Illuminate\Support\Facades\View::class, - - ], - -]; diff --git a/api/config/auth.php b/api/config/auth.php deleted file mode 100644 index 520bbee1..00000000 --- a/api/config/auth.php +++ /dev/null @@ -1,126 +0,0 @@ - [ - 'guard' => 'api', - 'passwords' => 'users', - ], - - /* - |-------------------------------------------------------------------------- - | Authentication Guards - |-------------------------------------------------------------------------- - | - | Next, you may define every authentication guard for your application. - | Of course, a great default configuration has been defined for you - | here which uses session storage and the Eloquent user provider. - | - | All authentication drivers have a user provider. This defines how the - | users are actually retrieved out of your database or other storage - | mechanisms used by this application to persist your user's data. - | - | Supported: "session", "token" - | - */ - - 'guards' => [ - 'web' => [ - 'driver' => 'session', - 'provider' => 'users', - ], - - 'api' => [ - 'driver' => 'passport', - 'provider' => 'admins', - 'hash' => false, - ], - 'admin' => [ - 'driver' => 'passport', - 'provider' => 'admins', - 'hash' => false, - ], - ], - - /* - |-------------------------------------------------------------------------- - | User Providers - |-------------------------------------------------------------------------- - | - | All authentication drivers have a user provider. This defines how the - | users are actually retrieved out of your database or other storage - | mechanisms used by this application to persist your user's data. - | - | If you have multiple user tables or models you may configure multiple - | sources which represent each model / table. These sources may then - | be assigned to any extra authentication guards you have defined. - | - | Supported: "database", "eloquent" - | - */ - - 'providers' => [ - 'users' => [ - 'driver' => 'eloquent', - 'model' => App\Models\User::class, - ], - 'admins' => [ - 'driver' => 'eloquent', - 'model' => App\Models\Admin::class, - ], - - // 'users' => [ - // 'driver' => 'database', - // 'table' => 'users', - // ], - ], - - /* - |-------------------------------------------------------------------------- - | Resetting Passwords - |-------------------------------------------------------------------------- - | - | You may specify multiple password reset configurations if you have more - | than one user table or model in the application and you want to have - | separate password reset settings based on the specific user types. - | - | The expire time is the number of minutes that the reset token should be - | considered valid. This security feature keeps tokens short-lived so - | they have less time to be guessed. You may change this as needed. - | - */ - - 'passwords' => [ - 'users' => [ - 'provider' => 'users', - 'table' => 'password_resets', - 'expire' => 60, - 'throttle' => 60, - ], - ], - - /* - |-------------------------------------------------------------------------- - | Password Confirmation Timeout - |-------------------------------------------------------------------------- - | - | Here you may define the amount of seconds before a password confirmation - | times out and the user is prompted to re-enter their password via the - | confirmation screen. By default, the timeout lasts for three hours. - | - */ - - 'password_timeout' => 10800, - -]; diff --git a/api/config/database.php b/api/config/database.php deleted file mode 100644 index 654ac872..00000000 --- a/api/config/database.php +++ /dev/null @@ -1,166 +0,0 @@ - env('DB_CONNECTION', 'mysql'), - - /* - |-------------------------------------------------------------------------- - | Database Connections - |-------------------------------------------------------------------------- - | - | Here are each of the database connections setup for your application. - | Of course, examples of configuring each database platform that is - | supported by Laravel is shown below to make development simple. - | - | - | All database work in Laravel is done through the PHP PDO facilities - | so make sure you have the driver for your particular database of - | choice installed on your machine before you begin development. - | - */ - - 'connections' => [ - - 'sqlite' => [ - 'driver' => 'sqlite', - 'url' => env('DATABASE_URL'), - 'database' => env('DB_DATABASE', database_path('database.sqlite')), - 'prefix' => '', - 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), - ], - - 'mysql' => [ - 'driver' => 'mysql', - 'url' => env('DATABASE_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '3306'), - 'database' => env('DB_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), - 'password' => env('DB_PASSWORD', ''), - 'unix_socket' => env('DB_SOCKET', ''), - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', - 'prefix' => '', - 'prefix_indexes' => true, - 'strict' => true, - 'engine' => null, - 'options' => extension_loaded('pdo_mysql') ? array_filter([ - PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), - ]) : [], - ], - 'super' => [ - 'driver' => 'mysql', - 'url' => env('DATABASE_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '3306'), - 'database' => 'INFORMATION_SCHEMA', - 'username' => 'root', - 'password' => 'abc@123456', - 'unix_socket' => env('DB_SOCKET', ''), - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', - 'prefix' => '', - 'prefix_indexes' => true, - 'strict' => true, - 'engine' => null, - 'options' => extension_loaded('pdo_mysql') ? array_filter([ - PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), - ]) : [], - ], - - 'pgsql' => [ - 'driver' => 'pgsql', - 'url' => env('DATABASE_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '5432'), - 'database' => env('DB_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), - 'password' => env('DB_PASSWORD', ''), - 'charset' => 'utf8', - 'prefix' => '', - 'prefix_indexes' => true, - 'schema' => 'public', - 'sslmode' => 'prefer', - ], - - 'sqlsrv' => [ - 'driver' => 'sqlsrv', - 'url' => env('DATABASE_URL'), - 'host' => env('DB_HOST', 'localhost'), - 'port' => env('DB_PORT', '1433'), - 'database' => env('DB_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), - 'password' => env('DB_PASSWORD', ''), - 'charset' => 'utf8', - 'prefix' => '', - 'prefix_indexes' => true, - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Migration Repository Table - |-------------------------------------------------------------------------- - | - | This table keeps track of all the migrations that have already run for - | your application. Using this information, we can determine which of - | the migrations on disk haven't actually been run in the database. - | - */ - - 'migrations' => 'migrations', - - /* - |-------------------------------------------------------------------------- - | Redis Databases - |-------------------------------------------------------------------------- - | - | Redis is an open source, fast, and advanced key-value store that also - | provides a richer body of commands than a typical key-value system - | such as APC or Memcached. Laravel makes it easy to dig right in. - | - */ - - 'redis' => [ - - 'client' => env('REDIS_CLIENT', 'predis'), - - 'options' => [ - 'cluster' => env('REDIS_CLUSTER', 'redis'), -// 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), - ], - - 'default' => [ - 'url' => env('REDIS_URL'), - 'host' => env('REDIS_HOST', '127.0.0.1'), - 'password' => env('REDIS_PASSWORD', null), - 'port' => env('REDIS_PORT', '6379'), - 'database' => env('REDIS_DB', '0'), - ], - - 'cache' => [ - 'url' => env('REDIS_URL'), - 'host' => env('REDIS_HOST', '127.0.0.1'), - 'password' => env('REDIS_PASSWORD', null), - 'port' => env('REDIS_PORT', '6379'), - 'database' => env('REDIS_CACHE_DB', '1'), - ], - - ], - -]; diff --git a/api/config/hashing.php b/api/config/hashing.php deleted file mode 100644 index 84257708..00000000 --- a/api/config/hashing.php +++ /dev/null @@ -1,52 +0,0 @@ - 'bcrypt', - - /* - |-------------------------------------------------------------------------- - | Bcrypt Options - |-------------------------------------------------------------------------- - | - | Here you may specify the configuration options that should be used when - | passwords are hashed using the Bcrypt algorithm. This will allow you - | to control the amount of time it takes to hash the given password. - | - */ - - 'bcrypt' => [ - 'rounds' => env('BCRYPT_ROUNDS', 10), - ], - - /* - |-------------------------------------------------------------------------- - | Argon Options - |-------------------------------------------------------------------------- - | - | Here you may specify the configuration options that should be used when - | passwords are hashed using the Argon algorithm. These will allow you - | to control the amount of time it takes to hash the given password. - | - */ - - 'argon' => [ - 'memory' => 1024, - 'threads' => 2, - 'time' => 2, - ], - -]; diff --git a/api/config/logging.php b/api/config/logging.php deleted file mode 100644 index 088c204e..00000000 --- a/api/config/logging.php +++ /dev/null @@ -1,104 +0,0 @@ - env('LOG_CHANNEL', 'stack'), - - /* - |-------------------------------------------------------------------------- - | Log Channels - |-------------------------------------------------------------------------- - | - | Here you may configure the log channels for your application. Out of - | the box, Laravel uses the Monolog PHP logging library. This gives - | you a variety of powerful log handlers / formatters to utilize. - | - | Available Drivers: "single", "daily", "slack", "syslog", - | "errorlog", "monolog", - | "custom", "stack" - | - */ - - 'channels' => [ - 'stack' => [ - 'driver' => 'stack', - 'channels' => ['single'], - 'ignore_exceptions' => false, - ], - - 'single' => [ - 'driver' => 'single', - 'path' => storage_path('logs/laravel.log'), - 'level' => 'debug', - ], - - 'daily' => [ - 'driver' => 'daily', - 'path' => storage_path('logs/laravel.log'), - 'level' => 'debug', - 'days' => 14, - ], - - 'slack' => [ - 'driver' => 'slack', - 'url' => env('LOG_SLACK_WEBHOOK_URL'), - 'username' => 'Laravel Log', - 'emoji' => ':boom:', - 'level' => 'critical', - ], - - 'papertrail' => [ - 'driver' => 'monolog', - 'level' => 'debug', - 'handler' => SyslogUdpHandler::class, - 'handler_with' => [ - 'host' => env('PAPERTRAIL_URL'), - 'port' => env('PAPERTRAIL_PORT'), - ], - ], - - 'stderr' => [ - 'driver' => 'monolog', - 'handler' => StreamHandler::class, - 'formatter' => env('LOG_STDERR_FORMATTER'), - 'with' => [ - 'stream' => 'php://stderr', - ], - ], - - 'syslog' => [ - 'driver' => 'syslog', - 'level' => 'debug', - ], - - 'errorlog' => [ - 'driver' => 'errorlog', - 'level' => 'debug', - ], - - 'null' => [ - 'driver' => 'monolog', - 'handler' => NullHandler::class, - ], - - 'emergency' => [ - 'path' => storage_path('logs/laravel.log'), - ], - ], - -]; diff --git a/api/config/queue.php b/api/config/queue.php deleted file mode 100644 index 3a30d6c6..00000000 --- a/api/config/queue.php +++ /dev/null @@ -1,88 +0,0 @@ - env('QUEUE_CONNECTION', 'sync'), - - /* - |-------------------------------------------------------------------------- - | Queue Connections - |-------------------------------------------------------------------------- - | - | Here you may configure the connection information for each server that - | is used by your application. A default configuration has been added - | for each back-end shipped with Laravel. You are free to add more. - | - | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" - | - */ - - 'connections' => [ - - 'sync' => [ - 'driver' => 'sync', - ], - - 'database' => [ - 'driver' => 'database', - 'table' => 'jobs', - 'queue' => 'default', - 'retry_after' => 90, - ], - - 'beanstalkd' => [ - 'driver' => 'beanstalkd', - 'host' => 'localhost', - 'queue' => 'default', - 'retry_after' => 90, - 'block_for' => 0, - ], - - 'sqs' => [ - 'driver' => 'sqs', - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), - 'queue' => env('SQS_QUEUE', 'your-queue-name'), - 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), - ], - - 'redis' => [ - 'driver' => 'redis', - 'connection' => 'default', - 'queue' => env('REDIS_QUEUE', 'default'), - 'retry_after' => 90, - 'block_for' => null, - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Failed Queue Jobs - |-------------------------------------------------------------------------- - | - | These options configure the behavior of failed queue job logging so you - | can control which database and table are used to store the jobs that - | have failed. You may change them to any database / table you wish. - | - */ - - 'failed' => [ - 'driver' => env('QUEUE_FAILED_DRIVER', 'database'), - 'database' => env('DB_CONNECTION', 'mysql'), - 'table' => 'failed_jobs', - ], - -]; diff --git a/api/config/services.php b/api/config/services.php deleted file mode 100644 index 72233a4c..00000000 --- a/api/config/services.php +++ /dev/null @@ -1,39 +0,0 @@ - [ - 'domain' => env('MAILGUN_DOMAIN'), - 'secret' => env('MAILGUN_SECRET'), - 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), - ], - - 'postmark' => [ - 'token' => env('POSTMARK_TOKEN'), - ], - - 'ses' => [ - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), - ], - - 'github' => [ - 'client_id' => env('GITHUB_CLIENT_ID', '52c2e3cc172fee5bccd7'), // Your GitHub Client ID - 'client_secret' => env('GITHUB_CLIENT_SECRET', 'fa5a77a1ddbea1728fc1c33bb53eef6e8b1e5757'), // Your GitHub Client Secret - 'redirect' => env('GITHUB_CLIENT_CALLBACK', 'https://lv6.halian.net/api/admin/oauth/github'), - ], - -]; diff --git a/api/database/.gitignore b/api/database/.gitignore deleted file mode 100644 index 97fc9767..00000000 --- a/api/database/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.sqlite -*.sqlite-journal diff --git a/api/database/factories/CodeConfigFactory.php b/api/database/factories/CodeConfigFactory.php deleted file mode 100644 index 6f37b4f2..00000000 --- a/api/database/factories/CodeConfigFactory.php +++ /dev/null @@ -1,12 +0,0 @@ -define(CodeConfig::class, function (Faker $faker) { - return [ - // - ]; -}); diff --git a/api/database/factories/CodeFactory.php b/api/database/factories/CodeFactory.php deleted file mode 100644 index ace1c040..00000000 --- a/api/database/factories/CodeFactory.php +++ /dev/null @@ -1,12 +0,0 @@ -define(Code::class, function (Faker $faker) { - return [ - // - ]; -}); diff --git a/api/database/factories/CodeSnippetFactory.php b/api/database/factories/CodeSnippetFactory.php deleted file mode 100644 index 5ba1f013..00000000 --- a/api/database/factories/CodeSnippetFactory.php +++ /dev/null @@ -1,12 +0,0 @@ -define(CodeSnippet::class, function (Faker $faker) { - return [ - // - ]; -}); diff --git a/api/database/factories/TableConfigFactory.php b/api/database/factories/TableConfigFactory.php deleted file mode 100644 index 9a5b272c..00000000 --- a/api/database/factories/TableConfigFactory.php +++ /dev/null @@ -1,12 +0,0 @@ -define(TableConfig::class, function (Faker $faker) { - return [ - // - ]; -}); diff --git a/api/database/factories/TableFactory.php b/api/database/factories/TableFactory.php deleted file mode 100644 index 79874ad1..00000000 --- a/api/database/factories/TableFactory.php +++ /dev/null @@ -1,12 +0,0 @@ -define(Table::class, function (Faker $faker) { - return [ - // - ]; -}); diff --git a/api/database/factories/UserFactory.php b/api/database/factories/UserFactory.php deleted file mode 100644 index 741edead..00000000 --- a/api/database/factories/UserFactory.php +++ /dev/null @@ -1,28 +0,0 @@ -define(User::class, function (Faker $faker) { - return [ - 'name' => $faker->name, - 'email' => $faker->unique()->safeEmail, - 'email_verified_at' => now(), - 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password - 'remember_token' => Str::random(10), - ]; -}); diff --git a/api/database/factories/WechatFactory.php b/api/database/factories/WechatFactory.php deleted file mode 100644 index b85065d7..00000000 --- a/api/database/factories/WechatFactory.php +++ /dev/null @@ -1,12 +0,0 @@ -define(Wechat::class, function (Faker $faker) { - return [ - // - ]; -}); diff --git a/api/database/migrations/2014_10_12_000000_create_users_table.php b/api/database/migrations/2014_10_12_000000_create_users_table.php deleted file mode 100644 index c209a214..00000000 --- a/api/database/migrations/2014_10_12_000000_create_users_table.php +++ /dev/null @@ -1,49 +0,0 @@ -bigIncrements('id'); - $table->string('nickname')->comment('昵称')->nullable(); - $table->string('email')->comment('登陆名')->nullable(); - $table->string('password')->nullable()->comment('密码'); - $table->string('phone', 11)->comment('手机号码')->nullable();; - $table->string('open_id')->comment('微信端用户ID')->nullable();; - $table->string('union_id')->comment('微信端用户联合ID')->nullable();; - $table->string('avatar')->nullable()->comment('用户头像'); - $table->boolean('status')->default(1)->comment('用户状态'); - $table->tinyInteger('gender')->default(0)->comment('用户'); - $table->string('country')->nullable()->comment('用户国家'); - $table->string('province')->nullable()->comment('用户所在省'); - $table->string('city')->nullable()->comment('用户所在市'); - $table->rememberToken(); - $table->softDeletes(); - $table->timestamps(); - $table->unique('email'); - $table->unique('phone'); - $table->unique('open_id'); - $table->unique('union_id'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('users'); - } -} diff --git a/api/database/migrations/2019_08_19_000000_create_failed_jobs_table.php b/api/database/migrations/2019_08_19_000000_create_failed_jobs_table.php deleted file mode 100644 index d432dff0..00000000 --- a/api/database/migrations/2019_08_19_000000_create_failed_jobs_table.php +++ /dev/null @@ -1,35 +0,0 @@ -bigIncrements('id'); - $table->text('connection'); - $table->text('queue'); - $table->longText('payload'); - $table->longText('exception'); - $table->timestamp('failed_at')->useCurrent(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('failed_jobs'); - } -} diff --git a/api/database/migrations/2020_04_20_000139_create_admins_table.php b/api/database/migrations/2020_04_20_000139_create_admins_table.php deleted file mode 100644 index 99bbbbd9..00000000 --- a/api/database/migrations/2020_04_20_000139_create_admins_table.php +++ /dev/null @@ -1,41 +0,0 @@ -bigIncrements('id'); - $table->string('nickname')->nullable()->comment('昵称'); - $table->string('email')->comment('登陆名'); - $table->string('phone')->comment('手机号码')->nullable(); - $table->string('avatar')->nullable()->comment('头像'); - $table->string('password')->nullable()->comment('密码'); - $table->tinyInteger('status')->default(1)->comment('用户状态'); - $table->rememberToken(); - $table->softDeletes(); - $table->timestamps(); - $table->unique('email'); - $table->unique('phone'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('admins'); - } -} diff --git a/api/database/migrations/2020_04_28_083406_create_roles_table.php b/api/database/migrations/2020_04_28_083406_create_roles_table.php deleted file mode 100644 index bddb6817..00000000 --- a/api/database/migrations/2020_04_28_083406_create_roles_table.php +++ /dev/null @@ -1,34 +0,0 @@ -bigIncrements('id'); - $table->string('name')->comment('英文名称'); - $table->string('desc')->comment('中文说明'); - $table->timestamps(); - $table->unique('name'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('roles'); - } -} diff --git a/api/database/migrations/2020_04_28_083415_create_modules_table.php b/api/database/migrations/2020_04_28_083415_create_modules_table.php deleted file mode 100644 index 8ab94548..00000000 --- a/api/database/migrations/2020_04_28_083415_create_modules_table.php +++ /dev/null @@ -1,34 +0,0 @@ -bigIncrements('id'); - $table->string('name')->comment('模块名称'); - $table->string('desc')->comment('中文说明'); - $table->timestamps(); - $table->unique('name'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('modules'); - } -} diff --git a/api/database/migrations/2020_04_28_083423_create_permissions_table.php b/api/database/migrations/2020_04_28_083423_create_permissions_table.php deleted file mode 100644 index 5c3f0d10..00000000 --- a/api/database/migrations/2020_04_28_083423_create_permissions_table.php +++ /dev/null @@ -1,35 +0,0 @@ -bigIncrements('id'); - $table->string('name')->comment('权限名称'); - $table->string('desc')->comment('中文说明')->nullable(); - $table->unsignedBigInteger('module_id')->comment('模块标识'); - $table->timestamps(); - $table->foreign('module_id')->references('id')->on('modules'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('permissions'); - } -} diff --git a/api/database/migrations/2020_04_28_083458_create_admin_roles_table.php b/api/database/migrations/2020_04_28_083458_create_admin_roles_table.php deleted file mode 100644 index 14f3b1d4..00000000 --- a/api/database/migrations/2020_04_28_083458_create_admin_roles_table.php +++ /dev/null @@ -1,36 +0,0 @@ -bigIncrements('id'); - $table->unsignedBigInteger('admin_id')->comment('用户标识'); - $table->unsignedBigInteger('role_id')->comment('角色标识'); - $table->timestamps(); - $table->unique(['admin_id', 'role_id']); - $table->foreign('admin_id')->references('id')->on('admins'); - $table->foreign('role_id')->references('id')->on('roles'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('user_roles'); - } -} diff --git a/api/database/migrations/2020_04_28_083513_create_role_permissions_table.php b/api/database/migrations/2020_04_28_083513_create_role_permissions_table.php deleted file mode 100644 index 14f4cacd..00000000 --- a/api/database/migrations/2020_04_28_083513_create_role_permissions_table.php +++ /dev/null @@ -1,36 +0,0 @@ -bigIncrements('id'); - $table->unsignedBigInteger('role_id')->comment('角色标识'); - $table->unsignedBigInteger('permission_id')->comment('权限标识'); - $table->timestamps(); - $table->unique(['role_id', 'permission_id']); - $table->foreign('role_id')->references('id')->on('roles'); - $table->foreign('permission_id')->references('id')->on('permissions'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('role_permissions'); - } -} diff --git a/api/database/migrations/2020_04_28_083525_create_admin_permissions_table.php b/api/database/migrations/2020_04_28_083525_create_admin_permissions_table.php deleted file mode 100644 index 71d6d8bb..00000000 --- a/api/database/migrations/2020_04_28_083525_create_admin_permissions_table.php +++ /dev/null @@ -1,36 +0,0 @@ -bigIncrements('id'); - $table->unsignedBigInteger('admin_id')->comment('用户标识'); - $table->unsignedBigInteger('permission_id')->comment('权限标识'); - $table->timestamps(); - $table->unique(['admin_id', 'permission_id']); - $table->foreign('admin_id')->references('id')->on('admins'); - $table->foreign('permission_id')->references('id')->on('permissions'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('user_permissions'); - } -} diff --git a/api/database/migrations/2020_04_28_094350_create_logs_table.php b/api/database/migrations/2020_04_28_094350_create_logs_table.php deleted file mode 100644 index d6466ae4..00000000 --- a/api/database/migrations/2020_04_28_094350_create_logs_table.php +++ /dev/null @@ -1,38 +0,0 @@ -bigIncrements('id'); - $table->unsignedBigInteger('admin_id')->comment('管理员标识'); - $table->string('name')->comment('登陆者--使用者'); - $table->string('address')->comment('地址--IP'); - $table->enum('event', ['login', 'system'])->comment('操作类型--登陆操作、系统操作'); - $table->string('desc')->comment('操作描述'); - $table->string('result')->comment('操作结果'); - $table->string('content')->comment('操作内容')->nullable(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('logs'); - } -} diff --git a/api/database/migrations/2020_08_06_064213_create_carousels_table.php b/api/database/migrations/2020_08_06_064213_create_carousels_table.php deleted file mode 100644 index e96ae709..00000000 --- a/api/database/migrations/2020_08_06_064213_create_carousels_table.php +++ /dev/null @@ -1,36 +0,0 @@ -bigIncrements('id'); - $table->string('title')->comment('标题'); - $table->string('img')->comment('轮播图像'); - $table->string('url')->nullable()->comment('地址'); - $table->string('opentype')->default('navigate')->comment('打开方式'); - $table->string('carousel_note')->nullable()->comment('轮播图描述'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('carousels'); - } -} diff --git a/api/database/migrations/2020_09_16_161319_create_article_categories_table.php b/api/database/migrations/2020_09_16_161319_create_article_categories_table.php deleted file mode 100644 index 5a68a855..00000000 --- a/api/database/migrations/2020_09_16_161319_create_article_categories_table.php +++ /dev/null @@ -1,34 +0,0 @@ -bigIncrements('id'); - $table->string('name')->comment('名称 英文'); - $table->string('note')->comment('说明 中文'); - $table->tinyInteger('status')->default(1)->comment('是否启用'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('article_categories'); - } -} diff --git a/api/database/migrations/2020_09_16_161328_create_articles_table.php b/api/database/migrations/2020_09_16_161328_create_articles_table.php deleted file mode 100644 index ca26f4ea..00000000 --- a/api/database/migrations/2020_09_16_161328_create_articles_table.php +++ /dev/null @@ -1,39 +0,0 @@ -bigIncrements('id'); - $table->string('title')->comment('文章标题'); - $table->string('img')->comment('文章封面'); - $table->string('summary')->nullable()->comment('文章描述'); - $table->text('content')->comment('文章内容'); - $table->boolean('status')->default(true)->comment('文章启用状态'); - $table->unsignedInteger('order')->default(1)->comment('文章顺序'); - $table->unsignedBigInteger('article_category_id')->comment('文章种类标识'); - $table->foreign('article_category_id')->references('id')->on('article_categories'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('articles'); - } -} diff --git a/api/database/migrations/2021_10_04_144228_create_wechats_table.php b/api/database/migrations/2021_10_04_144228_create_wechats_table.php deleted file mode 100644 index aaad2545..00000000 --- a/api/database/migrations/2021_10_04_144228_create_wechats_table.php +++ /dev/null @@ -1,35 +0,0 @@ -bigIncrements('id'); - $table->string('app_id')->nullable()->comment('微信应用APP_ID'); - $table->string('app_secret')->nullable()->comment('微信应用APP_Secret'); - $table->string('type')->comment('微信应用类型'); - $table->boolean('status')->default(1)->comment('微信应用是否启用'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('wechats'); - } -} diff --git a/api/database/migrations/2021_10_07_011855_create_three_logins_table.php b/api/database/migrations/2021_10_07_011855_create_three_logins_table.php deleted file mode 100644 index 89e5ffe5..00000000 --- a/api/database/migrations/2021_10_07_011855_create_three_logins_table.php +++ /dev/null @@ -1,35 +0,0 @@ -bigIncrements('id'); - $table->integer('admin_id')->nullable()->comment('用户id'); - $table->integer('platform_id')->comment('第三方平台上的id号'); - $table->string('provider')->comment('第三方平台'); - $table->string('remark')->nullable()->comment('备注'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('three_logins'); - } -} diff --git a/api/database/migrations/2022_04_05_143141_create_tables_table.php b/api/database/migrations/2022_04_05_143141_create_tables_table.php deleted file mode 100644 index a31f8501..00000000 --- a/api/database/migrations/2022_04_05_143141_create_tables_table.php +++ /dev/null @@ -1,37 +0,0 @@ -bigIncrements('id'); - $table->string('table_name')->nullable()->comment("表名称"); - $table->string('table_comment')->nullable()->comment('表注释'); - $table->string('engine')->nullable()->comment('数据表引擎'); - $table->string('table_collation')->nullable()->comment('字符编码集'); - $table->dateTime('create_time')->nullable()->comment('创建日期'); - $table->text('table_config')->nullable()->comment('表的基础配置'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('tables'); - } -} diff --git a/api/database/migrations/2022_04_05_144756_create_codes_table.php b/api/database/migrations/2022_04_05_144756_create_codes_table.php deleted file mode 100644 index 83850d13..00000000 --- a/api/database/migrations/2022_04_05_144756_create_codes_table.php +++ /dev/null @@ -1,35 +0,0 @@ -bigIncrements('id'); - $table->string('name')->comment("配置名称"); - $table->text('value')->comment('配置内容'); - $table->timestamps(); - }); - - - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('codes'); - } -} diff --git a/api/database/migrations/2022_04_05_163047_create_code_configs_table.php b/api/database/migrations/2022_04_05_163047_create_code_configs_table.php deleted file mode 100644 index ad836f6c..00000000 --- a/api/database/migrations/2022_04_05_163047_create_code_configs_table.php +++ /dev/null @@ -1,40 +0,0 @@ -bigIncrements('id'); - $table->string('front_dir')->nullable()->comment('前端目录配置'); - $table->string('front_api')->nullable()->comment('前端api目录配置'); - $table->string('front_model')->nullable()->comment('前端model目录配置'); - $table->string('front_view')->nullable()->comment('前端view目录配置'); - $table->string('back_dir')->nullable()->comment('后端目录配置'); - $table->string('back_api')->nullable()->comment('后端控制器目录配置'); - $table->string('back_model')->nullable()->comment('后端models目录配置'); - $table->string('back_routes')->nullable()->comment('后端routes目录配置'); - $table->string('back_resource')->nullable()->comment('后端resource目录配置'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('code_configs'); - } -} diff --git a/api/database/migrations/2022_04_05_163508_create_code_snippets_table.php b/api/database/migrations/2022_04_05_163508_create_code_snippets_table.php deleted file mode 100644 index 0a38f8be..00000000 --- a/api/database/migrations/2022_04_05_163508_create_code_snippets_table.php +++ /dev/null @@ -1,40 +0,0 @@ -bigIncrements('id'); - $table->string('name')->nullable()->comment('代码方案名称'); - $table->string('desc')->nullable()->comment('代码方案说明'); - $table->text('front_api')->nullable()->comment('前端api代码片段'); - $table->text('front_model')->nullable()->comment('前端模型代码片段'); - $table->text('front_page')->nullable()->comment('前端页面代码片段'); - $table->text('back_routes')->nullable()->comment('后端路由代码片段'); - $table->text('back_model')->nullable()->comment('后端模型代码片段'); - $table->text('back_resource')->nullable()->comment('后端资源代码片段'); - $table->text('back_api')->nullable()->comment('后端API接口代码片段'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('code_snippets'); - } -} diff --git a/api/database/migrations/2022_08_18_103626_create_table_configs_table.php b/api/database/migrations/2022_08_18_103626_create_table_configs_table.php deleted file mode 100644 index d3ec274f..00000000 --- a/api/database/migrations/2022_08_18_103626_create_table_configs_table.php +++ /dev/null @@ -1,42 +0,0 @@ -bigIncrements('id'); - $table->string('table_name')->nullable()->comment("表名称"); - $table->string('column_name')->nullable()->comment("字段名称"); - $table->string('data_type')->nullable()->comment("字段类型"); - $table->string('column_comment')->nullable()->comment("字段描述"); - $table->boolean('is_required')->nullable()->comment("是否必填项目")->default(0); - $table->boolean('is_list')->nullable()->comment("是否列表项目")->default(0); - $table->boolean('is_form')->nullable()->comment("是否表单项目")->default(0); - $table->string('form_type')->nullable()->comment("表单类型"); - $table->string('query_type')->nullable()->comment("查询方式"); - $table->string('assoc_table')->nullable()->comment("关联表"); - $table->integer('form_order')->nullable()->comment("表单的顺序"); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('table_configs'); - } -} diff --git a/api/database/seeds/AdminPermissionSeeder.php b/api/database/seeds/AdminPermissionSeeder.php deleted file mode 100644 index a6fbf7cd..00000000 --- a/api/database/seeds/AdminPermissionSeeder.php +++ /dev/null @@ -1,16 +0,0 @@ -where('name', 'admin')->value('id'); - $admin_id = DB::table('admins')->where('email', 'admin')->value('id'); - DB::table('admin_roles')->insert([ - "role_id" => $role_id, - "admin_id" => $admin_id, - "created_at" => Carbon::now() - ]); - } -} diff --git a/api/database/seeds/AdminSeeder.php b/api/database/seeds/AdminSeeder.php deleted file mode 100644 index 4b4fb399..00000000 --- a/api/database/seeds/AdminSeeder.php +++ /dev/null @@ -1,25 +0,0 @@ -insert([ - "nickname" => 'admin', - "email" => 'admin', - "password" => bcrypt("123456"), - "status" => 1, - "created_at" => Carbon::now() - ]); - } -} diff --git a/api/database/seeds/CodeConfigSeeder.php b/api/database/seeds/CodeConfigSeeder.php deleted file mode 100644 index a6c7c48c..00000000 --- a/api/database/seeds/CodeConfigSeeder.php +++ /dev/null @@ -1,16 +0,0 @@ -call(UsersTableSeeder::class); - $this->call(AdminSeeder::class); - $this->call(RoleSeeder::class); - $this->call(AdminRoleSeeder::class); - $this->call(WechatSeeder::class); // 微信配置数据表 - $this->call(ViewSeeder::class); // 建立视图 - } -} diff --git a/api/database/seeds/LogSeeder.php b/api/database/seeds/LogSeeder.php deleted file mode 100644 index b8cbe864..00000000 --- a/api/database/seeds/LogSeeder.php +++ /dev/null @@ -1,16 +0,0 @@ - "admin", - "desc" => "超级管理员", - "created_at" => Carbon::now() - ], - [ - "name" => "user", - "desc" => "普通用户", - "created_at" => Carbon::now() - ] - ]; - \App\Models\Role::insert($result); - } -} diff --git a/api/database/seeds/TableConfigSeeder.php b/api/database/seeds/TableConfigSeeder.php deleted file mode 100644 index fce2dcae..00000000 --- a/api/database/seeds/TableConfigSeeder.php +++ /dev/null @@ -1,16 +0,0 @@ - '', - 'app_secret' => '', - 'type' => 'mp', // 小程序 - 'created_at' => now() - ], - [ - 'app_id' => '', - 'app_secret' => '', - 'type' => 'office', // 小程序 - 'created_at' => now() - ], - ]; - - \App\Models\Wechat::insert($data); - } -} diff --git a/api/laravel-echo-server.json b/api/laravel-echo-server.json deleted file mode 100644 index 2448b5d8..00000000 --- a/api/laravel-echo-server.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "authHost": "http://lv6.template.test", - "authEndpoint": "/api/broadcasting/auth", - "clients": [], - "database": "redis", - "databaseConfig": { - "redis": {}, - "sqlite": { - "databasePath": "/database/laravel-echo-server.sqlite" - } - }, - "devMode": true, - "host": null, - "port": "6001", - "protocol": "http", - "socketio": {}, - "secureOptions": 67108864, - "sslCertPath": "", - "sslKeyPath": "", - "sslCertChainPath": "", - "sslPassphrase": "", - "subscribers": { - "http": true, - "redis": true - }, - "apiOriginAllow": { - "allowCors": true, - "allowOrigin": "*", - "allowMethods": "*", - "allowHeaders": "*" - } -} diff --git a/api/package-lock.json b/api/package-lock.json deleted file mode 100644 index d8f8ac60..00000000 --- a/api/package-lock.json +++ /dev/null @@ -1,10243 +0,0 @@ -{ - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.0" - } - }, - "@babel/compat-data": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", - "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", - "dev": true - }, - "@babel/core": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", - "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helpers": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", - "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", - "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz", - "integrity": "sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", - "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz", - "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-member-expression-to-functions": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz", - "integrity": "sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "regexpu-core": "^4.7.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz", - "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz", - "integrity": "sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", - "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", - "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", - "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", - "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", - "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", - "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz", - "integrity": "sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-wrap-function": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-replace-supers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", - "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", - "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz", - "integrity": "sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helpers": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", - "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", - "dev": true, - "requires": { - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.3", - "@babel/types": "^7.16.0" - } - }, - "@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", - "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", - "dev": true - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz", - "integrity": "sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz", - "integrity": "sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz", - "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.4", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz", - "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz", - "integrity": "sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz", - "integrity": "sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz", - "integrity": "sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz", - "integrity": "sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz", - "integrity": "sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz", - "integrity": "sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz", - "integrity": "sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz", - "integrity": "sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.0" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz", - "integrity": "sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz", - "integrity": "sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz", - "integrity": "sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz", - "integrity": "sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz", - "integrity": "sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz", - "integrity": "sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz", - "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.0" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz", - "integrity": "sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz", - "integrity": "sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz", - "integrity": "sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz", - "integrity": "sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz", - "integrity": "sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz", - "integrity": "sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz", - "integrity": "sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz", - "integrity": "sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz", - "integrity": "sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz", - "integrity": "sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz", - "integrity": "sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz", - "integrity": "sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz", - "integrity": "sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz", - "integrity": "sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-simple-access": "^7.16.0", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz", - "integrity": "sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-identifier": "^7.15.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz", - "integrity": "sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz", - "integrity": "sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz", - "integrity": "sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz", - "integrity": "sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.16.0" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz", - "integrity": "sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz", - "integrity": "sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz", - "integrity": "sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz", - "integrity": "sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz", - "integrity": "sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.4.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz", - "integrity": "sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz", - "integrity": "sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz", - "integrity": "sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz", - "integrity": "sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz", - "integrity": "sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz", - "integrity": "sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz", - "integrity": "sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/preset-env": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz", - "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-compilation-targets": "^7.16.3", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-async-generator-functions": "^7.16.4", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-class-static-block": "^7.16.0", - "@babel/plugin-proposal-dynamic-import": "^7.16.0", - "@babel/plugin-proposal-export-namespace-from": "^7.16.0", - "@babel/plugin-proposal-json-strings": "^7.16.0", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-object-rest-spread": "^7.16.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-proposal-private-property-in-object": "^7.16.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.0", - "@babel/plugin-transform-async-to-generator": "^7.16.0", - "@babel/plugin-transform-block-scoped-functions": "^7.16.0", - "@babel/plugin-transform-block-scoping": "^7.16.0", - "@babel/plugin-transform-classes": "^7.16.0", - "@babel/plugin-transform-computed-properties": "^7.16.0", - "@babel/plugin-transform-destructuring": "^7.16.0", - "@babel/plugin-transform-dotall-regex": "^7.16.0", - "@babel/plugin-transform-duplicate-keys": "^7.16.0", - "@babel/plugin-transform-exponentiation-operator": "^7.16.0", - "@babel/plugin-transform-for-of": "^7.16.0", - "@babel/plugin-transform-function-name": "^7.16.0", - "@babel/plugin-transform-literals": "^7.16.0", - "@babel/plugin-transform-member-expression-literals": "^7.16.0", - "@babel/plugin-transform-modules-amd": "^7.16.0", - "@babel/plugin-transform-modules-commonjs": "^7.16.0", - "@babel/plugin-transform-modules-systemjs": "^7.16.0", - "@babel/plugin-transform-modules-umd": "^7.16.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", - "@babel/plugin-transform-new-target": "^7.16.0", - "@babel/plugin-transform-object-super": "^7.16.0", - "@babel/plugin-transform-parameters": "^7.16.3", - "@babel/plugin-transform-property-literals": "^7.16.0", - "@babel/plugin-transform-regenerator": "^7.16.0", - "@babel/plugin-transform-reserved-words": "^7.16.0", - "@babel/plugin-transform-shorthand-properties": "^7.16.0", - "@babel/plugin-transform-spread": "^7.16.0", - "@babel/plugin-transform-sticky-regex": "^7.16.0", - "@babel/plugin-transform-template-literals": "^7.16.0", - "@babel/plugin-transform-typeof-symbol": "^7.16.0", - "@babel/plugin-transform-unicode-escapes": "^7.16.0", - "@babel/plugin-transform-unicode-regex": "^7.16.0", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.0", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.4.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.19.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/runtime": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", - "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/traverse": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", - "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.3", - "@babel/types": "^7.16.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "to-fast-properties": "^2.0.0" - } - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "@types/node": { - "version": "16.11.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz", - "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA==", - "dev": true - }, - "@types/q": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", - "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", - "dev": true - }, - "@vue/component-compiler-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", - "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", - "dev": true, - "requires": { - "consolidate": "^0.15.1", - "hash-sum": "^1.0.2", - "lru-cache": "^4.1.2", - "merge-source-map": "^1.1.0", - "postcss": "^7.0.36", - "postcss-selector-parser": "^6.0.2", - "prettier": "^1.18.2 || ^2.0.0", - "source-map": "~0.6.1", - "vue-template-es2015-compiler": "^1.9.0" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true - }, - "adjust-sourcemap-loader": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-1.2.0.tgz", - "integrity": "sha512-958oaHHVEXMvsY7v7cC5gEkNIcoaAVIhZ4mBReYVZJOTP9IgKmzLjIOhTtzpLMu+qriXvLsVjJ155EeInp45IQ==", - "dev": true, - "requires": { - "assert": "^1.3.0", - "camelcase": "^1.2.1", - "loader-utils": "^1.1.0", - "lodash.assign": "^4.0.1", - "lodash.defaults": "^3.1.2", - "object-path": "^0.9.2", - "regex-parser": "^2.2.9" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "lodash.defaults": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", - "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=", - "dev": true, - "requires": { - "lodash.assign": "^3.0.0", - "lodash.restparam": "^3.0.0" - }, - "dependencies": { - "lodash.assign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", - "dev": true, - "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._createassigner": "^3.0.0", - "lodash.keys": "^3.0.0" - } - } - } - } - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "ast-types": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", - "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", - "dev": true - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "autoprefixer": { - "version": "9.8.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", - "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "picocolors": "^0.2.1", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - } - } - }, - "axios": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", - "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", - "dev": true, - "requires": { - "follow-redirects": "1.5.10" - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "babel-loader": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", - "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", - "dev": true, - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - } - }, - "babel-merge": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/babel-merge/-/babel-merge-2.0.1.tgz", - "integrity": "sha512-puTQQxuzS+0JlMyVdfsTVaCgzqjBXKPMv7oUANpYcHFY+7IptWZ4PZDYX+qBxrRMtrriuBA44LkKpS99EJzqVA==", - "dev": true, - "requires": { - "@babel/core": "^7.0.0-beta.49", - "deepmerge": "^2.1.0", - "object.omit": "^3.0.0" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz", - "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.0", - "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", - "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.0", - "core-js-compat": "^3.18.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz", - "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", - "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001280", - "electron-to-chromium": "^1.3.896", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001283", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz", - "integrity": "sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", - "dev": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collect.js": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/collect.js/-/collect.js-4.29.0.tgz", - "integrity": "sha512-yhgGYEsLEcqnLT1NmRlN1+1euoz9SDhxQ4QyDhWYsKoWsg7252PKA5++dWaDs8mdFxbkmXDXQUaHXI9J2eTPkQ==", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dev": true, - "requires": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-string": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", - "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "concatenate": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/concatenate/-/concatenate-0.0.2.tgz", - "integrity": "sha1-C0nW6MQQR9dyjNyNYqCGYjOXtJ8=", - "dev": true, - "requires": { - "globs": "^0.1.2" - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "consolidate": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", - "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", - "dev": true, - "requires": { - "bluebird": "^3.1.1" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-js-compat": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.1.tgz", - "integrity": "sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==", - "dev": true, - "requires": { - "browserslist": "^4.17.6", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-env": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.1.tgz", - "integrity": "sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.5" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", - "dev": true - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "dev": true, - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - } - }, - "css-loader": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", - "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash": "^4.17.11", - "postcss": "^6.0.23", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dev": true, - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cssnano": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", - "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.8", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "cssnano-preset-default": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", - "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", - "dev": true, - "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.3", - "postcss-unique-selectors": "^4.0.1" - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", - "dev": true - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - }, - "dependencies": { - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deepmerge": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", - "dev": true - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - } - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", - "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==", - "dev": true - }, - "dotenv-expand": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", - "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.1.tgz", - "integrity": "sha512-9ldvb6QMHiDpUNF1iSwBTiTT0qXEN+xIO5WlCJrC5gt0z74ofOiqR698vaJqYWnri0XZiF0YmnrFmGq/EmpGAA==", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", - "dev": true, - "requires": { - "stackframe": "^1.1.1" - } - }, - "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-templates": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", - "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", - "dev": true, - "requires": { - "recast": "~0.11.12", - "through": "~2.3.6" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "eventsource": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "extract-text-webpack-plugin": { - "version": "4.0.0-beta.0", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-4.0.0-beta.0.tgz", - "integrity": "sha512-Hypkn9jUTnFr0DpekNam53X47tXn3ucY08BQumv7kdGgeVUBLq3DJHJTi6HNxv4jl9W+Skxjz9+RnK0sJyqqjA==", - "dev": true, - "requires": { - "async": "^2.4.1", - "loader-utils": "^1.1.0", - "schema-utils": "^0.4.5", - "webpack-sources": "^1.1.0" - }, - "dependencies": { - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, - "file-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz", - "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==", - "dev": true, - "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "file-type": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz", - "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==", - "dev": true - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "dev": true, - "requires": { - "debug": "=3.1.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "friendly-errors-webpack-plugin": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz", - "integrity": "sha512-K27M3VK30wVoOarP651zDmb93R9zF28usW4ocaK3mfQeIEI5BPht/EzZs5E8QLLwbLRJQMwscAjDxYPb1FuNiw==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "error-stack-parser": "^2.0.0", - "string-width": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", - "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=", - "dev": true - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - }, - "dependencies": { - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - } - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "globs": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globs/-/globs-0.1.4.tgz", - "integrity": "sha512-D23dWbOq48vlOraoSigbcQV4tWrnhwk+E/Um2cMuDS3/5dwGmdFeA7L/vAvDhLFlQOTDqHcXh35m/71g2A2WzQ==", - "dev": true, - "requires": { - "glob": "^7.1.1" - } - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", - "dev": true - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", - "dev": true - }, - "html-loader": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz", - "integrity": "sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==", - "dev": true, - "requires": { - "es6-templates": "^0.2.3", - "fastparse": "^1.1.1", - "html-minifier": "^3.5.8", - "loader-utils": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", - "dev": true, - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, - "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "imagemin": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-6.1.0.tgz", - "integrity": "sha512-8ryJBL1CN5uSHpiBMX0rJw79C9F9aJqMnjGnrd/1CafegpNuA81RBAAru/jQQEOWlOJJlpRnlcVFF6wq+Ist0A==", - "dev": true, - "requires": { - "file-type": "^10.7.0", - "globby": "^8.0.1", - "make-dir": "^1.0.0", - "p-pipe": "^1.1.0", - "pify": "^4.0.1", - "replace-ext": "^1.0.0" - }, - "dependencies": { - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - } - } - }, - "img-loader": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/img-loader/-/img-loader-3.0.2.tgz", - "integrity": "sha512-rSriLKgvi85Km7ppSF+AEAM3nU4fxpvCkaXtC/IoCEU7jfks55bEANFs0bB9YXYkxY9JurZQIZFtXh5Gue3upw==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0" - } - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "laravel-mix": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/laravel-mix/-/laravel-mix-4.1.4.tgz", - "integrity": "sha512-fpFNpPyYAdeZ5mozlKbHpw+tCiRFUCCdSsK/D2+yYhlyIEbzPcAe4ar5cjeT33TnDNiKXSS42cB58yUSW5Y5tg==", - "dev": true, - "requires": { - "@babel/core": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0", - "@babel/plugin-transform-runtime": "^7.2.0", - "@babel/preset-env": "^7.2.0", - "@babel/runtime": "^7.2.0", - "autoprefixer": "^9.4.2", - "babel-loader": "^8.0.4", - "babel-merge": "^2.0.1", - "chokidar": "^2.0.3", - "clean-css": "^4.1.3", - "collect.js": "^4.12.8", - "concatenate": "0.0.2", - "css-loader": "^1.0.1", - "dotenv": "^6.2.0", - "dotenv-expand": "^4.2.0", - "extract-text-webpack-plugin": "v4.0.0-beta.0", - "file-loader": "^2.0.0", - "friendly-errors-webpack-plugin": "^1.6.1", - "fs-extra": "^7.0.1", - "glob": "^7.1.2", - "html-loader": "^0.5.5", - "imagemin": "^6.0.0", - "img-loader": "^3.0.0", - "lodash": "^4.17.15", - "md5": "^2.2.1", - "optimize-css-assets-webpack-plugin": "^5.0.1", - "postcss-loader": "^3.0.0", - "style-loader": "^0.23.1", - "terser": "^3.11.0", - "terser-webpack-plugin": "^1.2.2", - "vue-loader": "^15.4.2", - "webpack": "^4.27.1", - "webpack-cli": "^3.1.2", - "webpack-dev-server": "^3.1.14", - "webpack-merge": "^4.1.0", - "webpack-notifier": "^1.5.1", - "yargs": "^12.0.5" - } - }, - "last-call-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", - "dev": true, - "requires": { - "lodash": "^4.17.5", - "webpack-sources": "^1.1.0" - } - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", - "dev": true - }, - "lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", - "dev": true, - "requires": { - "lodash._bindcallback": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash.restparam": "^3.0.0" - } - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "dev": true - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "loglevel": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", - "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", - "dev": true - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dev": true, - "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "requires": { - "mime-db": "1.51.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - }, - "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", - "dev": true - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "node-notifier": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-9.0.1.tgz", - "integrity": "sha512-fPNFIp2hF/Dq7qLDzSg4vZ0J4e9v60gJR+Qx7RbjbWqzPDdEqeVpEx5CFeDAELIl+A/woaaNn1fQ5nEVerMxJg==", - "dev": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - }, - "dependencies": { - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", - "dev": true - }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-path": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz", - "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", - "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "object.omit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-3.0.0.tgz", - "integrity": "sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ==", - "dev": true, - "requires": { - "is-extendable": "^1.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optimize-css-assets-webpack-plugin": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.8.tgz", - "integrity": "sha512-mgFS1JdOtEGzD8l+EuISqL57cKO+We9GcoiQEmdCWRqqck+FGNmYJtx9qfAPzEz+lRrlThWMuGDaRkI/yWNx/Q==", - "dev": true, - "requires": { - "cssnano": "^4.1.10", - "last-call-webpack-plugin": "^3.0.0" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-pipe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", - "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=", - "dev": true - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-calc": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", - "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", - "dev": true, - "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - } - }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-load-config": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", - "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "dev": true, - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", - "dev": true, - "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "dev": true, - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "dev": true, - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "dev": true, - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-svgo": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", - "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", - "dev": true - }, - "prettier": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", - "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", - "dev": true, - "optional": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - } - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "readline": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", - "integrity": "sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw=", - "dev": true - }, - "readline-sync": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", - "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", - "dev": true - }, - "recast": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", - "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", - "dev": true, - "requires": { - "ast-types": "0.9.6", - "esprima": "~3.1.0", - "private": "~0.1.5", - "source-map": "~0.5.0" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", - "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "regexpu-core": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", - "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", - "dev": true, - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^9.0.0", - "regjsgen": "^0.5.2", - "regjsparser": "^0.7.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", - "dev": true - }, - "regjsparser": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", - "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "replace-ext": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - } - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "resolve-url-loader": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-2.3.2.tgz", - "integrity": "sha512-sc/UVgiADdoTc+4cGPB7cUCnlEkzlxD1NXHw4oa9qA0fp30H8mAQ2ePJBP9MQ029DUuhEPouhNdvzT37pBCV0g==", - "dev": true, - "requires": { - "adjust-sourcemap-loader": "^1.1.0", - "camelcase": "^4.1.0", - "convert-source-map": "^1.5.1", - "loader-utils": "^1.1.0", - "lodash.defaults": "^4.0.0", - "rework": "^1.0.1", - "rework-visit": "^1.0.0", - "source-map": "^0.5.7", - "urix": "^0.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "dev": true, - "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", - "dev": true - } - } - }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", - "dev": true - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass": { - "version": "1.43.5", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.43.5.tgz", - "integrity": "sha512-WuNm+eAryMgQluL7Mbq9M4EruyGGMyal7Lu58FfnRMVWxgUzIvI7aSn60iNt3kn5yZBMR7G84fAGDcwqOF5JOg==", - "dev": true, - "requires": { - "chokidar": ">=3.0.0 <4.0.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "sass-loader": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.3.1.tgz", - "integrity": "sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.0.1", - "neo-async": "^2.5.0", - "pify": "^4.0.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", - "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", - "dev": true, - "requires": { - "node-forge": "^0.10.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", - "dev": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", - "websocket-driver": "^0.7.4" - } - }, - "sockjs-client": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", - "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", - "dev": true, - "requires": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", - "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.5.3" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stdio": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/stdio/-/stdio-2.1.1.tgz", - "integrity": "sha512-ZHO7SD10nZnc2pMN85MPPTCKutXPKH+7Z50B7zt/JRNAHXLbI3BidMc9HFD/j2VupZ8lQdSVJB0ebZSVXC6uXw==", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "terser": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", - "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", - "dev": true, - "requires": { - "commander": "^2.19.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.10" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - } - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", - "dev": true, - "requires": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-parse": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", - "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", - "dev": true - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "vue-hot-reload-api": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", - "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", - "dev": true - }, - "vue-loader": { - "version": "15.9.8", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.8.tgz", - "integrity": "sha512-GwSkxPrihfLR69/dSV3+5CdMQ0D+jXg8Ma1S4nQXKJAznYFX14vHdc/NetQc34Dw+rBbIJyP7JOuVb9Fhprvog==", - "dev": true, - "requires": { - "@vue/component-compiler-utils": "^3.1.0", - "hash-sum": "^1.0.2", - "loader-utils": "^1.1.0", - "vue-hot-reload-api": "^2.3.0", - "vue-style-loader": "^4.1.0" - } - }, - "vue-style-loader": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", - "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", - "dev": true, - "requires": { - "hash-sum": "^1.0.2", - "loader-utils": "^1.0.2" - } - }, - "vue-template-es2015-compiler": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", - "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", - "dev": true - }, - "watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dev": true, - "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.1" - }, - "dependencies": { - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "optional": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "optional": true - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "webpack-cli": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", - "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.1", - "findup-sync": "^3.0.0", - "global-modules": "^2.0.0", - "import-local": "^2.0.0", - "interpret": "^1.4.0", - "loader-utils": "^1.4.0", - "supports-color": "^6.1.0", - "v8-compile-cache": "^2.1.1", - "yargs": "^13.3.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - } - } - }, - "webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - } - } - }, - "webpack-dev-server": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", - "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", - "dev": true, - "requires": { - "ansi-html-community": "0.0.8", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", - "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "webpack-notifier": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.14.1.tgz", - "integrity": "sha512-OVOoiOyKHS3z9pN1nLdPY2Pf/R3wiBsN0KiPc3K6ApwMBfHbyUomQc2Mr0naeKxfqXyCBPHfQuqpL9yoL0rgkA==", - "dev": true, - "requires": { - "node-notifier": "^9.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} diff --git a/api/package.json b/api/package.json deleted file mode 100644 index 7a99f8d1..00000000 --- a/api/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "private": true, - "scripts": { - "dev": "npm run development", - "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", - "watch": "npm run development -- --watch", - "watch-poll": "npm run watch -- --watch-poll", - "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", - "prod": "npm run production", - "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", - "clone": "node tools/clone.js" - }, - "devDependencies": { - "axios": "^0.19", - "cross-env": "^5.1", - "fs": "0.0.1-security", - "laravel-mix": "^4.0.7", - "lodash": "^4.17.13", - "readline": "^1.3.0", - "readline-sync": "^1.4.10", - "resolve-url-loader": "^2.3.1", - "sass": "^1.15.2", - "sass-loader": "^7.1.0", - "stdio": "^2.1.1" - } -} diff --git a/api/phpunit.xml b/api/phpunit.xml deleted file mode 100644 index 0f4389f9..00000000 --- a/api/phpunit.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - ./tests/Unit - - - - ./tests/Feature - - - - - ./app - - - - - - - - - - - - - diff --git a/api/public/.htaccess b/api/public/.htaccess deleted file mode 100644 index b75525be..00000000 --- a/api/public/.htaccess +++ /dev/null @@ -1,21 +0,0 @@ - - - Options -MultiViews -Indexes - - - RewriteEngine On - - # Handle Authorization Header - RewriteCond %{HTTP:Authorization} . - RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - - # Redirect Trailing Slashes If Not A Folder... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_URI} (.+)/$ - RewriteRule ^ %1 [L,R=301] - - # Handle Front Controller... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^ index.php [L] - diff --git a/api/public/1.pdf b/api/public/1.pdf deleted file mode 100644 index 5b79a22c..00000000 Binary files a/api/public/1.pdf and /dev/null differ diff --git a/api/public/pdf/fontbox-2.0.24.jar b/api/public/pdf/fontbox-2.0.24.jar deleted file mode 100644 index e93794c1..00000000 Binary files a/api/public/pdf/fontbox-2.0.24.jar and /dev/null differ diff --git a/api/public/pdf/pdfbox-2.0.24.jar b/api/public/pdf/pdfbox-2.0.24.jar deleted file mode 100644 index c6515b84..00000000 Binary files a/api/public/pdf/pdfbox-2.0.24.jar and /dev/null differ diff --git a/api/public/pdf/pdfbox-app-2.0.24.jar b/api/public/pdf/pdfbox-app-2.0.24.jar deleted file mode 100644 index 9fd1108a..00000000 Binary files a/api/public/pdf/pdfbox-app-2.0.24.jar and /dev/null differ diff --git a/api/public/pdf/pdfbox-debugger-2.0.24.jar b/api/public/pdf/pdfbox-debugger-2.0.24.jar deleted file mode 100644 index b3d588c2..00000000 Binary files a/api/public/pdf/pdfbox-debugger-2.0.24.jar and /dev/null differ diff --git a/api/public/pdf/pdfbox-tools-2.0.24.jar b/api/public/pdf/pdfbox-tools-2.0.24.jar deleted file mode 100644 index 2c4b40a3..00000000 Binary files a/api/public/pdf/pdfbox-tools-2.0.24.jar and /dev/null differ diff --git a/api/public/pdf/preflight-2.0.24.jar b/api/public/pdf/preflight-2.0.24.jar deleted file mode 100644 index 1b8f1fb7..00000000 Binary files a/api/public/pdf/preflight-2.0.24.jar and /dev/null differ diff --git a/api/public/test.pdf b/api/public/test.pdf deleted file mode 100644 index 2fc7b7a3..00000000 Binary files a/api/public/test.pdf and /dev/null differ diff --git a/api/public/xls/1633367547.xlsx b/api/public/xls/1633367547.xlsx deleted file mode 100644 index 40229853..00000000 Binary files a/api/public/xls/1633367547.xlsx and /dev/null differ diff --git a/api/public/xls/1633367679.xlsx b/api/public/xls/1633367679.xlsx deleted file mode 100644 index 9eba8ca2..00000000 Binary files a/api/public/xls/1633367679.xlsx and /dev/null differ diff --git a/api/public/xls/1633368057.xlsx b/api/public/xls/1633368057.xlsx deleted file mode 100644 index 976fe87b..00000000 Binary files a/api/public/xls/1633368057.xlsx and /dev/null differ diff --git a/api/public/xls/1633368118.xlsx b/api/public/xls/1633368118.xlsx deleted file mode 100644 index 6f0e8075..00000000 Binary files a/api/public/xls/1633368118.xlsx and /dev/null differ diff --git a/api/public/xls/1633368173.xlsx b/api/public/xls/1633368173.xlsx deleted file mode 100644 index af92581e..00000000 Binary files a/api/public/xls/1633368173.xlsx and /dev/null differ diff --git a/api/public/xls/1633368272.xlsx b/api/public/xls/1633368272.xlsx deleted file mode 100644 index 07ca304f..00000000 Binary files a/api/public/xls/1633368272.xlsx and /dev/null differ diff --git a/api/public/xmpbox-2.0.24.jar b/api/public/xmpbox-2.0.24.jar deleted file mode 100644 index c31e347b..00000000 Binary files a/api/public/xmpbox-2.0.24.jar and /dev/null differ diff --git a/api/resources/js/app.js b/api/resources/js/app.js deleted file mode 100644 index 40c55f65..00000000 --- a/api/resources/js/app.js +++ /dev/null @@ -1 +0,0 @@ -require('./bootstrap'); diff --git a/api/resources/js/bootstrap.js b/api/resources/js/bootstrap.js deleted file mode 100644 index 69225776..00000000 --- a/api/resources/js/bootstrap.js +++ /dev/null @@ -1,28 +0,0 @@ -window._ = require('lodash'); - -/** - * We'll load the axios HTTP library which allows us to easily issue requests - * to our Laravel back-end. This library automatically handles sending the - * CSRF token as a header based on the value of the "XSRF" token cookie. - */ - -window.axios = require('axios'); - -window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; - -/** - * Echo exposes an expressive API for subscribing to channels and listening - * for events that are broadcast by Laravel. Echo and event broadcasting - * allows your team to easily build robust real-time web applications. - */ - -// import Echo from 'laravel-echo'; - -// window.Pusher = require('pusher-js'); - -// window.Echo = new Echo({ -// broadcaster: 'pusher', -// key: process.env.MIX_PUSHER_APP_KEY, -// cluster: process.env.MIX_PUSHER_APP_CLUSTER, -// forceTLS: true -// }); diff --git a/api/resources/lang/en/passwords.php b/api/resources/lang/en/passwords.php deleted file mode 100644 index 724de4b9..00000000 --- a/api/resources/lang/en/passwords.php +++ /dev/null @@ -1,22 +0,0 @@ - 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', - 'throttled' => 'Please wait before retrying.', - 'token' => 'This password reset token is invalid.', - 'user' => "We can't find a user with that e-mail address.", - -]; diff --git a/api/resources/lang/en/validation.php b/api/resources/lang/en/validation.php deleted file mode 100644 index a65914f9..00000000 --- a/api/resources/lang/en/validation.php +++ /dev/null @@ -1,151 +0,0 @@ - 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, dashes and underscores.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', - 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', - ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_equals' => 'The :attribute must be a date equal to :date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'ends_with' => 'The :attribute must end with one of the following: :values.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field must have a value.', - 'gt' => [ - 'numeric' => 'The :attribute must be greater than :value.', - 'file' => 'The :attribute must be greater than :value kilobytes.', - 'string' => 'The :attribute must be greater than :value characters.', - 'array' => 'The :attribute must have more than :value items.', - ], - 'gte' => [ - 'numeric' => 'The :attribute must be greater than or equal :value.', - 'file' => 'The :attribute must be greater than or equal :value kilobytes.', - 'string' => 'The :attribute must be greater than or equal :value characters.', - 'array' => 'The :attribute must have :value items or more.', - ], - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'ipv4' => 'The :attribute must be a valid IPv4 address.', - 'ipv6' => 'The :attribute must be a valid IPv6 address.', - 'json' => 'The :attribute must be a valid JSON string.', - 'lt' => [ - 'numeric' => 'The :attribute must be less than :value.', - 'file' => 'The :attribute must be less than :value kilobytes.', - 'string' => 'The :attribute must be less than :value characters.', - 'array' => 'The :attribute must have less than :value items.', - ], - 'lte' => [ - 'numeric' => 'The :attribute must be less than or equal :value.', - 'file' => 'The :attribute must be less than or equal :value kilobytes.', - 'string' => 'The :attribute must be less than or equal :value characters.', - 'array' => 'The :attribute must not have more than :value items.', - ], - 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', - ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', - 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', - ], - 'not_in' => 'The selected :attribute is invalid.', - 'not_regex' => 'The :attribute format is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'password' => 'The password is incorrect.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values are present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', - 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', - ], - 'starts_with' => 'The :attribute must start with one of the following: :values.', - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', - 'uuid' => 'The :attribute must be a valid UUID.', - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute.rule" to name the lines. This makes it quick to - | specify a specific custom language line for a given attribute rule. - | - */ - - 'custom' => [ - 'attribute-name' => [ - 'rule-name' => 'custom-message', - ], - ], - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap our attribute placeholder - | with something more reader friendly such as "E-Mail Address" instead - | of "email". This simply helps us make our message more expressive. - | - */ - - 'attributes' => [], - -]; diff --git a/api/resources/sass/app.scss b/api/resources/sass/app.scss deleted file mode 100644 index 8337712e..00000000 --- a/api/resources/sass/app.scss +++ /dev/null @@ -1 +0,0 @@ -// diff --git a/api/routes/api.php b/api/routes/api.php deleted file mode 100644 index 33603d7e..00000000 --- a/api/routes/api.php +++ /dev/null @@ -1,139 +0,0 @@ - 'admin', 'namespace' => 'Admin'], function(){ - // 不需要登陆 - Route::post('login', 'LoginController@login')->name('admin.login'); - Route::post('login/phone', 'LoginController@loginByPhone')->name('login.phone'); // 手机登陆 - Route::post('logout', 'LoginController@logout')->name('admin.logout'); - Route::post('refresh', 'LoginController@refresh')->name('admin.refresh'); - Route::post('cp', 'LoginController@captcha')->name('admin.captcha'); // 验证码 - Route::get('test', 'LoginController@test')->name('admin.test'); - Route::post('sms/send', 'SmsController@send_code')->name('sms.send_code'); - Route::post('sms/verify', 'SmsController@verify_code')->name('sms.verify_code'); - Route::get('oauth/github', 'OauthController@getUserInfoByGithub')->name('oauth.github'); - Route::get('login/github', 'OauthController@redirectToProvider')->name('login.github'); - Route::get('login/gitee', 'OauthController@redirectToGitee')->name('login.gitee'); - Route::get('oauth/gitee', 'OauthController@getUserInfoByGitee')->name('login.gitee'); - Route::get('oauth/test1', 'OauthController@test1')->name('login.test1'); - Route::get('oauth/test2', 'OauthController@test2')->name('login.test2'); - Route::post('user/bind', "LoginController@bind")->name('login.bind'); - -}); -// 需要登录,但不需要角色认证的接口,只要登录都可以调用的接口 -Route::middleware(['auth:admin'])->prefix('admin')->namespace('Admin')->group(function(){ - Route::get('tables/list', 'TableController@getAllTable')->name("tables.list"); - Route::get('table_configs/columns', 'TableConfigController@getColumnByTable')->name("tables.column"); - // 客服功能 - Route::post('services/check','ServiceController@check')->name("services.check"); - Route::post('services/register','ServiceController@register')->name("services.register"); - Route::post('services/un_register','ServiceController@unRegister')->name("services.un_register"); - Route::get('services/customer', 'ServiceController@customer')->name("services.customer"); - Route::post('services/user_leave', 'ServiceController@leave')->name("services.leave"); - Route::post('services/send_data_to_customer', 'ServiceController@sendDataToCustomer')->name("services.send_data_to_customer"); - Route::post('services/send_data_to_user', 'ServiceController@sendDataToUser')->name("services.send_data_to_user"); - // 聊天室 - // 进入聊天室进行注册 - Route::post("chats/register", "ChatController@register")->name("chat.register"); - // 退出聊天室,广播到全部 - Route::post("chats/un_register", "ChatController@unRegister")->name("chat.un_register"); - // 用户发送信息到用户 - Route::post("chats/send_data_to_user", "ChatController@sendDataToUser")->name("chat.send_data_to_user"); - -}); - - -Route::middleware(['auth:admin', 'role'])->prefix('admin')->namespace('Admin')->group(function(){ -// 需要登陆 - Route::get('me', 'LoginController@me')->name('admins.me'); - // 模块和权限管理 - Route::apiResource('modules', 'ModuleController'); - // 角色管理 - Route::apiResource('roles', 'RoleController'); - // 管理员管理 - Route::post('admins/export', "AdminController@export")->name("admins.export"); - Route::post('admins/import', "AdminController@import")->name("admins.import"); - Route::post('admins/modify', "AdminController@modify")->name("admins.modify"); - Route::apiResource('admins', 'AdminController'); - // 数据图像等上传接口 - Route::post('medias', "MediaController@store")->name("medias.store"); - // 微信的配置 - Route::apiResource('wechat', "WechatController", [ - 'only' => ['index', "update"] - ]); - // 文章管理 - Route::apiResource('article_categories', 'ArticleCategoryController'); - Route::apiResource('articles', 'ArticleController'); - // 轮播图 - Route::apiResource('carousels', 'CarouselController'); - - - // 系统工具 代码生成 - Route::post('tables/export', 'TableController@download')->name("tables.export"); - Route::apiResource('tables', 'TableController'); - Route::apiResource('codes', 'CodeController'); - Route::apiResource('code_configs', 'CodeConfigController'); - Route::apiResource('code_snippets', 'CodeSnippetController'); - // 应用程序的业务接口 - -}); - - -// 微信小程序登陆 -Route::group(['prefix' => '/mp', 'namespace' => 'MP'], function () { - Route::post('/user/code', 'LoginController@getCode'); // 获得code, 用于之后的信息解码 - Route::post('/user/info', 'LoginController@getInfo'); // 获得解码后的个人信息 - Route::post('/user/store', 'LoginController@saveUserInfo'); // 从前端保存个人信息 - Route::post('/user/phone', 'LoginController@getPhone'); // 获得手机号码 -}); - - -Route::middleware(['mp'])->prefix('mp')->namespace('MP')->group(function(){ -// api/admin api/mp - -}); - - -// 微信公众号相关接口 -Route::group(['prefix' => '/wx', 'namespace' => 'Wx'], function () { -Route::any('wechat', 'WxController@serve'); // 公众号入口 -Route::post('getId', 'WxController@getOpenId'); -Route::get('menu', 'WxController@createMenu'); // 生成菜单 -Route::get('customMenu', 'WxController@customMenu'); // 生成自定义菜单 - - -// 支付情况 -Route::post('pay_callback', 'WxController@pay_callback'); -Route::get('pay', 'WxController@pay'); -Route::get('spa-pay', 'WxController@spaPay'); - -// SPA网页授权 -Route::get('/start_oauth', 'WxController@start_oauth'); -Route::get('/oauth', 'WxController@oauth'); -// SPA中的jssdk -Route::post('/jssdk/config', 'WxController@config'); -}); -Route::middleware(['auth:admin','role'])->prefix('admin')->namespace('Admin')->group(function(){ - Route::apiResource('wechats', 'WechatController'); -}); -Route::middleware(['auth:admin','role'])->prefix('admin')->namespace('Admin')->group(function(){ - Route::apiResource('table_configs', 'TableConfigController'); -}); -Route::middleware(['auth:admin','role'])->prefix('admin')->namespace('Admin')->group(function(){ - Route::apiResource('wechats', 'WechatController'); -}); diff --git a/api/routes/channels.php b/api/routes/channels.php deleted file mode 100644 index 0ccbb909..00000000 --- a/api/routes/channels.php +++ /dev/null @@ -1,30 +0,0 @@ -id === (int) $id; -}); - -Broadcast::channel('leave.{email}', function ($user, $email) { - return $user->email === $email; - // return true; -}, ['guards' => ['api']]); - -Broadcast::channel('chat', function($user){ - return $user->email; -}, ['guards' => ['api']]); - -Broadcast::channel('kefu', function($user){ -// return $user->name; - return $user->email; -}, ['guards' => ['api']]); diff --git a/api/routes/web.php b/api/routes/web.php deleted file mode 100644 index 810aa349..00000000 --- a/api/routes/web.php +++ /dev/null @@ -1,16 +0,0 @@ -get('/'); - - $response->assertStatus(200); - } -} diff --git a/api/tests/Unit/ExampleTest.php b/api/tests/Unit/ExampleTest.php deleted file mode 100644 index 358cfc88..00000000 --- a/api/tests/Unit/ExampleTest.php +++ /dev/null @@ -1,18 +0,0 @@ -assertTrue(true); - } -} diff --git a/api/tools/clone.js b/api/tools/clone.js deleted file mode 100644 index 5cc008cc..00000000 --- a/api/tools/clone.js +++ /dev/null @@ -1,99 +0,0 @@ -let fs = require('fs') -const readline = require("readline"); -let temp = require('./template').temp; -const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout -}); - -// 执行命令 -let command = require('./cmd'); -const question = rlPromisify(rl.question.bind(rl)); -(async () => { - let path = await question("请输入模型所在的目录(app下 默认为Models):"); - if (path.length===0) { - path = 'Models' - } - // 如果首字符不大写 要重新输入 空内容 重新输入 - let moduleName =''; - do { - moduleName = await question("请输入模型名称(首字母大写):"); - } while (! moduleName || (moduleName.charAt(0)>'Z' || moduleName.charAt(0) <'A')); - - let routerName =''; - do { - routerName = await question("请输入路由名称(建议小写、复数):"); - } while (! moduleName); - rl.close(); - // 生成模型和迁移表 - let cmd = `php artisan make:model ${path}\\${moduleName} -m` - command(cmd).then(()=> { - let modelFile = `app/${path}/${moduleName}.php` - let templateFile = `app/${path}/Template.php` - let result = fs.readFileSync(templateFile).toString() - let code = result.replace('##name##', moduleName) - if (fs.existsSync(modelFile)) { - fs.unlinkSync(modelFile); - } - fs.writeFileSync(modelFile, code) - - // 根据模型来创建API资源 - modelFile = `app/http/Resources/${moduleName}.php` - templateFile = `app/http/Resources/Template.php` - result = fs.readFileSync(templateFile).toString() - code = result.replace('##name##', moduleName) - fs.writeFileSync(modelFile, code) - - // 根据模型来创建API资源集合 - modelFile = `app/http/Resources/${moduleName}Collection.php` - templateFile = `app/http/Resources/TemplateCollection.php` - result = fs.readFileSync(templateFile).toString() - code = result.replace('##name##', moduleName) - fs.writeFileSync(modelFile, code) - console.log('API资源创建完成') - //根据模板来生成资源控制器 - - modelFile = `app/http/Controllers/Admin/${moduleName}Controller.php` - templateFile = `app/http/Controllers/Admin/Template.php` - result = fs.readFileSync(templateFile).toString() - code = result.replace(/##name##/g, moduleName) - fs.writeFileSync(modelFile, code) - console.log('API资源控制器创建完成') - - code = temp.route - code = code.replace('##routeName##', routerName) - code = code.replace('##name##', moduleName) - fs.appendFile("routes/api.php",code , (error) => { - if (error) return console.log("追加文件失败" + error.message); - console.log("路由添加成功"); - }); - }) -})(); - - - - -// 删除文件夹以及下面的内容 -function deleteall(path) { - var files = []; - if(fs.existsSync(path)) { - files = fs.readdirSync(path); - files.forEach(function(file, index) { - var curPath = path + "/" + file; - if(fs.statSync(curPath).isDirectory()) { // recurse - deleteall(curPath); - } else { // delete file - fs.unlinkSync(curPath); - } - }); - fs.rmdirSync(path); - } -}; - - - -function rlPromisify(fn) { - return async (...args) => { - return new Promise(resolve => fn(...args, resolve)); - }; -} diff --git a/api/tools/cmd.js b/api/tools/cmd.js deleted file mode 100644 index 0aff413b..00000000 --- a/api/tools/cmd.js +++ /dev/null @@ -1,24 +0,0 @@ -"use strict"; - -var exec = require("child_process").exec; - -module.exports = function myTest(cmd) { - - return new Promise(function(resolve, reject) { - - // var cmd = "ipconfig"; - exec(cmd,{ - maxBuffer: 1024 * 2000 - }, function(err, stdout, stderr) { - if (err) { - console.log(err); - reject(err); - } else if (stderr.lenght > 0) { - reject(new Error(stderr.toString())); - } else { - console.log(stdout); - resolve(); - } - }); - }); -}; diff --git a/api/tools/template.js b/api/tools/template.js deleted file mode 100644 index ce021b8d..00000000 --- a/api/tools/template.js +++ /dev/null @@ -1,8 +0,0 @@ -// 模板部分内容 -var temp = { - // 内容追加后下起一行 - route: `Route::middleware(['auth:admin','role'])->prefix('admin')->namespace('Admin')->group(function(){ - Route::apiResource('##routeName##', '##name##Controller'); - });` -} -exports.temp = temp diff --git a/api/tools/test.js b/api/tools/test.js deleted file mode 100644 index 1d0473ca..00000000 --- a/api/tools/test.js +++ /dev/null @@ -1,26 +0,0 @@ - -// var readlineSync = require('readline-sync'); -// -// // Wait for user's response. -// var userName = readlineSync.question('请输入模型路径? '); -// console.log('Hi ' + userName + '!'); - - -const readline = require("readline"); - -const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout -}); - -function rlPromisify(fn) { - return async (...args) => { - return new Promise(resolve => fn(...args, resolve)); - }; -} -const question = rlPromisify(rl.question.bind(rl)); -(async () => { - const answer = await question("你好,你是谁:"); - console.log(`你是:${answer}`); - rl.close(); -})(); diff --git a/api/webpack.mix.js b/api/webpack.mix.js deleted file mode 100644 index 8a923cbb..00000000 --- a/api/webpack.mix.js +++ /dev/null @@ -1,15 +0,0 @@ -const mix = require('laravel-mix'); - -/* - |-------------------------------------------------------------------------- - | Mix Asset Management - |-------------------------------------------------------------------------- - | - | Mix provides a clean, fluent API for defining some Webpack build steps - | for your Laravel application. By default, we are compiling the Sass - | file for the application as well as bundling up all the JS files. - | - */ - -mix.js('resources/js/app.js', 'public/js') - .sass('resources/sass/app.scss', 'public/css'); diff --git a/back.md b/back.md index 1453d376..1a79b491 100644 --- a/back.md +++ b/back.md @@ -1,81 +1,66 @@ -## 1. apache的配置 -~~~ - - # 本地目录,注意到后端项目的public目录 - DocumentRoot "D:/laravel_template_with_vue/api/public/" - # 域名 - ServerName api.temp.test - ServerAlias api.temp.test - Header set Access-Control-Allow-Origin * - Header set Access-Control-Allow-Credentials false - Header set Access-Control-Allow-Headers * - Header set Access-Control-Allow-Methods * - # 本地目录 - - AllowOverride All - Require all granted - - -~~~ - - -## 2. 在后端目录下,安装依赖 -~~~ -composer install -~~~ - -## 3. 新建数据库 -> 数据库中的字符集为utfmb8--UTF-8 Unicode , 排序规则为utf8mb4_unicode_ci - -## 4. 复制配置文件,生成项目密匙 - -~~~php -cp .env.example .env -php artisan key:generate -~~~ - - -## 5. 项目配置(数据库和域名配置) -> .env文件中的APP_URL为后端域名,以http或者https开头 -> -> 配置.env文件中的DB_DATABASE、DB_USERNAME和DB_PASSWORD 设置数据库 -> - -## 6. 生成项目所需的数据表 - -~~~php -php artisan migrate -~~~ - -## 7. 生成用户数据和各种结构数据 - -> 用户名/密码: admin/123456 - -~~~php -php artisan db:seed -~~~ - - -## 8. 使用OAuth认证,生成passport的密钥 -~~~php -php artisan passport:keys -php artisan passport:client --password -~~~ - -> 生成的密匙填写到.env文件中的OAuth认证这一块的PASSPORT_CLIENT_ID和PASSPORT_CLIENT_SECRET的参数 - -## 9. 建立图像软连接 -> linux上要设置相关目录的权限为777 public目录和storage目录 -~~~ -php artisan storage:link -~~~ - -## 10.配置自动生成代码 -> 修改后端目录(api)下的config目录中的database.php, 修改'super'关联数组中的'password'选项,设置mysql数据库中root用户名的密码,其余不变 -> 注意:只能使用root用户 -~~~ - 'username' => 'root', - 'password' => 'abc@123456', -~~~ - - +## 1、安装依赖 +`composer install` + +## 2、复制配置文件,进行数据库配置 +`cp .env.example .env` + +## 3、生成项目所需的数据表 +`php artisan migrate` + +## 4、使用OAuth认证,生成passport的密钥 +`php artisan passport:key --force` + +`php artisan passport:install --force` + +## 5、复制第4步生成的密钥到.env文件中,填写为PERSONAL_CLIENT_SECRET和PASSPORT_CLIENT_SECRET的参数 +PERSONAL_CLIENT_ID=1 + +PERSONAL_CLIENT_SECRET= + +PASSPORT_CLIENT_ID=2 + +PASSPORT_CLIENT_SECRET= + +## 6、生成用户数据和各种结构数据 +`php artisan db:seed` + +用户名和密码在database\seeds\UsersTableSeeder.php文件中明文标记 + +## 7、配置域名(back.test 或者其他名称)指向后端目录下的public目录(backend/public/),并在本地hosts文件中添加记录 +`127.0.0.1 back.test` + +**此步骤是OAuth认证所必须,请务必设置,否则无法登录** + +## 8、第三方登录 +>此步骤配置较复杂 由于需要认证的关系 暂时只有提供github的第三方登录配置 +> 其它类似 更多的配置 可以通过qq群来讨论 此步骤只影响第三方登录 +> 不影响其它功能使用 不配置则只是无法使用第三方登录 + +1. 配置文件修改BROADCAST_DRIVER为pusher +~~~ +BROADCAST_DRIVER=pusher +~~~ +2. 去[Pusher官网](https://pusher.com/)注册应用程序,然后填写下列信息 +~~~ +PUSHER_APP_ID= +PUSHER_APP_KEY= +PUSHER_APP_SECRET= +PUSHER_APP_CLUSTER= +~~~ +3. 修改前端frontend目录下的config文件夹下的prod.env.js文件内容 +~~~ +MIX_PUSHER_APP_KEY: '"XXXXXXXXX"', // 后端PUSHER_APP_KEY +MIX_PUSHER_APP_CLUSTER: '"ap1"', // 后端PUSHER_APP_CLUSTER +~~~ +4. 编译前端 +~~~ +npm run build +~~~ + +## 查看API文档地址 + 假设后端的域名为back.test 则文档地址为http://back.test/apidoc/ + +## 编译API文档 + 由于文档使用了apidoc 请使用前预先安装apidoc + + 编译命令为apidoc -i ./ -o public/apidoc/ diff --git a/backend/.env.example b/backend/.env.example new file mode 100644 index 00000000..3a6fff42 --- /dev/null +++ b/backend/.env.example @@ -0,0 +1,44 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY=base64:evzA0zJuKuVxjmXcrNbxslFMUoE5m+M7IAhIVw2X0Z8= +APP_DEBUG=true +APP_LOG_LEVEL=debug +APP_URL=http://localhost + +DB_CONNECTION=mysql +DB_HOST=localhost +DB_PORT=3306 +DB_DATABASE=laravel +DB_USERNAME=root +DB_PASSWORD= + +BROADCAST_DRIVER=log +CACHE_DRIVER=file +SESSION_DRIVER=file +QUEUE_DRIVER=sync + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_DRIVER=smtp +MAIL_HOST=smtp.mailtrap.io +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null + +PUSHER_APP_ID= +PUSHER_APP_KEY= +PUSHER_APP_SECRET= +PUSHER_APP_CLUSTER= + +PERSONAL_CLIENT_ID=1 +PERSONAL_CLIENT_SECRET= + +PASSPORT_CLIENT_ID=2 +PASSPORT_CLIENT_SECRET= + +// 短信集成 +SMS_GATEWAY_TYPE=null +SMS_APP_KEY=null diff --git a/api/.gitattributes b/backend/.gitattributes similarity index 100% rename from api/.gitattributes rename to backend/.gitattributes diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 00000000..51c94a81 --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,17 @@ +/node_modules +/public/hot +/public/storage +/storage/*.key +/vendor +/.idea +/.vagrant +Homestead.json +Homestead.yaml +npm-debug.log +yarn-error.log +.env +.idea +_ide_helper.php +_ide_helper_models.php +.phpstorm.meta.php + diff --git a/backend/3.txt b/backend/3.txt new file mode 100644 index 00000000..de95f95f --- /dev/null +++ b/backend/3.txt @@ -0,0 +1,68 @@ ++--------+-----------+-----------------------------------------+--------------------------------+----------------------------------------------------------------------------+--------------+ +| Domain | Method | URI | Name | Action | Middleware | ++--------+-----------+-----------------------------------------+--------------------------------+----------------------------------------------------------------------------+--------------+ +| | GET|HEAD | / | | Closure | web | +| | POST | api/admin | admin.store | App\Http\Controllers\UserController@store | api,auth:api | +| | GET|HEAD | api/admin | admin.index | App\Http\Controllers\UserController@index | api,auth:api | +| | POST | api/admin/deleteAll | admin.deleteAll | App\Http\Controllers\UserController@deleteAll | api,auth:api | +| | POST | api/admin/export | admin.export | App\Http\Controllers\UserController@export | api,auth:api | +| | POST | api/admin/exportAll | admin.exportAll | App\Http\Controllers\UserController@exportAll | api,auth:api | +| | POST | api/admin/modify | admin.modify | App\Http\Controllers\UserController@modify | api,auth:api | +| | POST | api/admin/upload | admin.upload | App\Http\Controllers\UserController@upload | api,auth:api | +| | POST | api/admin/uploadAvatar | admin.uploadAvatar | App\Http\Controllers\UserController@uploadAvatar | api,auth:api | +| | GET|HEAD | api/admin/{admin} | admin.show | App\Http\Controllers\UserController@show | api,auth:api | +| | DELETE | api/admin/{admin} | admin.destroy | App\Http\Controllers\UserController@destroy | api,auth:api | +| | PUT|PATCH | api/admin/{admin} | admin.update | App\Http\Controllers\UserController@update | api,auth:api | +| | POST | api/admin/{id}/reset | admin.reset | App\Http\Controllers\UserController@reset | api,auth:api | +| | GET|HEAD | api/getClassNumByGrade | session.getClassNum | App\Http\Controllers\SessionController@getClassNumByGrade | api,auth:api | +| | GET|HEAD | api/getDefaultSession | session.getDefault | App\Http\Controllers\SessionController@getDefaultSession | api,auth:api | +| | GET|HEAD | api/getRoles | role.get | App\Http\Controllers\RoleController@getRoles | api,auth:api | +| | GET|HEAD | api/getSession | session.get | App\Http\Controllers\SessionController@getSession | api,auth:api | +| | POST | api/login | login.login | App\Http\Controllers\Auth\LoginController@login | api,guest | +| | POST | api/logout | login.logout | App\Http\Controllers\Auth\LoginController@logout | api | +| | GET|HEAD | api/permissions | permissions.index | App\Http\Controllers\PermissionController@index | api,auth:api | +| | POST | api/permissions | permissions.store | App\Http\Controllers\PermissionController@store | api,auth:api | +| | POST | api/permissions/addGroup | permissions.addGroup | App\Http\Controllers\PermissionController@addGroup | api,auth:api | +| | POST | api/permissions/deleteAll | permissions.deleteAll | App\Http\Controllers\PermissionController@deleteAll | api,auth:api | +| | POST | api/permissions/getGroup | permissions.getGroup | App\Http\Controllers\PermissionController@getGroup | api,auth:api | +| | POST | api/permissions/getPermissionByTree | Permission.getPermissionByTree | App\Http\Controllers\PermissionController@getPermissionByTree | api,auth:api | +| | DELETE | api/permissions/{permission} | permissions.destroy | App\Http\Controllers\PermissionController@destroy | api,auth:api | +| | PUT|PATCH | api/permissions/{permission} | permissions.update | App\Http\Controllers\PermissionController@update | api,auth:api | +| | GET|HEAD | api/permissions/{permission} | permissions.show | App\Http\Controllers\PermissionController@show | api,auth:api | +| | POST | api/role | role.store | App\Http\Controllers\RoleController@store | api,auth:api | +| | GET|HEAD | api/role | role.index | App\Http\Controllers\RoleController@index | api,auth:api | +| | GET|HEAD | api/role/{role} | role.show | App\Http\Controllers\RoleController@show | api,auth:api | +| | PUT|PATCH | api/role/{role} | role.update | App\Http\Controllers\RoleController@update | api,auth:api | +| | DELETE | api/role/{role} | role.destroy | App\Http\Controllers\RoleController@destroy | api,auth:api | +| | GET|HEAD | api/session | session.index | App\Http\Controllers\SessionController@index | api,auth:api | +| | POST | api/session | session.store | App\Http\Controllers\SessionController@store | api,auth:api | +| | POST | api/session/upload | session.upload | App\Http\Controllers\SessionController@upload | api,auth:api | +| | DELETE | api/session/{session} | session.destroy | App\Http\Controllers\SessionController@destroy | api,auth:api | +| | PUT|PATCH | api/session/{session} | session.update | App\Http\Controllers\SessionController@update | api,auth:api | +| | GET|HEAD | api/session/{session} | session.show | App\Http\Controllers\SessionController@show | api,auth:api | +| | POST | api/sms/send | sms.send | App\Http\Controllers\SmsController@send | api,auth:api | +| | POST | api/sms/verify | sms.verify | App\Http\Controllers\SmsController@verify | api,auth:api | +| | GET|HEAD | api/students | students.index | App\Http\Controllers\StudentController@index | api,auth:api | +| | POST | api/students | students.store | App\Http\Controllers\StudentController@store | api,auth:api | +| | GET|HEAD | api/students/{student} | students.show | App\Http\Controllers\StudentController@show | api,auth:api | +| | PUT|PATCH | api/students/{student} | students.update | App\Http\Controllers\StudentController@update | api,auth:api | +| | DELETE | api/students/{student} | students.destroy | App\Http\Controllers\StudentController@destroy | api,auth:api | +| | POST | api/test | soft.test | App\Http\Controllers\SmsController@send | api | +| | POST | api/token/refresh | login.refresh | App\Http\Controllers\Auth\LoginController@refresh | api,guest | +| | GET|HEAD | api/user | admin.userInfo | App\Http\Controllers\UserController@getUserInfo | api,auth:api | +| | DELETE | oauth/authorize | | \Laravel\Passport\Http\Controllers\DenyAuthorizationController@deny | web,auth | +| | GET|HEAD | oauth/authorize | | \Laravel\Passport\Http\Controllers\AuthorizationController@authorize | web,auth | +| | POST | oauth/authorize | | \Laravel\Passport\Http\Controllers\ApproveAuthorizationController@approve | web,auth | +| | GET|HEAD | oauth/clients | | \Laravel\Passport\Http\Controllers\ClientController@forUser | web,auth | +| | POST | oauth/clients | | \Laravel\Passport\Http\Controllers\ClientController@store | web,auth | +| | PUT | oauth/clients/{client_id} | | \Laravel\Passport\Http\Controllers\ClientController@update | web,auth | +| | DELETE | oauth/clients/{client_id} | | \Laravel\Passport\Http\Controllers\ClientController@destroy | web,auth | +| | GET|HEAD | oauth/personal-access-tokens | | \Laravel\Passport\Http\Controllers\PersonalAccessTokenController@forUser | web,auth | +| | POST | oauth/personal-access-tokens | | \Laravel\Passport\Http\Controllers\PersonalAccessTokenController@store | web,auth | +| | DELETE | oauth/personal-access-tokens/{token_id} | | \Laravel\Passport\Http\Controllers\PersonalAccessTokenController@destroy | web,auth | +| | GET|HEAD | oauth/scopes | | \Laravel\Passport\Http\Controllers\ScopeController@all | web,auth | +| | POST | oauth/token | | \Laravel\Passport\Http\Controllers\AccessTokenController@issueToken | throttle | +| | POST | oauth/token/refresh | | \Laravel\Passport\Http\Controllers\TransientTokenController@refresh | web,auth | +| | GET|HEAD | oauth/tokens | | \Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@forUser | web,auth | +| | DELETE | oauth/tokens/{token_id} | | \Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@destroy | web,auth | ++--------+-----------+-----------------------------------------+--------------------------------+----------------------------------------------------------------------------+--------------+ diff --git a/backend/apidoc.json b/backend/apidoc.json new file mode 100644 index 00000000..739de9b4 --- /dev/null +++ b/backend/apidoc.json @@ -0,0 +1,7 @@ +{ + "name": "后台管理系统", + "version": "1.0.0", + "description": "通用管理后台 带权限设置", + "title": "通用后台管理系统", + "url" : "" +} \ No newline at end of file diff --git a/api/app/Console/Kernel.php b/backend/app/Console/Kernel.php similarity index 100% rename from api/app/Console/Kernel.php rename to backend/app/Console/Kernel.php diff --git a/backend/app/Events/DataOperation.php b/backend/app/Events/DataOperation.php new file mode 100644 index 00000000..ae5de772 --- /dev/null +++ b/backend/app/Events/DataOperation.php @@ -0,0 +1,38 @@ +info = $info; + } + + /** + * Get the channels the event should broadcast on. + * + * @return \Illuminate\Broadcasting\Channel|array + */ + public function broadcastOn() + { + return new PrivateChannel('channel-name'); + } +} diff --git a/backend/app/Events/Event.php b/backend/app/Events/Event.php new file mode 100644 index 00000000..aa872ece --- /dev/null +++ b/backend/app/Events/Event.php @@ -0,0 +1,36 @@ +user = $user; + $this->dontBroadcastToCurrentUser(); + } + + /** + * Get the channels the event should broadcast on. + * + * @return \Illuminate\Broadcasting\Channel|array + */ + public function broadcastOn() + { + return new Channel('github'); + } +} diff --git a/backend/app/Events/GithubLoginSuccess.php b/backend/app/Events/GithubLoginSuccess.php new file mode 100644 index 00000000..64bbcca9 --- /dev/null +++ b/backend/app/Events/GithubLoginSuccess.php @@ -0,0 +1,38 @@ +data = $data; + } + + /** + * Get the channels the event should broadcast on. + * + * @return \Illuminate\Broadcasting\Channel|array + */ + public function broadcastOn() + { + return new Channel('githubSuccess'); + } +} diff --git a/backend/app/Events/UserLogin.php b/backend/app/Events/UserLogin.php new file mode 100644 index 00000000..1e5d5dbd --- /dev/null +++ b/backend/app/Events/UserLogin.php @@ -0,0 +1,36 @@ +middleware('guest'); + } } diff --git a/backend/app/Http/Controllers/Auth/LoginController.php b/backend/app/Http/Controllers/Auth/LoginController.php new file mode 100644 index 00000000..20457f8e --- /dev/null +++ b/backend/app/Http/Controllers/Auth/LoginController.php @@ -0,0 +1,120 @@ +middleware('guest')->except('logout'); + $this->proxy = $proxy; + } + + /** + * @api {post} /api/login 用户登陆 + * @apiGroup login + * + * @apiParam {string} email 用户email + * @apiParam {string} password 用户密码 + * + * @apiSuccessExample 登陆成功 + * HTTP/1.1 200 OK + * { + * "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJS", + * "expires_in": 900 // 过期时间 + * } + * + * @apiErrorExample 用户身份验证失败 + * HTTP/1.1 421 用户名或者密码输入错误 + * { + * "status": "login error", + * "status_code": 421, + * "message": "Credentials not match" + * } + */ + + public function login() + { + //$this->validateLogin(request()); + return $this->proxy->login(request('email'),request('password')); + } + public function loginWithThree() + { + //$this->validateLogin(request()); + return $this->proxy->loginWithThree(request('email'),request('password'), request('platformId'), request('provider')); + } + + /** + * @api {post} /api/logout 注销用户登陆 + * @apiGroup login + * + * + * @apiSuccessExample 注销成功 + * HTTP/1.1 200 OK + * { + * "status": "success", + * "status_code": 200, + * "message": "logout success" + * } + * + */ + public function logout() + { + return $this->proxy->logout(); + } + /** + * @api {post} /api/token/refresh Token刷新 + * @apiGroup login + * + * + * @apiSuccessExample 刷新成功 + * HTTP/1.1 200 OK + * { + * "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJS", + * "expires_in": 900 // 过期时间 + * } + * + * @apiErrorExample 刷新失败 + * HTTP/1.1 401 未认证 + * { + * "status": "login error", + * "status_code": 401, + * "message": "Credentials not match" + * } + */ + public function refresh() + { + return $this->proxy->refresh(); + } +} \ No newline at end of file diff --git a/api/app/Http/Controllers/Auth/RegisterController.php b/backend/app/Http/Controllers/Auth/RegisterController.php similarity index 77% rename from api/app/Http/Controllers/Auth/RegisterController.php rename to backend/app/Http/Controllers/Auth/RegisterController.php index c6a6de67..c72dc570 100644 --- a/api/app/Http/Controllers/Auth/RegisterController.php +++ b/backend/app/Http/Controllers/Auth/RegisterController.php @@ -2,12 +2,10 @@ namespace App\Http\Controllers\Auth; +use App\Models\User; use App\Http\Controllers\Controller; -use App\Providers\RouteServiceProvider; -use App\User; -use Illuminate\Foundation\Auth\RegistersUsers; -use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; +use Illuminate\Foundation\Auth\RegistersUsers; class RegisterController extends Controller { @@ -29,7 +27,7 @@ class RegisterController extends Controller * * @var string */ - protected $redirectTo = RouteServiceProvider::HOME; + protected $redirectTo = '/home'; /** * Create a new controller instance. @@ -50,9 +48,9 @@ public function __construct() protected function validator(array $data) { return Validator::make($data, [ - 'name' => ['required', 'string', 'max:255'], - 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], - 'password' => ['required', 'string', 'min:8', 'confirmed'], + 'name' => 'required|string|max:255', + 'email' => 'required|string|email|max:255|unique:users', + 'password' => 'required|string|min:6|confirmed', ]); } @@ -60,14 +58,14 @@ protected function validator(array $data) * Create a new user instance after a valid registration. * * @param array $data - * @return \App\User + * @return \App\Models\User */ protected function create(array $data) { return User::create([ 'name' => $data['name'], 'email' => $data['email'], - 'password' => Hash::make($data['password']), + 'password' => bcrypt($data['password']), ]); } } diff --git a/api/app/Http/Controllers/Auth/ResetPasswordController.php b/backend/app/Http/Controllers/Auth/ResetPasswordController.php similarity index 78% rename from api/app/Http/Controllers/Auth/ResetPasswordController.php rename to backend/app/Http/Controllers/Auth/ResetPasswordController.php index b1726a36..cf726eec 100644 --- a/api/app/Http/Controllers/Auth/ResetPasswordController.php +++ b/backend/app/Http/Controllers/Auth/ResetPasswordController.php @@ -3,7 +3,6 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; -use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Auth\ResetsPasswords; class ResetPasswordController extends Controller @@ -26,5 +25,15 @@ class ResetPasswordController extends Controller * * @var string */ - protected $redirectTo = RouteServiceProvider::HOME; + protected $redirectTo = '/home'; + + /** + * Create a new controller instance. + * + * @return void + */ + public function __construct() + { + $this->middleware('guest'); + } } diff --git a/backend/app/Http/Controllers/AuthController.php b/backend/app/Http/Controllers/AuthController.php new file mode 100644 index 00000000..d39aa95a --- /dev/null +++ b/backend/app/Http/Controllers/AuthController.php @@ -0,0 +1,61 @@ +session()->put('uuid', $request->input('time')) ; + return Socialite::driver('github')->redirect(); + } + + /** + * Obtain the user information from GitHub. + * + * @return Response + */ + public function handleProviderCallback() + { + $user = Socialite::driver('github')->user()->toArray(); + $provider = $user['provider']; + $id = $user['id']; + // 查询返回的结果 + if (ThreeLogin::where('provider', $provider)->where('platform_id', $id)->first()){ + // 找到后登录 + $admin = ThreeLogin::where('provider', $provider)->where('platform_id', $id)->first(); + $admin = $admin->toArray(); + $id = $admin['user_id']; + // 自动登录 + $userInstance = User::where('id', $id)->firstOrFail(); + Auth::login($userInstance); + + $token = $userInstance->createToken('token')->accessToken; + event(new UserLogin()); + // 得到$token + $data['time'] = session('uuid') ; + $data['token'] = $token; + event(new \App\Events\GithubLoginSuccess($data)); + } else { + // 没有找到 + + $user['time'] = session('uuid') ; + event(new \App\Events\GithubLogin($user)); + } + + // $user->token; + } +} diff --git a/backend/app/Http/Controllers/Controller.php b/backend/app/Http/Controllers/Controller.php new file mode 100644 index 00000000..98db3312 --- /dev/null +++ b/backend/app/Http/Controllers/Controller.php @@ -0,0 +1,70 @@ +deleteByIds($request); + $model = $this->getModel(); + if ($model::destroy($data['ids'])) { + return $this->success(); + } else { + return $this->error(); + } + } + + // 导出所有的内容 + public function exportAll() { + + $this->exportHandle(null, 1); + } + + // 导出当前指定的页 + public function export() + { + $request = request(); + $pageSize = (int)$request->input('pageSize'); + $pageSize = isset($pageSize) && $pageSize? $pageSize: 10; + $page = (int)$request->input('page'); + $page = isset($page) && $page ? $page: 1; + $this->exportHandle($pageSize, $page); + } + + public function exportHandle($pageSize, $page) + { + // 处理流程,模板方法 + // 1、找出指定的数据 + $lists = $this->queryData($pageSize, $page); + $data = $lists->toArray(); // 分页内容 + // 内部逻辑处理, 生成表头或者对应的去找关联数据 + $items = $this->generatorData($data); + // 最后生成电子表格 + $this->generatorXls($items); + } + + /** + * 生成xls文件 + */ + public function generatorXls($items) + { + $file = $this->getExportFile(); + Excel::create($file, function ($excel) use ($items) { + $excel->sheet('score', function ($sheet) use ($items) { + $sheet->rows($items); + }); + })->store('xls', public_path('xls')); + } + +} diff --git a/backend/app/Http/Controllers/Import/SessionImport.php b/backend/app/Http/Controllers/Import/SessionImport.php new file mode 100644 index 00000000..95f1dd37 --- /dev/null +++ b/backend/app/Http/Controllers/Import/SessionImport.php @@ -0,0 +1,26 @@ +fileUpdate(); + } + + public function getFilters() + { + return [ + 'chunk' + ]; + } + +} diff --git a/backend/app/Http/Controllers/Import/SessionImportHandler.php b/backend/app/Http/Controllers/Import/SessionImportHandler.php new file mode 100644 index 00000000..3435233e --- /dev/null +++ b/backend/app/Http/Controllers/Import/SessionImportHandler.php @@ -0,0 +1,40 @@ +first()->toArray(); + $lists = []; + foreach ($result as $v){ + $data = [ + 'year' => (int)$v['year'], + 'team' =>(int)$v['team'], + 'remark' =>$v['remark'], + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now() + + ]; + if (Session::where('year', $data['year'])->where('team', $data['team'])->first()){ // 存在重复记录 + continue; + } else { // 记录先暂时保存到数组,稍后一次新建 + array_push($lists,$data); + } + } + return Session::insert($lists); + } + +} \ No newline at end of file diff --git a/backend/app/Http/Controllers/Import/StudentImport.php b/backend/app/Http/Controllers/Import/StudentImport.php new file mode 100644 index 00000000..13790844 --- /dev/null +++ b/backend/app/Http/Controllers/Import/StudentImport.php @@ -0,0 +1,23 @@ +fileUpdate(); + return $fileName; + } + + public function getFilters() + { + return [ + 'chunk' + ]; + } +} diff --git a/backend/app/Http/Controllers/Import/StudentImportHandler.php b/backend/app/Http/Controllers/Import/StudentImportHandler.php new file mode 100644 index 00000000..e5ba3ab7 --- /dev/null +++ b/backend/app/Http/Controllers/Import/StudentImportHandler.php @@ -0,0 +1,41 @@ +first()->toArray(); + $lists = []; + foreach ($result as $v){ + $data = [ + 'student_name' => $v['姓名'], + 'student_sex' =>$v['性别'], + 'student_phone' =>(string)$v['手机号码'], + 'student_status' =>$v['状态'] == '启用'? 1:0, + 'student_remark' =>$v['备注'], + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now(), + ]; + if (Student::where('student_phone', $data['student_phone'])->first()){ // 手机号码存在重复记录 + continue; + } else { // 记录先暂时保存到数组,稍后一次新建 + array_push($lists,$data); + } + } + return Student::insert($lists); + } + +} \ No newline at end of file diff --git a/backend/app/Http/Controllers/Import/UserImport.php b/backend/app/Http/Controllers/Import/UserImport.php new file mode 100644 index 00000000..c6e09177 --- /dev/null +++ b/backend/app/Http/Controllers/Import/UserImport.php @@ -0,0 +1,23 @@ +fileUpdate(); + return $fileName; + } + + public function getFilters() + { + return [ + 'chunk' + ]; + } +} diff --git a/backend/app/Http/Controllers/Import/UserImportHandler.php b/backend/app/Http/Controllers/Import/UserImportHandler.php new file mode 100644 index 00000000..7d087a8f --- /dev/null +++ b/backend/app/Http/Controllers/Import/UserImportHandler.php @@ -0,0 +1,40 @@ +first()->toArray(); + $lists = []; + foreach ($result as $v){ + $data = [ + 'name' => $v['name'], + 'email' =>$v['email'], + 'role' =>'user', + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now(), + 'password' => bcrypt('123456') + ]; + if (User::where('email', $data['email'])->first()){ // 存在重复记录 + continue; + } else { // 记录先暂时保存到数组,稍后一次新建 + array_push($lists,$data); + } + } + return User::insert($lists); + } + +} \ No newline at end of file diff --git a/backend/app/Http/Controllers/LogController.php b/backend/app/Http/Controllers/LogController.php new file mode 100644 index 00000000..35e8eae7 --- /dev/null +++ b/backend/app/Http/Controllers/LogController.php @@ -0,0 +1,38 @@ +input('pageSize', 10); + $page = $request->input('page', 1); + $data = DB::table('log_logins')->select(['id', 'user_name', 'type', 'desc']) + ->when(!$this->isAdmin(), function($query) { + return $query->where('user_id', Auth::user()->id); + }) + ->latest()->paginate($pageSize); + return Response()->json($data); + } + + // 操作日志记录 + public function show(Request $request){ + $pageSize = $request->input('pageSize', 10); + $page = $request->input('page', 1); + $data = DB::table('log_works')->select(['id', 'user_name', 'type', 'desc']) + ->when(!$this->isAdmin(), function($query) { + return $query->where('user_id', Auth::user()->id); + }) + ->paginate($pageSize); + return Response()->json($data); + } + +} diff --git a/backend/app/Http/Controllers/PermissionController.php b/backend/app/Http/Controllers/PermissionController.php new file mode 100644 index 00000000..4bde8a25 --- /dev/null +++ b/backend/app/Http/Controllers/PermissionController.php @@ -0,0 +1,180 @@ +input('pageSize', 10); + $page = $request->input('page', 1); + // $lists = Permission::Name()->Pid()->Type()->paginate($pageSize); + $lists = Permission::Name()->Pid()->Type()->get(); + $count = Permission::Name()->Pid()->Type()->count(); + $countLen1 = Permission::where('type', 1)->count(); + $countLen2 = Permission::count(); + $items = $lists->toArray(); + $list_data = $items; + $end = $list_data; + if ($countLen1 !== $countLen2){ // 如果只有组类型,则无需进行无极限分类排序,直接输出结果就可以了 + if ( !$request->has('type')) { // 如果仅显示某一类内容,也无需进行无极限分类,直接输出结果 + // 转换为无极限分类格式,分类下的所有API都在一起 + $data = $this->make_tree($list_data); + $end = []; + foreach($data as $item) { + if (isset($item['children'])) { + $values = $item['children']; + unset($item['children']); + array_push($end, $item); + $end = array_merge($end, $values); + } else { + array_push($end, $item); + } + } + } + } + return response()->json([ + 'data' => $end, + 'meta' => [ + 'total' => $count + ], + 'status' => 'success', + 'status_code' => 200 + ], 200); + //return new PermissionCollection($lists); + } + + + public function create() + { + // + } + + + public function store(PermissionRequest $request) + { + // + $data = $request->only(['name', 'pid', 'type', 'method', 'route_name', 'route_match', 'remark']); + + if (Permission::create($data)){ + return $this->success(); + } else { + return $this->error(); + } + } + + + public function show(Permission $permission) + { + // + return new \App\Http\Resources\Permission($permission); + } + + + public function edit(Permission $permission) + { + // + } + + public function update(PermissionRequest $request, Permission $permission) + { + // + $data = $request->only(['name', 'pid', 'type', 'method', 'route_name', 'route_match', 'remark']); + $permission->name = $data['name']; + $permission->pid= $data['pid']; + $permission->type = $data['type']; + $permission->method = $data['method']; + $permission->route_name = $data['route_name']; + $permission->route_match = isset($data['route_match'])?$data['route_match']:$permission->route_match; + $permission->remark = isset($data['remark'])?$data['remark']:$permission->remark; + if ($permission->save()) { + return $this->success(); + } else { + return $this->error(); + } + } + + public function destroy(Permission $permission) + { + // + if ($permission->delete()) { + return $this->success(); + } else { + return $this->error(); + } + } + + public function addGroup(Request $request) + { + $data = $request->only(['name', 'remark']); + $rules = [ + 'name' => 'required|unique|string' + ]; + $messages = [ + 'name.requried' => '功能组名称必须填写', + 'name.unique' => '功能组名称已经存在,无法建立' + ]; + Validator::make($data, $rules, $messages); + + $data['pid'] = 0; + $data['type'] = 1; + if (Permission::create($data)) { + return $this->success(); + } else { + return $this->error(); + } + } + + public function getGroup() + { + $lists = Permission::where('pid', 0) + ->where('type', 1) + ->get(); + return $this->successWithData($lists); + } + + + public function getPermissionByTree() + { + // 获取权限数据 用于在树形控件中显示 + $lists = Permission::select(DB::raw('id, name as label, pid'))->get(); + $arr = $lists->toArray(); + $arr1 = $this->make_tree($arr); + return $this->successWithData($arr1); + } + + public function make_tree($arr){ + $refer = array(); + $tree = array(); + foreach($arr as $k => $v){ + $refer[$v['id']] = & $arr[$k]; //创建主键的数组引用 + } + foreach($arr as $k => $v){ + $pid = $v['pid']; //获取当前分类的父级id + if($pid == 0){ + $tree[] = & $arr[$k]; //顶级栏目 + }else{ + if(isset($refer[$pid])){ + $refer[$pid]['children'][] = & $arr[$k]; //如果存在父级栏目,则添加进父级栏目的子栏目数组中 + } + } + } + return $tree; + } + + public function getModel() + { + return 'App\Models\Permission'; + } + +} diff --git a/backend/app/Http/Controllers/Result.php b/backend/app/Http/Controllers/Result.php new file mode 100644 index 00000000..de61ac9e --- /dev/null +++ b/backend/app/Http/Controllers/Result.php @@ -0,0 +1,125 @@ +json([ + 'status' => 'success', + 'status_code' => 200 + ], 200); + } + + public function successWithData($data) + { + return response()->json([ + 'data' => $data, + 'status' => 'success', + 'status_code' => 200 + ], 200); + } + + public function successWithInfo($info) + { + return response()->json([ + 'info' => $info, + 'status' => 'success', + 'status_code' => 200 + ], 200); + } + + public function error() + { + return response()->json([ + 'status' => 'error', + 'status_code' => 404 + ], 404); + } + + public function validateError($errors) + { + return response()->json( + [ + 'status' => 'validate error', + 'status_code' => 422, + 'errors' => $errors + ], 422); + } + + public function errorWithInfo( $info) + { + return response()->json([ + 'status' => 'error', + 'status_code' => 404, + 'message' => $info + ], 404); + + } + + public function errorWithCodeAndInfo($code, $info) + { + return response()->json([ + 'status' => 'error', + 'status_code' => $code, + 'message' => $info + ], $code); + } + + public function fileUpdate() + { + $file = Input::file('file'); + $type=['application/vnd.ms-excel']; + $fileType = $file->getClientMimeType(); + if (in_array($fileType, $type)) { + $clientExt = $file->getClientOriginalExtension(); + $fileName = date('ymdhis').'.'.$clientExt; + return $file->storeAs('xls',$fileName); + } else { + return $this->errorWithCodeAndInfo(406,'上传的文件格式不正确'); + } + } + + public function deleteByIds($request) + { + $data = $request->only('ids'); + if (! is_array($data['ids'])) { + $data['ids'] = json_decode($data['ids'], true); + } + $rules = [ + 'ids' => 'required | Array' + ]; + $messages = [ + 'ids.required' => '必须选择相应的记录', + 'ids.Array' => 'ids字段必须是数组' + ]; + + $validator = Validator::make($data, $rules, $messages); + if ($validator->fails()) { + $errors = $validator->error($validator); + return $this->errorWithCodeAndInfo(422, $errors); + } else { + return $data; + } + } + + public function log($type, $route_name, $desc) + { + $data = [ + 'type' => $type, + 'route_name' => $route_name, + 'desc' => $desc + ]; + event(new DataOperation($data)); + } +} \ No newline at end of file diff --git a/backend/app/Http/Controllers/RoleController.php b/backend/app/Http/Controllers/RoleController.php new file mode 100644 index 00000000..b19f43d2 --- /dev/null +++ b/backend/app/Http/Controllers/RoleController.php @@ -0,0 +1,226 @@ +get(); + return $this->successWithData($data); + + } + + public function create() + { + // + } + + /** + * @api {post}/api/role 新建一条角色信息 + * @apiGroup role + * @apiParam {string} name 角色名称 + * @apiParam {string} explain 角色说明 + * @apiParam {string} [remark] 角色备注 可选 + * @apiParamExample {object} 请求事例 建 + * { + * name: 'app', + * explain: '应用管理者' + * } + *@apiHeaderExample {json} 请求头: + *{ "Content-Type": "application/x-www-form-urlencoded" } + * + * @apiSuccessExample {json} 操作成功: + * HTTP/1.1 200 OK + * { + * "status": "success", + * "status_code": 200 + * } + * @apiErrorExample {json} 数据验证出错: + * HTTP/1.1 404 Not Found + * { + * "status": "error", + * "status_code": 404, + * } + */ + public function store(RoleRequest $request) + { + // + $data = $request->only(['name', 'explain', 'remark']); + if (Role::updateOrCreate($data)) { + return $this->success(); + } else { + return $this->error(); + } + } + + /** + * @api {get} /api/role/:id 获取一条角色 + * @apiGroup role + * @apiParam {number} id 角色标识 + * @apiSuccessExample {json} 信息获取成功: + * HTTP/1.1 200 OK + * { + * "data": [ + * { + * "id": 2, + * "name": "admin", + * "explain": "管理员", + * "remark": null + * } + * ], + * "status": "success", + * "status_code": 200 + * } + * @apiErrorExample {json} 指定的角色不存在: + * HTTP/1.1 404 Not Found + * { + * "status": "error", + * "status_code": 404 + * } + */ + public function show(Role $role) + { + // + return new \App\Http\Resources\Role($role); + } + + public function edit(Role $role) + { + // + + + } + + + /** + * @api {patch}/api/role/:id 更新角色信息 + * @apiGroup role + * @apiParam {number} id 角色标识 路由上使用 + * @apiParam {string} name 角色名称 + * @apiParam {string} explain 角色描述 + * @apiParam {string} [remark] 备注 可选 + * @apiParamExample {object} 请求事例 建立学期 2017-2018上学期: + * { + * name: 'admin', + * explain: '管理员', + * remark: '管理员' + * } + *@apiHeaderExample {json} 请求头: + *{ "Content-Type": "application/x-www-form-urlencoded" } + * @apiSuccessExample {json} 操作成功: + * HTTP/1.1 200 OK + * { + * "status": "success", + * "status_code": 200 + * } + * @apiErrorExample {json} 数据验证出错: + * HTTP/1.1 404 Not Found + * { + * "status": "error", + * "status_code": 404 + * } + */ + public function update(RoleRequest $request, Role $role) + { + // + $data = $request->only(['name', 'explain', 'remark', 'permission']); + $role->name = $data['name']; + $role->explain = $data['explain']; + $role->permission = implode(',', $data['permission']); + $role->remark = $data['remark']??null; + if ($role->save()) { + return $this->success(); + } else { + return $this->error(); + } + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Models\Role $role + * @return \Illuminate\Http\Response + */ + /** + * @api {delete} /api/role/:id 删除指定的角色信息 + * @apiGroup role + * @apiParam {number} id 角色标识 + * @apiSuccessExample {json} 信息获取成功: + * HTTP/1.1 200 OK + * { + * "status": "success", + * "status_code": 200 + * } + * @apiErrorExample {json} 删除失败,没有指定的角色: + * HTTP/1.1 404 Not Found + * { + * "status": "error", + * "status_code": 404, + * "message": "删除失败" + * } + */ + public function destroy(Role $role) + { + // + if ($role->delete()) { + return $this->success(); + } else { + return $this->error(); + } + } + + protected function getModel() + { + return 'App\Models\Role'; + } + +} diff --git a/backend/app/Http/Controllers/SessionController.php b/backend/app/Http/Controllers/SessionController.php new file mode 100644 index 00000000..3935aae7 --- /dev/null +++ b/backend/app/Http/Controllers/SessionController.php @@ -0,0 +1,392 @@ +上学期 2=>下学期) + * @apiParam {number} one 高一班级数 + * @apiParam {number} two 高二班级数 + * @apiParam {number} three 高三班级数 + * @apiParam {string} [remark] 备注 可选 + * @apiParamExample {object} 请求事例 建立学期 2017-2018上学期: + * { + * year: 2017, + * team: 1, + * one: 20, + * two: 20, + * three: 20 + * } + *@apiHeaderExample {json} 请求头: + *{ "Content-Type": "application/x-www-form-urlencoded" } + * + * @apiSuccessExample {json} 操作成功: + * HTTP/1.1 200 OK + * { + * "status": "success", + * "status_code": 200 + * } + * @apiErrorExample {json} 数据验证出错: + * HTTP/1.1 404 Not Found + * { + * "status": "error", + * "status_code": 404, + * "message": "验证出错,请按要求填写" + * } + * @apiErrorExample {json} 重复提交: + * HTTP/1.1 404 Not Found + * { + * "status": "error", + * "status_code": 400, + * "message": "你提交的学期信息已经存在,无法新建" + * } + */ + public function store(Request $request) + { + // + // + $data = $request->only('year', 'team', 'one', 'two', 'three'); + $validator = Validator::make($data, [ + 'year' => 'required|integer', + 'team' => 'required| in:1,2', + 'one' => 'required|integer', + 'two' => 'required|integer', + 'three' => 'required|integer', + ]); + if ($validator->fails()) { + $errors = $validator->errors($validator); + return $this->errorWithCodeAndInfo(422, $errors); + } else { + if (! Session::where('year',$data['year'])->where('team', $data['team'])->count()) { + Session::create($data); + return $this->success(); + } else { + return $this->errorWithCodeAndInfo(400, '你提交的学期信息已经存在,无法新建'); + } + + } + + } + + /** + * Display the specified resource. + * + * @param \App\Models\Session $session + * @return \Illuminate\Http\Response + */ + /** + * @api {get} /api/session/:id 获取指定学期信息 + * @apiGroup session + * @apiParam {number} id 学期标识 + * @apiSuccessExample {json} 信息获取成功: + * HTTP/1.1 200 OK + * { + * "data": [ + * { + * "id": 2 // 整数型 学期标识 + * "year": 2016 //数字型 学年 + * "team": 2 // 数字型 学期 + * "remark": "2016-2017下学期" // 备注说明 + * "one": 20, // 高一年级班级数 + * "two": 20, // 高二年级班级数 + * "three": 20 // 高三年级班级数 + * } + * ], + * "status": "success", + * "status_code": 200 + * } + * @apiErrorExample {json} 指定的学期不能存在: + * HTTP/1.1 404 Not Found + * { + * "status": "error", + * "status_code": 404 + * } + */ + public function show(Session $session) + { + // + if ($session) { + return new \App\Http\Resources\Session($session); + } else { + return $this->error(); + } + + } + + /** + * Show the form for editing the specified resource. + * + * @param \App\Models\Session $session + * @return \Illuminate\Http\Response + */ + public function edit(Session $session) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param \App\Models\Session $session + * @return \Illuminate\Http\Response + */ + /** + * @api {patch}/api/session/:id 更新学期信息 + * @apiGroup session + * @apiParam {number} id 学期标识 路由上使用 + * @apiParam {number} year 学年 + * @apiParam {number=1,2} team 学期(1=>上学期 2=>下学期) + * @apiParam {number} one 高一班级数 + * @apiParam {number} two 高二班级数 + * @apiParam {number} three 高三班级数 + * @apiParam {string} [remark] 备注 可选 + * @apiParamExample {object} 请求事例 建立学期 2017-2018上学期: + * { + * year: 2017, + * team: 1, + * remark: '2017-2018上学期', + * one: 20, + * two: 20, + * three: 20 + * + * } + *@apiHeaderExample {json} 请求头: + *{ "Content-Type": "application/x-www-form-urlencoded" } + * + * @apiSuccessExample {json} 操作成功: + * HTTP/1.1 200 OK + * { + * "status": "success", + * "status_code": 200 + * } + * @apiErrorExample {json} 数据验证出错: + * HTTP/1.1 404 Not Found + * { + * "status": "error", + * "status_code": 404, + * "message": "验证出错,请按要求填写" + * } + */ + public function update(Request $request, Session $session) + { + // + $data = $request->only('year', 'team', 'one', 'two', 'three'); + $validator = Validator::make($data, [ + 'year' => 'required|integer', + 'team' => 'required| in:1,2', + 'one' => 'required|integer', + 'two' => 'required|integer', + 'three' => 'required|integer', + ]); + if ($validator->fails()) { + $errors = $validator->errors($validator); + return $this->errorWithCodeAndInfo(422, $errors); + } else { + $session->year = $data['year']; + $session->team = $data['team']; + $session->one = $data['one']; + $session->two = $data['two']; + $session->three = $data['three']; + $session->save(); + return $this->success(); + } + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Models\Session $session + * @return \Illuminate\Http\Response + */ + /** + * @api {delete} /api/session/:id 删除指定的学期信息 + * @apiGroup session + * @apiParam {number} id 学期标识 + * @apiSuccessExample {json} 信息获取成功: + * HTTP/1.1 200 OK + * { + * "status": "success", + * "status_code": 200 + * } + * @apiErrorExample {json} 删除失败,没有指定的学期: + * HTTP/1.1 404 Not Found + * { + * "status": "error", + * "status_code": 404, + * "message": "删除失败" + * } + */ + + public function destroy(Session $session) + { + // + if ($session->delete()) { + return $this->success(); + } else { + return $this->errorWithInfo('删除失败'); + } + } + + public function upload(SessionImport $import) + { + $bool = $import->handleImport($import); + if ($bool) { + return $this->success(); + } else { + return $this->error(); + } + + + } + + /** + * @api {get} /api/getSession 获取学期信息 + * @apiGroup other + * + * @apiSuccessExample 返回学期信息列表, + * HTTP/1.1 200 OK + * { + * "data": [ + * { + * "id": 2 // 整数型 学期标识 + * "year": 2016 //数字型 学年 + * "team": 2 // 数字型 学期 + * } + * ], + * "status": "success", + * "status_code": 200 + * } + * + */ + public function getSession() + { + $data = Session::select('id','year','team')->get()->toArray(); + return $this->successWithData($data); + } + + public function getDefaultSession() + { + + $id = $this->getCurrentSessionId(); + return response()->json([ + 'data' => [ + 'id' => $id + ], + 'status' => 'success', + 'status_code' => 200 + ], 200); + } + + public function getClassNumByGrade(Request $request) + { + $arrClass = ['zero', 'one', 'two', 'three']; + $grade = (int)$request->input('grade'); + $teach_id = (int)$request->input('teach_id', 7); + if (isset($grade) && $grade && $grade>=0 && $grade<=3) { + $session_id = $this->getCurrentSessionId(); + $filed =$arrClass[$grade]; + $maxClass = Session::where('id', $session_id)->value($arrClass[$grade]); + $arr = []; + for ($i = 1; $i<=$maxClass;$i++){ + $key = 'class'.$i; + $arr[$key] = [ + 'disable' => false, + 'label' => $i + ]; + } + $arr1 = []; + $tmpArr = Teaching::where('teach_id', $teach_id) + ->where('session_id', $session_id) + ->where('grade', $grade) + ->pluck('class_id'); + foreach ($tmpArr as $item){ + $key = 'class'.$item; + $arr1[$key] = [ + 'disable' => true, + 'label' => $item + ]; + } + $result=array_values(array_merge($arr,$arr1)); + return $this->successWithData($result); + } else { + return $this->errorWithCodeAndInfo(422, '请选择年级'); + } + } +} diff --git a/backend/app/Http/Controllers/SmsController.php b/backend/app/Http/Controllers/SmsController.php new file mode 100644 index 00000000..aac34350 --- /dev/null +++ b/backend/app/Http/Controllers/SmsController.php @@ -0,0 +1,100 @@ +addMinutes(2); + Cache::put($phone, $verify, $expiresAt); + + // 4、 发送验证码到指定的手机 + $easySms = new EasySms($this->getParams()); + $easySms->send($phone, [ + 'template' => $template, + 'data' => [ + 'code' => $verify + ], + ]); + return $this->successWithInfo('验证码已经发送'); + } + + // 手机验证码功能,判断发送的验证码是否成功 + protected function checkVerify($phone, $verify) + { + if (Cache::has($phone)) { + $check = Cache::get($phone); + } else { + $info = '手机验证码不存在'; + return $this->errorWithInfo($info); + } + if ($check != $verify) { + $info = '输入的验证码不正确,请重新输入'; + return $this->errorWithInfo($info); + } else { + $info = '输入的验证码正确'; + return $this->successWithInfo($info); + } + } + + // 发送验证码 + public function send(Request $request) + { + $phone = $request->input('phone'); + return $this->sendVerifyCode($phone); + } + + // 验证码校验 + public function verify(Request $request) + { + $phone = $request->input('phone'); + $code = $request->input('code', 111111); + return $this->checkVerify($phone, $code); + } + + // 配置参数 + protected function getParams() + { + + + $key = config("app.sms_api_key"); + $sms_config = [ + // HTTP 请求的超时时间(秒) + 'timeout' => 5.0, + + // 默认发送配置 + 'default' => [ + // 网关调用策略,默认:顺序调用 + 'strategy' => \Overtrue\EasySms\Strategies\OrderStrategy::class, + + // 默认可用的发送网关 + 'gateways' => [], + ], + // 可用的网关配置 + 'gateways' => [ + 'errorlog' => [ + 'file' => '/tmp/easy-sms.log', + ], + 'juhe' => [ + 'app_key' => $key, + ], + ], + ]; + // josn转数组,env文件里面的配置参数必须用双引号引起来 + $gateway = json_decode(config("app.sms_gateway_type"),true); + $sms_config['default']['gateways'] = $gateway; + return $sms_config; + } +} diff --git a/backend/app/Http/Controllers/StudentController.php b/backend/app/Http/Controllers/StudentController.php new file mode 100644 index 00000000..154c4495 --- /dev/null +++ b/backend/app/Http/Controllers/StudentController.php @@ -0,0 +1,121 @@ +input('pageSize', 10); + $data = Student::paginate($pageSize); + return new StudentCollection($data); + } + + + + public function store(StoreStudentPost $request) + { + // + $data = $request->only(['student_name', 'student_sex', 'student_phone', 'student_status', 'student_remark']); + + if (Student::create($data)) { + return $this->success(); + } else { + return $this->error(); + } + } + + + public function show(Student $student) + { + // + return new \App\Http\Resources\Student($student); + } + + + public function update(UpdateStudentPatch $request, Student $student) + { + // + $data = $request->only(['student_name', 'student_sex', 'student_phone', 'student_status', 'student_remark']); + + if (Student::where('student_id', $student['student_id'])->update($data)) { + return $this->success(); + } else { + return $this->errorWithInfo('更新学生信息失败'); + } + } + + + public function destroy(Student $student) + { + // + if ($student->delete()) { + return $this->success(); + } else { + return $this->errorWithInfo('删除记录失败,可能记录不存在'); + } + } + + public function upload(StudentImport $import) + { + $bool = $import->handleImport($import); + if ($bool) { + return $this->success(); + } else { + return $this->error(); + } + } + + + protected function queryData($pageSize = null, $page = 1){ + // 查询条件 根据姓名或者电话号码进行查询 + $offset = $pageSize * ($page - 1) == 0? 0: $pageSize * ($page - 1); + $model = $this->getModel(); + $lists = $model::select('student_name', 'student_sex', 'student_phone', 'student_status', 'student_remark') + ->when($pageSize,function($query) use($offset, $pageSize) { + return $query->offset($offset)->limit($pageSize); + }) + ->get(); + return $lists; + } + + /** + * 根据传入的数据生成内容 + * @param $data + * @return array + */ + protected function generatorData($data): array + { + $items = []; + foreach ($data as $item) { + $arr = []; + $arr['student_name'] = $item['student_name']; + $arr['student_sex'] = $item['student_sex']; + $arr['student_phone'] = $item['student_phone']; + $arr['student_status'] = $item['student_status'] ==0?'禁用':'启用'; + $arr['student_remark'] = $item['student_remark']; + array_push($items, $arr); + } + array_unshift($items, ['姓名', '性别', '电话号码', '状态', '备注']); // 标题 + return $items; + } + + + protected function getModel() { + return 'App\Models\Student'; + } + + + protected function getExportFile() { + return '学生管理'; + } +} diff --git a/backend/app/Http/Controllers/TeacherController.php b/backend/app/Http/Controllers/TeacherController.php new file mode 100644 index 00000000..1bb2c75f --- /dev/null +++ b/backend/app/Http/Controllers/TeacherController.php @@ -0,0 +1,85 @@ +year; + $team =1; + $day = $date->day; + $month = $date->month; + switch ($month){ + case 2: + if ($day>=25) { + $team = 2; + } else { + $team = 1; + } + break ; + case 3: + case 4: + case 5: + case 6: + case 7: + $team = 2; + break; + case 8: + if ($day>=25) { + $team = 1; + } else { + $team = 2; + } + break ; + default: // 默认为1 + $team =1; + break; + } + if ($team == 2 || $month <=7) { // 核算年份 1-7月份、8月份(8月25日以下为上一年) + $year--; + } + $session_id = Session::where('year', $year) ->where('team', $team)->value('id'); + return $session_id; + } + + public function getGradeById($id) + { + $grades = ['', '高一', '高二', '高三']; + return $grades[$id]; + } + + public function isAdmin() + { + $roles = explode(',', Auth::user()->role); + return in_array('admin', $roles); + } + + +} \ No newline at end of file diff --git a/backend/app/Http/Controllers/UserController.php b/backend/app/Http/Controllers/UserController.php new file mode 100644 index 00000000..61ff9bdf --- /dev/null +++ b/backend/app/Http/Controllers/UserController.php @@ -0,0 +1,542 @@ +input('pageSize'); + $pageSize = isset($pageSize) && $pageSize?$pageSize:10; + $users = User::name()->email()->paginate($pageSize); + return new UserCollection($users); + } + + + public function create(Request $request) + { + + } + + /** + * @api {post} /api/admin 建立新的管理员 + * @apiGroup admin + * @apiParam {string} name 用户昵称 + * @apiParam {string} email 用户登陆名 email格式 必须唯一 + * @apiParam {string} password 用户登陆密码 + * @apiParam {string="admin","editor"} [role="editor"] 角色 内容为空或者其他的都设置为editor + * @apiParam {string} [avatar] 用户头像地址 + * @apiParamExample {json} 请求的参数例子: + * { + * name: 'test', + * email: '1111@qq.com', + * password: '123456', + * role: 'editor', + * avatar: 'uploads/20178989.png' + * } + * + * @apiSuccessExample 新建用户成功 + * HTTP/1.1 201 OK + * { + * "status": "success", + * "status_code": 201 + * } + * @apiErrorExample 数据验证出错 + * HTTP/1.1 404 Not Found + * { + * "status": "error", + * "status_code": 404, + * "message": "信息提交不完全或者不规范,校验不通过,请重新提交" + * } + */ + public function store(Request $request) + { + // 新建管理员信息 + $data = $request->only(['name', 'role', 'password','password_confirmation', 'email', 'avatar']); + $rules = [ + 'name'=>'required', + 'role' =>'nullable', + 'password' => 'required|confirmed', + 'email' => 'required|unique:users', + 'avatar' => 'nullable|string' + ]; + $message = [ + 'name.required' => '用户名是必填项', + 'password.required' => '用户密码是必填项', + 'password.confirmed' => '两次输入的密码不匹配', + 'email.required' => '登录名是必填项', + 'email.unique' => '登录名已经存在,请重新填写', + ]; + $validator = Validator::make($data, $rules, $message); + if ($validator->fails()) { + $errors = $validator->errors($validator); + return $this->errorWithCodeAndInfo(422, $errors); + } + $data['password'] = bcrypt($data['password']); + $role = $request->input('role', ['user']); + if ($role === null || $role == []) + { + $role = ['user']; + } + if (! is_array($role)) { + $roles = json_decode($role, true); + $data['role'] = implode(',', $roles); + } else { + $data['role'] = implode(',', $role); + } + + if (User::create($data)) { + return $this->success(); + } + } + + + /** + * @api {get} /api/admin/:id 显示指定的管理员 + * @apiGroup admin + * + * + * @apiSuccessExample 返回管理员信息 + * HTTP/1.1 200 OK + * { + * "data": { + * "id": 1, + * "name": "wmhello", + * "email": "871228582@qq.com", + * "role": "admin", + * "avatar": "" + * }, + * "status": "success", + * "status_code": 200 + * } + * + */ + public function show($id) + { + // + $user = User::find($id); + return new \App\Http\Resources\User($user); + } + + public function edit($id) + { + // + } + + + /** + * @api {put} /api/admin/:id 更新指定的管理员 + * @apiGroup admin + * @apiHeaderExample {json} http头部请求: + * { + * "content-type": "application/x-www-form-urlencoded" + * } + * @apiParam {string} name 用户昵称 + * @apiParam {string="admin","editor"} [role=editor] 角色 内容为空或者其他的都设置为editor + * @apiParam {string} [avatar] 用户头像地址 + * @apiParamExample {json} 请求参数例子 + *{ + * name: 'test', + * role: 'editor', + * avatar: 'uploads/20174356.png' + * } + * @apiSuccessExample 返回密码设置成功的结果 + * HTTP/1.1 200 OK + * { + * "status": "success", + * "status_code": 200 + * } + * @apiErrorExample 数据验证出错 + * HTTP/1.1 404 Not Found + * { + * "status": "error", + * "status_code": 404, + * "message": "信息提交不完全或者不规范,校验不通过,请重新提交" + * } + */ + + public function update(Request $request, $id) + { + $data = $request->only(['name', 'role', 'avatar']); + $rules = [ + 'name' => 'required|string', + 'role' => 'nullable|array', + 'avatar' =>'nullable|string' + ]; + $message = [ + 'name.required' => '用户名是必填项', + ]; + $validator = Validator::make($data, $rules, $message); + if ($validator->fails()) { + $errors = $validator->errors($validator); + return $this->errorWithCodeAndInfo(422, $errors); + } + + $role = $request->input('role', ['user']); + if ($role === null || $role == []) + { + $role = ['user']; + } + if (! is_array($role)) { + $roles = json_decode($role, true); + $data['role'] = implode(',', $roles); + } else { + $data['role'] = implode(',', $role); + } + $bool = User::where('id', $id)->update($data); + if ($bool) { + return $this->success(); + } + + } + + /** + * @api {delete} /api/admin/:id 删除指定的管理员 + * @apiGroup admin + * + * @apiSuccessExample 用户删除成功 + * HTTP/1.1 200 OK + * { + * "status": "success", + * "status_code": 200 + * } + * + * @apiErrorExample 用户删除失败 + * HTTP/1.1 404 ERROR + * { + * "status": "error", + * "status_code": 404 + * } + */ + + public function destroy($id) + { + // + return response()->json([ + 'status' => 'success', + 'status_code' => 200, + 'message' => '演示功能,暂时不提供用户删除功能' + ], 200); + $user = User::find($id); + if ($user->delete()) { + return $this->success(); + } else { + return $this->error(); + } + + } + + /** + * @api {post} /api/admin/:id/reset 重置指定管理员的密码 + * @apiGroup admin + * + * @apiParam {string} password 用户密码 + * + * @apiSuccessExample 返回密码设置成功的结果 + * HTTP/1.1 200 OK + * { + * "status": "success", + * "status_code": 200 + * } + * + */ + public function reset(Request $request, $id) + { + return response()->json([ + 'status' => 'success', + 'status_code' => 200, + 'message' => '系统演示,暂时不提供用户修改密码功能' + ], 200); + $password = $request->input('password'); + $user = User::find($id); + $user->password = bcrypt($password); + $user->save(); + return $this->success(); + } + + /** + * @api {post} /api/admin/upload 头像图片上传 + * @apiGroup admin + * @apiHeaderExample {json} http头部请求: + * { + * "content-type": "application/form-data" + * } + * + * @apiSuccessExample 上传成功 + * HTTP/1.1 200 OK + * { + * "status": "success", + * "status_code": 200, + * "data": { + * "url" : 'uploads/3201278123689.png' + * } + * } + * + * @apiErrorExample 上传失败 + * HTTP/1.1 400 ERROR + * { + * "status": "error", + * "status_code": 400 + * } + */ + + public function uploadAvatar(Request $request) + { + if ($request->isMethod('POST')) { +// var_dump($_FILES); + $file = $request->file('photo'); + //判断文件是否上传成功 + if ($file->isValid()) { + //获取原文件名 + $originalName = $file->getClientOriginalName(); + //扩展名 + $ext = $file->getClientOriginalExtension(); + //文件类型 + $type = $file->getClientMimeType(); + //临时绝对路径 + $realPath = $file->getRealPath(); + + $filename = date('YmdHiS') . uniqid() . '.' . $ext; + + $bool = Storage::disk('uploads')->put($filename, file_get_contents($realPath)); + if ($bool) { + $filename = 'uploads/' . $filename; + return response()->json([ + 'status' => 'success', + 'status_code' => 200, + 'data' => [ + 'url' => $filename, + ] + ], 200); + } else { + return $this->error(); + } + } + } + } + + /** + * 修改个人密码 + * 获取三个字段,oldPassword => 原来密码 password=>新密码 password_confirmation + * 原密码相同才能修改密码为新密码 + */ + public function modify(Request $request) + { + + return response()->json([ + 'status' => 'success', + 'status_code' => 200, + 'message' => '系统演示,暂时不提供用户修改密码功能' + ], 200); + + $oldPassword = $request->input('oldPassword'); + $password = $request->input('password'); + $data = $request->all(); + $rules = [ + 'oldPassword'=>'required|between:6,20', + 'password'=>'required|between:6,20|confirmed', + ]; + $messages = [ + 'required' => '密码不能为空', + 'between' => '密码必须是6~20位之间', + 'confirmed' => '新密码和确认密码不匹配' + ]; + $validator = Validator::make($data, $rules, $messages); + $user = Auth::user(); + $validator->after(function($validator) use ($oldPassword, $user) { + if (!\Hash::check($oldPassword, $user->password)) { + $validator->errors()->add('oldPassword', '原密码错误'); + } + }); + if ($validator->fails()) { + $errors = $validator->errors($validator); //返回一次性错误 + return $this->errorWithCodeAndInfo(422,$errors); + } + $user->password = bcrypt($password); + if ($user->save()) { + return $this->success(); + } else { + return $this->error(); + } + + } + + /** + * @api {get} /api/user 获取当前登陆的用户信息 + * @apiGroup login + * + * + * @apiSuccessExample 信息获取成功 + * HTTP/1.1 200 OK + *{ + * "data": { + * "id": 1, + * "name": "xxx", + * "email": "xxx@qq.com", + * "roles": "xxx", //角色: admin或者editor + * "avatar": "" + * }, + * "status": "success", + * "status_code": 200 + *} + */ + public function getUserInfo(Request $request) + { + // 获取用户信息和用户组对应的用户权限 + // 用户权限 + $user = $request->user(); + $roles = explode(',',$user['role']); + $data = [ + 'id' => $user['id'], + 'name' => $user['name'], + 'email' => $user['email'], + 'role' => $roles, + 'avatar' => $user['avatar'] + ]; + // 用户权限 + $feature = \App\Models\Role::whereIn('name',$roles)->pluck('permission'); + $feature = $feature->toArray(); + $strPermission = implode(',', $feature); + $permissions = explode(',', $strPermission); + $feature = Permission::select(['route_name', 'method', 'route_match', 'id'])->whereIn('id',$permissions)->get(); + $feature = $feature->toArray(); + $data['permission'] = $feature; + return response()->json([ + 'data' => $data, + 'status' => 'success', + 'status_code' => 200, + ],200); + } + + public function upload(UserImport $import) + { + $bool = $import->handleImport($import); + if ($bool) { + return $this->success(); + } else { + return $this->error(); + } + } + + + protected function queryData($pageSize = null, $page = 1, $name, $email){ + // 查询条件 根据姓名或者电话号码进行查询 + $offset = $pageSize * ($page - 1) == 0? 0: $pageSize * ($page - 1); + $model = $this->getModel(); + $lists = $model::select('name', 'email', 'role') + ->name() + ->email() + ->when($pageSize,function($query) use($offset, $pageSize) { + return $query->offset($offset)->limit($pageSize); + }) + ->get(); + + return $lists; + } + + /** + * 根据传入的数据生成内容 + * @param $data + * @return array + */ + protected function generatorData($data): array + { + $items = []; + // $data = $data['data']; // 数据库中的数据 + $arrRoles = Role::pluck('explain', 'name')->all(); + foreach ($data as $item) { + $arr = []; + $arr['name'] = $item['name']; + $arr['email'] = $item['email']; + $tmpRoles = explode(',', $item['role']); + $strRoles = ''; + foreach ($tmpRoles as $tmp) { + $strRoles .= $arrRoles[$tmp].','; + } + $arr['role'] = substr($strRoles,0, -1); + array_push($items, $arr); + } + array_unshift($items, ['姓名', '登录名', '角色']); + return $items; + } + + public function test() + { + $str = 'abacde,'; + dump(substr($str,0,-1)); + } + + public function deleteAll() + { + return response()->json([ + 'status' => 'success', + 'status_code' => 200, + 'message' => '演示功能,暂时不提供批量删除功能' + ], 200); + } + + protected function getExportFile() + { + // 导出文件的名称 + return '用户管理'; + } + + protected function getModel() + { + // 当前控制器所对应的模型 + return 'App\Models\User'; + } +} diff --git a/backend/app/Http/Kernel.php b/backend/app/Http/Kernel.php new file mode 100644 index 00000000..6fe73842 --- /dev/null +++ b/backend/app/Http/Kernel.php @@ -0,0 +1,66 @@ + [ + \App\Http\Middleware\EncryptCookies::class, + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, + \Illuminate\Session\Middleware\StartSession::class, + // \Illuminate\Session\Middleware\AuthenticateSession::class, + \Illuminate\View\Middleware\ShareErrorsFromSession::class, + \App\Http\Middleware\VerifyCsrfToken::class, + \Illuminate\Routing\Middleware\SubstituteBindings::class, + + ], + + 'api' => [ + 'throttle:60,1', + 'bindings', + 'role' + ], + ]; + + /** + * The application's route middleware. + * + * These middleware may be assigned to groups or used individually. + * + * @var array + */ + protected $routeMiddleware = [ + 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, + 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, + 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, + 'can' => \Illuminate\Auth\Middleware\Authorize::class, + 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + 'role' => Role::class, + ]; +} diff --git a/api/app/Http/Middleware/EncryptCookies.php b/backend/app/Http/Middleware/EncryptCookies.php similarity index 100% rename from api/app/Http/Middleware/EncryptCookies.php rename to backend/app/Http/Middleware/EncryptCookies.php diff --git a/api/app/Http/Middleware/RedirectIfAuthenticated.php b/backend/app/Http/Middleware/RedirectIfAuthenticated.php similarity index 83% rename from api/app/Http/Middleware/RedirectIfAuthenticated.php rename to backend/app/Http/Middleware/RedirectIfAuthenticated.php index 2395ddcc..e4cec9c8 100644 --- a/api/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/backend/app/Http/Middleware/RedirectIfAuthenticated.php @@ -2,7 +2,6 @@ namespace App\Http\Middleware; -use App\Providers\RouteServiceProvider; use Closure; use Illuminate\Support\Facades\Auth; @@ -19,7 +18,7 @@ class RedirectIfAuthenticated public function handle($request, Closure $next, $guard = null) { if (Auth::guard($guard)->check()) { - return redirect(RouteServiceProvider::HOME); + return redirect('/home'); } return $next($request); diff --git a/backend/app/Http/Middleware/Role.php b/backend/app/Http/Middleware/Role.php new file mode 100644 index 00000000..58fe9d91 --- /dev/null +++ b/backend/app/Http/Middleware/Role.php @@ -0,0 +1,60 @@ +user(); + + // 2、 因为角色有可能是过个组合,分解角色到数组 + $arrRole = explode(',', $user->role); + if (in_array('admin', $arrRole)) { + return $next($request); + } else { + $route = Route::currentRouteName(); + $permissions = []; + $white_list = ['admin.userInfo']; //白名单路由,如果访问的路由是白名单里面的内容,则自动放行 + if (in_array($route, $white_list)) { + return $next($request); + } + // 3、 角色数组中取出每一个角色,得到对应的功能id + $feature = \App\Models\Role::whereIn('name',$arrRole)->pluck('permission'); + $feature = $feature->toArray(); + $strPermission = implode(',', $feature); + $permissions = explode(',', $strPermission); + $feature = Permission::whereIn('id',$permissions)->pluck('route_name'); // 当前角色可以访问的功能 + $feature = $feature->toArray(); + if (in_array($route, $feature)) { + return $next($request); + } else { + return response()->json([ + 'status' => 'error', + 'status_code' => 403, + 'message' => '当前用户无权限访问该功能' + ], 403); + } + + } + + } else { + return $next($request); + } + + } +} diff --git a/api/app/Http/Middleware/TrimStrings.php b/backend/app/Http/Middleware/TrimStrings.php similarity index 100% rename from api/app/Http/Middleware/TrimStrings.php rename to backend/app/Http/Middleware/TrimStrings.php diff --git a/backend/app/Http/Middleware/TrustProxies.php b/backend/app/Http/Middleware/TrustProxies.php new file mode 100644 index 00000000..ef1c00d1 --- /dev/null +++ b/backend/app/Http/Middleware/TrustProxies.php @@ -0,0 +1,29 @@ + 'FORWARDED', + Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR', + Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST', + Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT', + Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO', + ]; +} diff --git a/backend/app/Http/Middleware/VerifyCsrfToken.php b/backend/app/Http/Middleware/VerifyCsrfToken.php new file mode 100644 index 00000000..8665e657 --- /dev/null +++ b/backend/app/Http/Middleware/VerifyCsrfToken.php @@ -0,0 +1,17 @@ +http = $http; + } + + public function login($email, $password) + { + if (auth()->attempt(['email'=> $email, 'password'=> $password])){ + event(new UserLogin()); + return $this->proxy('password', [ + 'username' => $email, + 'password' => $password, + 'scope' => '', + ]); + } + return response()->json([ + 'status' => 'login error', + 'status_code' => 421, + 'message' => 'Credentials not match' + ],421); + } + public function loginWithThree($email, $password, $id, $provider) + { + if (auth()->attempt(['email'=> $email, 'password'=> $password])){ + $user_id = Auth::user()->id; + event(new UserLogin()); + ThreeLogin::firstOrCreate(['platform_id'=>$id, 'provider'=>$provider, 'user_id' => $user_id]); + return $this->proxy('password', [ + 'username' => $email, + 'password' => $password, + 'scope' => '', + ]); + } + return response()->json([ + 'status' => 'login error', + 'status_code' => 421, + 'message' => 'Credentials not match' + ],421); + } + + public function proxy($grantType, array $data = []) + { + $data = array_merge($data, ['client_id' => env('PASSPORT_CLIENT_ID'), + 'client_secret' => env('PASSPORT_CLIENT_SECRET'), + 'grant_type' => $grantType + ]); + $website = $_SERVER['HTTP_HOST']; + $response = $this->http->post('http://' . $website . '/oauth/token', ['form_params' => $data + ]); + $token = json_decode((string)$response->getBody(), true); + return response()->json(['token' => $token['access_token'], + 'expires_in' => $token['expires_in'], + 'status' => 'success', + 'status_code' => 200 + ])->cookie('refreshToken', $token['refresh_token'], 14400, null, null, false, true); + } + + public function logout() + { + $user = auth()->guard('api')->user(); + $accessToken = $user->token(); + app('db')->table('oauth_refresh_tokens') + ->where('access_token_id', $accessToken->id) + ->update([ + 'revoked' => true + ]); + app('cookie')->forget('refreshToken'); + $accessToken->revoke(); + // $log = new LogLogin(); +// $log->saveLogoutLog($user); + event(new UserLogout($user)); +// event(new UserLogout($user)); + return response()->json([ + 'status' => 'success', + 'status_code' => 200, + 'message' => 'logout success' + ] + ,200); + } + + public function refresh() + { + $refreshToken = request()->cookie('refreshToken'); + return $this->proxy('refresh_token', + ['refresh_token' => $refreshToken]); + } +} \ No newline at end of file diff --git a/backend/app/Http/Requests/PermissionRequest.php b/backend/app/Http/Requests/PermissionRequest.php new file mode 100644 index 00000000..81dba3e9 --- /dev/null +++ b/backend/app/Http/Requests/PermissionRequest.php @@ -0,0 +1,41 @@ + 'required|string', + 'pid' => 'required|integer', + 'type' => 'required|in:1,2', + 'method' => 'required_unless:type,1', + 'route_name' => 'required_unless:type,1', + ]; + } + + public function messages() + { + return [ + 'name.required' => '功能名称必须填写', + 'pid.required' => '所属组称必须填写', + 'type.required' => '功能类型必须填写', + 'route_name.required_unless' => '路由名称必须填写', + 'route_name.unique' => '路由名称已经存在,不能重复出现', + 'method.required_unless' => '访问方法必须填写', + ]; + } +} diff --git a/backend/app/Http/Requests/Request.php b/backend/app/Http/Requests/Request.php new file mode 100644 index 00000000..5086a45b --- /dev/null +++ b/backend/app/Http/Requests/Request.php @@ -0,0 +1,18 @@ + 'required|string|max:20', + 'explain' => 'required|string|max:20', + 'resource' => 'nullable|string|max:50', + 'remark' => 'nullable|string|max:50', + ]; + } +} diff --git a/backend/app/Http/Requests/StoreStudentPost.php b/backend/app/Http/Requests/StoreStudentPost.php new file mode 100644 index 00000000..e7d70cac --- /dev/null +++ b/backend/app/Http/Requests/StoreStudentPost.php @@ -0,0 +1,47 @@ + 'required', + 'student_sex' => 'required|in:男,女', + 'student_phone' => 'required|unique:students', + 'student_status' => 'required|in:0,1' + ]; + } + + public function message() + { + return [ + 'student_name.required' => '学生信息必须填写', + 'student_sex.required' => '学生性别必须填写', + 'student_phone.required' => '电话号码必须填写', + 'student_status.required' => '学生状态必须填写', + 'student_sex.in' => '学生性别填写有误', + 'student_status.in' => '学生状态填写有误', + 'student_phone.unique' => '学生电话号码不能重复' + ]; + } +} diff --git a/backend/app/Http/Requests/UpdateStudentPatch.php b/backend/app/Http/Requests/UpdateStudentPatch.php new file mode 100644 index 00000000..b177c48c --- /dev/null +++ b/backend/app/Http/Requests/UpdateStudentPatch.php @@ -0,0 +1,39 @@ +route('student')->student_id; + return [ + 'student_name' => 'required', + 'student_sex' => 'required|in:男,女', + 'student_phone' => [ + 'required', + Rule::unique('students')->ignore($id, 'student_id'), + ], + 'student_status' => 'required|in:0,1' + ]; + } + +} diff --git a/backend/app/Http/Resources/Permission.php b/backend/app/Http/Resources/Permission.php new file mode 100644 index 00000000..80d1d006 --- /dev/null +++ b/backend/app/Http/Resources/Permission.php @@ -0,0 +1,36 @@ + $this->id, + 'name'=> $this->name, + 'pid'=> $this->pid, + 'type'=> $this->type, + 'method'=> $this->method, + 'route_name'=> $this->route_name, + 'route_match'=> $this->route_match, + 'remark'=> $this->remark + ]; + } + + public function with($request) + { + return [ + 'status' => 'success', + 'status_code' => 200 + ]; + } +} diff --git a/api/app/Http/Resources/PermissionCollection.php b/backend/app/Http/Resources/PermissionCollection.php similarity index 100% rename from api/app/Http/Resources/PermissionCollection.php rename to backend/app/Http/Resources/PermissionCollection.php diff --git a/backend/app/Http/Resources/Role.php b/backend/app/Http/Resources/Role.php new file mode 100644 index 00000000..3dbd9f58 --- /dev/null +++ b/backend/app/Http/Resources/Role.php @@ -0,0 +1,33 @@ + $this->id, + 'name' => $this->name, + 'explain' => $this->explain, + 'permission' => explode(',', $this->permission), + 'remark' => $this->remark + ]; + } + + public function with($request) + { + return [ + 'status' => 'success', + 'status_code' => 200 + ]; + } +} diff --git a/api/app/Http/Resources/RoleCollection.php b/backend/app/Http/Resources/RoleCollection.php similarity index 77% rename from api/app/Http/Resources/RoleCollection.php rename to backend/app/Http/Resources/RoleCollection.php index 9b1bf41e..fb63f473 100644 --- a/api/app/Http/Resources/RoleCollection.php +++ b/backend/app/Http/Resources/RoleCollection.php @@ -15,9 +15,9 @@ class RoleCollection extends ResourceCollection public function toArray($request) { return [ - 'data' => $this->collection, - 'status' => 'success', - 'status_code' => 200 + 'data' => $this->collection, + 'status' => 'success', + 'status_code' => 200 ]; } } diff --git a/backend/app/Http/Resources/Session.php b/backend/app/Http/Resources/Session.php new file mode 100644 index 00000000..1708cd0b --- /dev/null +++ b/backend/app/Http/Resources/Session.php @@ -0,0 +1,38 @@ + $this->id, + 'year' => $this->year, + 'team' => $this->team, + 'remark' => $this->remark, + 'one' => $this->one, + 'two' => $this->two, + 'three' => $this->three + ]; + } + + public function with($request) + { + return [ + 'status' => 'success', + 'status_code' => 200 + ]; + } + + + +} diff --git a/backend/app/Http/Resources/SessionCollection.php b/backend/app/Http/Resources/SessionCollection.php new file mode 100644 index 00000000..93e12fbc --- /dev/null +++ b/backend/app/Http/Resources/SessionCollection.php @@ -0,0 +1,24 @@ + $this->collection, + 'status' => 'success', + 'status_code' => '200' + ]; + } + +} diff --git a/backend/app/Http/Resources/Student.php b/backend/app/Http/Resources/Student.php new file mode 100644 index 00000000..1c66571e --- /dev/null +++ b/backend/app/Http/Resources/Student.php @@ -0,0 +1,34 @@ + $this->student_id, + 'student_name' => $this->student_name, + 'student_sex' => $this->student_sex, + 'student_phone' => $this->student_phone, + 'student_status' => $this->student_status, + 'student_remark' =>$this->student_remark, + ]; + } + + public function with($request) + { + return [ + 'status' => 'success', + 'status_code' => 200 + ]; + } +} diff --git a/backend/app/Http/Resources/StudentCollection.php b/backend/app/Http/Resources/StudentCollection.php new file mode 100644 index 00000000..1bb5d463 --- /dev/null +++ b/backend/app/Http/Resources/StudentCollection.php @@ -0,0 +1,23 @@ + $this->collection, + 'status' => 'success', + 'status_code' => '200' + ]; + } +} diff --git a/backend/app/Listeners/EventListener.php b/backend/app/Listeners/EventListener.php new file mode 100644 index 00000000..dbf33374 --- /dev/null +++ b/backend/app/Listeners/EventListener.php @@ -0,0 +1,31 @@ +saveLoginLog(); + } +} diff --git a/backend/app/Listeners/WriteLogoutEventToLog.php b/backend/app/Listeners/WriteLogoutEventToLog.php new file mode 100644 index 00000000..af0cfa2e --- /dev/null +++ b/backend/app/Listeners/WriteLogoutEventToLog.php @@ -0,0 +1,34 @@ +saveLogoutLog($event->user); + } +} diff --git a/backend/app/Listeners/WriteOperationEventToLog.php b/backend/app/Listeners/WriteOperationEventToLog.php new file mode 100644 index 00000000..727d2150 --- /dev/null +++ b/backend/app/Listeners/WriteOperationEventToLog.php @@ -0,0 +1,34 @@ +log($event->info); + } +} diff --git a/backend/app/Models/Dict.php b/backend/app/Models/Dict.php new file mode 100644 index 00000000..e4a8c085 --- /dev/null +++ b/backend/app/Models/Dict.php @@ -0,0 +1,11 @@ +year.'年'.$time->month.'月'.$time->day.'日'.$time->hour.'时'.$time->minute.'分'.$time->second.'秒'; + $data = [ + 'user_id' => Auth::user()->id, + 'user_name' => Auth::user()->name, + 'ip' => $request->ip(), + 'type' => 'login', + 'desc' => Auth::user()->name.'于'.$strTime.'登录系统', + 'created_at' => $time, + 'updated_at' => $time + ]; + $this->insert($data); + } + + public function saveLogoutLog($user) + { + //dd($user); + $request = request(); + $time = Carbon::now(); + $strTime = $time->year.'年'.$time->month.'月'.$time->day.'日'.$time->hour.'时'.$time->minute.'分'.$time->second.'秒'; + $data = [ + 'user_id' => $user->id, + 'user_name' => $user->name, + 'ip' => $request->ip(), + 'type' => 'logout', + 'desc' => $user->name.'于'.$strTime.'退出系统', + 'created_at' => $time, + 'updated_at' => $time + ]; + $this->insert($data); + } +} diff --git a/backend/app/Models/LogWork.php b/backend/app/Models/LogWork.php new file mode 100644 index 00000000..d38ee44a --- /dev/null +++ b/backend/app/Models/LogWork.php @@ -0,0 +1,31 @@ +year.'年'.$time->month.'月'.$time->day.'日'.$time->hour.'时'.$time->minute.'分'.$time->second.'秒'; + $data = [ + 'user_id' => Auth::user()->id, + 'user_name' => Auth::user()->name, + 'ip' => $request->ip(), + 'type' => $info['type'], + 'desc' => $info['desc'], + 'route_name' => $info['route_name'], + 'created_at' => $time, + 'updated_at' => $time + ]; + $this->insert($data); + } +} diff --git a/backend/app/Models/Model.php b/backend/app/Models/Model.php new file mode 100644 index 00000000..b3737e2c --- /dev/null +++ b/backend/app/Models/Model.php @@ -0,0 +1,20 @@ +orderBy('create_at', 'desc'); + } + + +} \ No newline at end of file diff --git a/backend/app/Models/Permission.php b/backend/app/Models/Permission.php new file mode 100644 index 00000000..ef16ed83 --- /dev/null +++ b/backend/app/Models/Permission.php @@ -0,0 +1,39 @@ +input('name'); + if (isset($name)) { + return $query->where('name', 'like', '%'.$name.'%'); + } else { + return $query; + } + } + + public function scopePid($query) + { + $val = request()->input('pid'); + if (isset($val)) { + return $query->where('id', (int)$val)->orWhere('pid', (int)$val); + } else { + return $query; + } + } + + public function scopeType($query) + { + $val = request()->input('type'); + if (isset($val)) { + return $query->where('type', (int)$val); + } else { + return $query; + } + } +} diff --git a/backend/app/Models/Role.php b/backend/app/Models/Role.php new file mode 100644 index 00000000..80bf70d1 --- /dev/null +++ b/backend/app/Models/Role.php @@ -0,0 +1,10 @@ +input('name'); + if (isset($name)) { + return $query = $query->where('name', 'like', '%'.$name.'%'); + } else { + return $query; + } + } + + public function scopeEmail($query) + { + $email = request()->input('email'); + if (isset($email)) { + return $query = $query->where('email', 'like', '%'.$email.'%'); + } else { + return $query; + } + } +} diff --git a/backend/app/Policies/Policy.php b/backend/app/Policies/Policy.php new file mode 100644 index 00000000..c6dbffd2 --- /dev/null +++ b/backend/app/Policies/Policy.php @@ -0,0 +1,28 @@ +isAdmin()) { + return true; + } + } +} \ No newline at end of file diff --git a/backend/app/Providers/AppServiceProvider.php b/backend/app/Providers/AppServiceProvider.php new file mode 100644 index 00000000..a34a648a --- /dev/null +++ b/backend/app/Providers/AppServiceProvider.php @@ -0,0 +1,34 @@ +app->singleton(FakerGenerator::class, function (){ + return FakerFactory::create('zh_CN'); + }); + } + + /** + * Register any application services. + * + * @return void + */ + public function register() + { + // + } +} diff --git a/backend/app/Providers/AuthServiceProvider.php b/backend/app/Providers/AuthServiceProvider.php new file mode 100644 index 00000000..48614762 --- /dev/null +++ b/backend/app/Providers/AuthServiceProvider.php @@ -0,0 +1,37 @@ + 'App\Policies\ModelPolicy', + ]; + + /** + * Register any authentication / authorization services. + * + * @return void + */ + public function boot() + { + $this->registerPolicies(); + + Passport::routes(); + Passport::tokensExpireIn(Carbon::now()->addMinute(100)); + + Passport::refreshTokensExpireIn(Carbon::now()->addDays(30)); + + // + } +} diff --git a/api/app/Providers/BroadcastServiceProvider.php b/backend/app/Providers/BroadcastServiceProvider.php similarity index 82% rename from api/app/Providers/BroadcastServiceProvider.php rename to backend/app/Providers/BroadcastServiceProvider.php index 7f08c6e5..352cce44 100644 --- a/api/app/Providers/BroadcastServiceProvider.php +++ b/backend/app/Providers/BroadcastServiceProvider.php @@ -2,8 +2,8 @@ namespace App\Providers; -use Illuminate\Support\Facades\Broadcast; use Illuminate\Support\ServiceProvider; +use Illuminate\Support\Facades\Broadcast; class BroadcastServiceProvider extends ServiceProvider { @@ -14,7 +14,8 @@ class BroadcastServiceProvider extends ServiceProvider */ public function boot() { - Broadcast::routes(["prefix" => 'api',"middleware" => "auth:api"]); + Broadcast::routes(); + require base_path('routes/channels.php'); } } diff --git a/backend/app/Providers/EventServiceProvider.php b/backend/app/Providers/EventServiceProvider.php new file mode 100644 index 00000000..9a2c72e0 --- /dev/null +++ b/backend/app/Providers/EventServiceProvider.php @@ -0,0 +1,38 @@ + [ + 'App\Listeners\EventListener', + ], + 'App\Events\UserLogin' => [ + 'App\Listeners\WriteLoginEventToLog', + ], + 'App\Events\UserLogout' => [ + 'App\Listeners\WriteLogoutEventToLog', + ], + ]; + + /** + * Register any events for your application. + * + * @return void + */ + public function boot() + { + parent::boot(); + + // + } +} diff --git a/api/app/Providers/RouteServiceProvider.php b/backend/app/Providers/RouteServiceProvider.php similarity index 91% rename from api/app/Providers/RouteServiceProvider.php rename to backend/app/Providers/RouteServiceProvider.php index 527eee34..5ea48d39 100644 --- a/api/app/Providers/RouteServiceProvider.php +++ b/backend/app/Providers/RouteServiceProvider.php @@ -2,8 +2,8 @@ namespace App\Providers; -use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Route; +use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; class RouteServiceProvider extends ServiceProvider { @@ -16,13 +16,6 @@ class RouteServiceProvider extends ServiceProvider */ protected $namespace = 'App\Http\Controllers'; - /** - * The path to the "home" route for your application. - * - * @var string - */ - public const HOME = '/home'; - /** * Define your route model bindings, pattern filters, etc. * diff --git a/backend/app/Resources/User.php b/backend/app/Resources/User.php new file mode 100644 index 00000000..1e8eac47 --- /dev/null +++ b/backend/app/Resources/User.php @@ -0,0 +1,33 @@ + $this->id, + 'name' => $this->name, + 'email' => $this->email, + 'role' => explode(',',$this->role), + 'avatar' => $this->avatar + ]; + } + + public function with($request) + { + return [ + 'status' => 'success', + 'status_code' => 200, + ]; + } +} diff --git a/backend/app/Resources/UserCollection.php b/backend/app/Resources/UserCollection.php new file mode 100644 index 00000000..3a9c12c1 --- /dev/null +++ b/backend/app/Resources/UserCollection.php @@ -0,0 +1,23 @@ + $this->collection, + 'status' => 'success', + 'status_code' => 200 + ]; + } +} diff --git a/backend/app/Rules/Telphone.php b/backend/app/Rules/Telphone.php new file mode 100644 index 00000000..70ab128b --- /dev/null +++ b/backend/app/Rules/Telphone.php @@ -0,0 +1,42 @@ +singleton( + Illuminate\Contracts\Http\Kernel::class, + App\Http\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Console\Kernel::class, + App\Console\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Debug\ExceptionHandler::class, + App\Exceptions\Handler::class +); + +/* +|-------------------------------------------------------------------------- +| Return The Application +|-------------------------------------------------------------------------- +| +| This script returns the application instance. The instance is given to +| the calling script so we can separate the building of the instances +| from the actual running of the application and sending responses. +| +*/ + +return $app; diff --git a/api/bootstrap/cache/.gitignore b/backend/bootstrap/cache/.gitignore similarity index 100% rename from api/bootstrap/cache/.gitignore rename to backend/bootstrap/cache/.gitignore diff --git a/backend/bootstrap/helpers.php b/backend/bootstrap/helpers.php new file mode 100644 index 00000000..b2fa0d48 --- /dev/null +++ b/backend/bootstrap/helpers.php @@ -0,0 +1,74 @@ + 17){ + die('Invalid Length'); + } + $factor = array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2); + $sums = 0; + for ($i=0;$i< 17;$i++){ + $sums += substr($base,$i,1) * $factor[$i]; + } + $mods = $sums % 11;//10X98765432 + + switch ($mods){ + case 0: return '1';break; + case 1: return '0';break; + case 2: return 'x';break; + case 3: return '9';break; + case 4: return '8';break; + case 5: return '7';break; + case 6: return '6';break; + case 7: return '5';break; + case 8: return '4';break; + case 9: return '3';break; + case 10: return '2';break; + + } +} + diff --git a/backend/composer.json b/backend/composer.json new file mode 100644 index 00000000..5566289d --- /dev/null +++ b/backend/composer.json @@ -0,0 +1,65 @@ +{ + "name": "laravel/laravel", + "description": "The Laravel Framework.", + "keywords": ["framework", "laravel"], + "license": "MIT", + "type": "project", + "require": { + "php": ">=7.0.0", + "barryvdh/laravel-cors": "^0.10.0", + "doctrine/dbal": "^2.5", + "fideloper/proxy": "~3.3", + "guzzlehttp/guzzle": "^6.3", + "laravel/framework": "5.5.*", + "laravel/passport": "^4.0", + "laravel/tinker": "~1.0", + "maatwebsite/excel": "~2.1.0", + "overtrue/easy-sms": "^1.0", + "overtrue/laravel-socialite": "~2.0", + "pusher/pusher-php-server": "^3.0" + }, + "require-dev": { + "filp/whoops": "~2.0", + "fzaninotto/faker": "~1.4", + "mockery/mockery": "0.9.*", + "phpunit/phpunit": "~6.0", + "xethron/migrations-generator": "^2.0" + }, + "autoload": { + "classmap": [ + "database/seeds", + "database/factories" + ], + "psr-4": { + "App\\": "app/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, + "extra": { + "laravel": { + "dont-discover": [ + ] + } + }, + "scripts": { + "post-root-package-install": [ + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" + ], + "post-create-project-cmd": [ + "@php artisan key:generate" + ], + "post-autoload-dump": [ + "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", + "@php artisan package:discover" + ] + }, + "config": { + "preferred-install": "dist", + "sort-packages": true, + "optimize-autoloader": true + } +} diff --git a/backend/composer.lock b/backend/composer.lock new file mode 100644 index 00000000..a49d21d8 --- /dev/null +++ b/backend/composer.lock @@ -0,0 +1,5781 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "content-hash": "a5e6c3067d9e362e6b0bed02d6a7fbf5", + "packages": [ + { + "name": "barryvdh/laravel-cors", + "version": "v0.10.1", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-cors.git", + "reference": "b64caccbfc33b9ee2ba7dcce3307590882ede9ad" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/barryvdh/laravel-cors/b64caccbfc33b9ee2ba7dcce3307590882ede9ad.zip", + "reference": "b64caccbfc33b9ee2ba7dcce3307590882ede9ad", + "shasum": "" + }, + "require": { + "illuminate/support": "5.3.x|5.4.x|5.5.x", + "php": ">=5.5.9", + "symfony/http-foundation": "~3.1", + "symfony/http-kernel": "~3.1" + }, + "require-dev": { + "orchestra/testbench": "3.x", + "phpunit/phpunit": "^4.8|^5.2", + "squizlabs/php_codesniffer": "^2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.10-dev" + }, + "laravel": { + "providers": [ + "Barryvdh\\Cors\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Barryvdh\\Cors\\": "src/" + }, + "classmap": [ + "tests" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Laravel application", + "keywords": [ + "api", + "cors", + "crossdomain", + "laravel" + ], + "time": "2017-12-19T21:08:24+00:00" + }, + { + "name": "defuse/php-encryption", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/defuse/php-encryption.git", + "reference": "0d4d27c368ca6798bc162469e43248c363c73495" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/defuse/php-encryption/0d4d27c368ca6798bc162469e43248c363c73495.zip", + "reference": "0d4d27c368ca6798bc162469e43248c363c73495", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "paragonie/random_compat": "~2.0", + "php": ">=5.4.0" + }, + "require-dev": { + "nikic/php-parser": "^2.0|^3.0|^4.0", + "phpunit/phpunit": "^4|^5" + }, + "bin": [ + "bin/generate-defuse-key" + ], + "type": "library", + "autoload": { + "psr-4": { + "Defuse\\Crypto\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Hornby", + "email": "taylor@defuse.ca", + "homepage": "https://defuse.ca/" + }, + { + "name": "Scott Arciszewski", + "email": "info@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "Secure PHP Encryption Library", + "keywords": [ + "aes", + "authenticated encryption", + "cipher", + "crypto", + "cryptography", + "encrypt", + "encryption", + "openssl", + "security", + "symmetric key cryptography" + ], + "time": "2018-04-23T19:33:40+00:00" + }, + { + "name": "dnoegel/php-xdg-base-dir", + "version": "0.1", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/dnoegel/php-xdg-base-dir/265b8593498b997dc2d31e75b89f053b5cc9621a.zip", + "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "@stable" + }, + "type": "project", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php", + "time": "2014-10-24T07:27:01+00:00" + }, + { + "name": "doctrine/annotations", + "version": "v1.6.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/doctrine/annotations/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5.zip", + "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "php": "^7.1" + }, + "require-dev": { + "doctrine/cache": "1.*", + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "time": "2017-12-06T07:11:42+00:00" + }, + { + "name": "doctrine/cache", + "version": "v1.7.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "b3217d58609e9c8e661cd41357a54d926c4a2a1a" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/doctrine/cache/b3217d58609e9c8e661cd41357a54d926c4a2a1a.zip", + "reference": "b3217d58609e9c8e661cd41357a54d926c4a2a1a", + "shasum": "" + }, + "require": { + "php": "~7.1" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "alcaeus/mongo-php-adapter": "^1.1", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^5.7", + "predis/predis": "~1.0" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.7.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Caching library offering an object-oriented API for many cache backends", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "cache", + "caching" + ], + "time": "2017-08-25T07:02:50+00:00" + }, + { + "name": "doctrine/collections", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "a01ee38fcd999f34d9bfbcee59dbda5105449cbf" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/doctrine/collections/a01ee38fcd999f34d9bfbcee59dbda5105449cbf.zip", + "reference": "a01ee38fcd999f34d9bfbcee59dbda5105449cbf", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "doctrine/coding-standard": "~0.1@dev", + "phpunit/phpunit": "^5.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Collections\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Collections Abstraction library", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "array", + "collections", + "iterator" + ], + "time": "2017-07-22T10:37:32+00:00" + }, + { + "name": "doctrine/common", + "version": "v2.8.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "f68c297ce6455e8fd794aa8ffaf9fa458f6ade66" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/doctrine/common/f68c297ce6455e8fd794aa8ffaf9fa458f6ade66.zip", + "reference": "f68c297ce6455e8fd794aa8ffaf9fa458f6ade66", + "shasum": "" + }, + "require": { + "doctrine/annotations": "1.*", + "doctrine/cache": "1.*", + "doctrine/collections": "1.*", + "doctrine/inflector": "1.*", + "doctrine/lexer": "1.*", + "php": "~7.1" + }, + "require-dev": { + "phpunit/phpunit": "^5.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Common Library for Doctrine projects", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "collections", + "eventmanager", + "persistence", + "spl" + ], + "time": "2017-08-31T08:43:38+00:00" + }, + { + "name": "doctrine/dbal", + "version": "v2.7.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "11037b4352c008373561dc6fc836834eed80c3b5" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/doctrine/dbal/11037b4352c008373561dc6fc836834eed80c3b5.zip", + "reference": "11037b4352c008373561dc6fc836834eed80c3b5", + "shasum": "" + }, + "require": { + "doctrine/common": "^2.7.1", + "ext-pdo": "*", + "php": "^7.1" + }, + "require-dev": { + "doctrine/coding-standard": "^4.0", + "phpunit/phpunit": "^7.0", + "phpunit/phpunit-mock-objects": "!=3.2.4,!=3.2.5", + "symfony/console": "^2.0.5||^3.0", + "symfony/phpunit-bridge": "^3.4.5|^4.0.5" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\DBAL\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Database Abstraction Layer", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "persistence", + "queryobject" + ], + "time": "2018-04-07T18:44:18+00:00" + }, + { + "name": "doctrine/inflector", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5527a48b7313d15261292c149e55e26eae771b0a" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/doctrine/inflector/5527a48b7313d15261292c149e55e26eae771b0a.zip", + "reference": "5527a48b7313d15261292c149e55e26eae771b0a", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Common String Manipulations with regard to casing and singular/plural rules.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "inflection", + "pluralize", + "singularize", + "string" + ], + "time": "2018-01-09T20:05:19+00:00" + }, + { + "name": "doctrine/lexer", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/doctrine/lexer/83893c552fd2045dd78aef794c31e694c37c0b8c.zip", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Lexer\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "lexer", + "parser" + ], + "time": "2014-09-09T13:34:57+00:00" + }, + { + "name": "egulias/email-validator", + "version": "2.1.4", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "8790f594151ca6a2010c6218e09d96df67173ad3" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/egulias/EmailValidator/8790f594151ca6a2010c6218e09d96df67173ad3.zip", + "reference": "8790f594151ca6a2010c6218e09d96df67173ad3", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">= 5.5" + }, + "require-dev": { + "dominicsayers/isemail": "dev-master", + "phpunit/phpunit": "^4.8.35||^5.7||^6.0", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "EmailValidator" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "time": "2018-04-10T10:11:19+00:00" + }, + { + "name": "erusev/parsedown", + "version": "1.7.1", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown.git", + "reference": "92e9c27ba0e74b8b028b111d1b6f956a15c01fc1" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/erusev/parsedown/92e9c27ba0e74b8b028b111d1b6f956a15c01fc1.zip", + "reference": "92e9c27ba0e74b8b028b111d1b6f956a15c01fc1", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35" + }, + "type": "library", + "autoload": { + "psr-0": { + "Parsedown": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "description": "Parser for Markdown.", + "homepage": "http://parsedown.org", + "keywords": [ + "markdown", + "parser" + ], + "time": "2018-03-08T01:11:30+00:00" + }, + { + "name": "fideloper/proxy", + "version": "3.3.4", + "source": { + "type": "git", + "url": "https://github.com/fideloper/TrustedProxy.git", + "reference": "9cdf6f118af58d89764249bbcc7bb260c132924f" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/fideloper/TrustedProxy/9cdf6f118af58d89764249bbcc7bb260c132924f.zip", + "reference": "9cdf6f118af58d89764249bbcc7bb260c132924f", + "shasum": "" + }, + "require": { + "illuminate/contracts": "~5.0", + "php": ">=5.4.0" + }, + "require-dev": { + "illuminate/http": "~5.0", + "mockery/mockery": "~0.9.3", + "phpunit/phpunit": "^5.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + }, + "laravel": { + "providers": [ + "Fideloper\\Proxy\\TrustedProxyServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Fideloper\\Proxy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Fidao", + "email": "fideloper@gmail.com" + } + ], + "description": "Set trusted proxies for Laravel", + "keywords": [ + "load balancing", + "proxy", + "trusted proxy" + ], + "time": "2017-06-15T17:19:42+00:00" + }, + { + "name": "firebase/php-jwt", + "version": "v5.0.0", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/firebase/php-jwt/9984a4d3a32ae7673d6971ea00bae9d0a1abba0e.zip", + "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": " 4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "time": "2017-06-27T22:17:23+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.3.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/guzzle/guzzle/407b0cb880ace85c9b63c5f9551db498cb2d50ba.zip", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "shasum": "" + }, + "require": { + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.4", + "php": ">=5.5" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.0" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.3-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2018-04-22T15:46:56+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/guzzle/promises/a59da6cf61d80060647ff4d3eb2c03a2bc694646.zip", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2016-12-20T10:07:11+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/guzzle/psr7/f5b8a8512e2b58b0071a7280e39f14f72e05d87c.zip", + "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2017-03-20T17:10:46+00:00" + }, + { + "name": "jakub-onderka/php-console-color", + "version": "0.1", + "source": { + "type": "git", + "url": "https://github.com/JakubOnderka/PHP-Console-Color.git", + "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/JakubOnderka/PHP-Console-Color/e0b393dacf7703fc36a4efc3df1435485197e6c1.zip", + "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "jakub-onderka/php-code-style": "1.0", + "jakub-onderka/php-parallel-lint": "0.*", + "jakub-onderka/php-var-dump-check": "0.*", + "phpunit/phpunit": "3.7.*", + "squizlabs/php_codesniffer": "1.*" + }, + "type": "library", + "autoload": { + "psr-0": { + "JakubOnderka\\PhpConsoleColor": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Jakub Onderka", + "email": "jakub.onderka@gmail.com", + "homepage": "http://www.acci.cz" + } + ], + "time": "2014-04-08T15:00:19+00:00" + }, + { + "name": "jakub-onderka/php-console-highlighter", + "version": "v0.3.2", + "source": { + "type": "git", + "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git", + "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/JakubOnderka/PHP-Console-Highlighter/7daa75df45242c8d5b75a22c00a201e7954e4fb5.zip", + "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5", + "shasum": "" + }, + "require": { + "jakub-onderka/php-console-color": "~0.1", + "php": ">=5.3.0" + }, + "require-dev": { + "jakub-onderka/php-code-style": "~1.0", + "jakub-onderka/php-parallel-lint": "~0.5", + "jakub-onderka/php-var-dump-check": "~0.1", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~1.5" + }, + "type": "library", + "autoload": { + "psr-0": { + "JakubOnderka\\PhpConsoleHighlighter": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jakub Onderka", + "email": "acci@acci.cz", + "homepage": "http://www.acci.cz/" + } + ], + "time": "2015-04-20T18:58:01+00:00" + }, + { + "name": "jeremeamia/SuperClosure", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/jeremeamia/super_closure.git", + "reference": "5707d5821b30b9a07acfb4d76949784aaa0e9ce9" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/jeremeamia/super_closure/5707d5821b30b9a07acfb4d76949784aaa0e9ce9.zip", + "reference": "5707d5821b30b9a07acfb4d76949784aaa0e9ce9", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^1.2|^2.0|^3.0|^4.0", + "php": ">=5.4", + "symfony/polyfill-php56": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "SuperClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia", + "role": "Developer" + } + ], + "description": "Serialize Closure objects, including their context and binding", + "homepage": "https://github.com/jeremeamia/super_closure", + "keywords": [ + "closure", + "function", + "lambda", + "parser", + "serializable", + "serialize", + "tokenizer" + ], + "time": "2018-03-21T22:21:57+00:00" + }, + { + "name": "laravel/framework", + "version": "v5.5.40", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "d724ce0aa61bbd9adf658215eec484f5dd6711d6" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/laravel/framework/d724ce0aa61bbd9adf658215eec484f5dd6711d6.zip", + "reference": "d724ce0aa61bbd9adf658215eec484f5dd6711d6", + "shasum": "" + }, + "require": { + "doctrine/inflector": "~1.1", + "erusev/parsedown": "~1.7", + "ext-mbstring": "*", + "ext-openssl": "*", + "league/flysystem": "^1.0.8", + "monolog/monolog": "~1.12", + "mtdowling/cron-expression": "~1.0", + "nesbot/carbon": "^1.24.1", + "php": ">=7.0", + "psr/container": "~1.0", + "psr/simple-cache": "^1.0", + "ramsey/uuid": "~3.0", + "swiftmailer/swiftmailer": "~6.0", + "symfony/console": "~3.3", + "symfony/debug": "~3.3", + "symfony/finder": "~3.3", + "symfony/http-foundation": "~3.3", + "symfony/http-kernel": "~3.3", + "symfony/process": "~3.3", + "symfony/routing": "~3.3", + "symfony/var-dumper": "~3.3", + "tijsverkoyen/css-to-inline-styles": "~2.2", + "vlucas/phpdotenv": "~2.2" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version", + "tightenco/collect": "<5.5.33" + }, + "require-dev": { + "aws/aws-sdk-php": "~3.0", + "doctrine/dbal": "~2.5", + "filp/whoops": "^2.1.4", + "mockery/mockery": "~1.0", + "orchestra/testbench-core": "3.5.*", + "pda/pheanstalk": "~3.0", + "phpunit/phpunit": "~6.0", + "predis/predis": "^1.1.1", + "symfony/css-selector": "~3.3", + "symfony/dom-crawler": "~3.3" + }, + "suggest": { + "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.5).", + "ext-pcntl": "Required to use all features of the queue worker.", + "ext-posix": "Required to use all features of the queue worker.", + "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", + "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~6.0).", + "laravel/tinker": "Required to use the tinker console command (~1.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", + "league/flysystem-cached-adapter": "Required to use Flysystem caching (~1.0).", + "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", + "nexmo/client": "Required to use the Nexmo transport (~1.0).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).", + "predis/predis": "Required to use the redis cache and queue drivers (~1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~3.0).", + "symfony/css-selector": "Required to use some of the crawler integration testing tools (~3.3).", + "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~3.3).", + "symfony/psr-http-message-bridge": "Required to psr7 bridging features (~1.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.5-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "time": "2018-03-30T13:29:30+00:00" + }, + { + "name": "laravel/passport", + "version": "v4.0.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/passport.git", + "reference": "0542f1f82edfbf857d0197c34a3d41f549aff30a" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/laravel/passport/0542f1f82edfbf857d0197c34a3d41f549aff30a.zip", + "reference": "0542f1f82edfbf857d0197c34a3d41f549aff30a", + "shasum": "" + }, + "require": { + "firebase/php-jwt": "~3.0|~4.0|~5.0", + "guzzlehttp/guzzle": "~6.0", + "illuminate/auth": "~5.4", + "illuminate/console": "~5.4", + "illuminate/container": "~5.4", + "illuminate/contracts": "~5.4", + "illuminate/database": "~5.4", + "illuminate/encryption": "~5.4", + "illuminate/http": "~5.4", + "illuminate/support": "~5.4", + "league/oauth2-server": "^6.0", + "php": ">=5.6.4", + "phpseclib/phpseclib": "^2.0", + "symfony/psr-http-message-bridge": "~1.0", + "zendframework/zend-diactoros": "~1.0" + }, + "require-dev": { + "mockery/mockery": "~0.9", + "phpunit/phpunit": "~5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Passport\\PassportServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Passport\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Passport provides OAuth2 server support to Laravel.", + "keywords": [ + "laravel", + "oauth", + "passport" + ], + "time": "2017-09-24T14:21:39+00:00" + }, + { + "name": "laravel/tinker", + "version": "v1.0.7", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "e3086ee8cb1f54a39ae8dcb72d1c37d10128997d" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/laravel/tinker/e3086ee8cb1f54a39ae8dcb72d1c37d10128997d.zip", + "reference": "e3086ee8cb1f54a39ae8dcb72d1c37d10128997d", + "shasum": "" + }, + "require": { + "illuminate/console": "~5.1", + "illuminate/contracts": "~5.1", + "illuminate/support": "~5.1", + "php": ">=5.5.9", + "psy/psysh": "0.7.*|0.8.*|0.9.*", + "symfony/var-dumper": "~3.0|~4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0|~5.0" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (~5.1)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "time": "2018-05-17T13:42:07+00:00" + }, + { + "name": "lcobucci/jwt", + "version": "3.2.2", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/jwt.git", + "reference": "0b5930be73582369e10c4d4bb7a12bac927a203c" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/lcobucci/jwt/0b5930be73582369e10c4d4bb7a12bac927a203c.zip", + "reference": "0b5930be73582369e10c4d4bb7a12bac927a203c", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "php": ">=5.5" + }, + "require-dev": { + "mdanter/ecc": "~0.3.1", + "mikey179/vfsstream": "~1.5", + "phpmd/phpmd": "~2.2", + "phpunit/php-invoker": "~1.1", + "phpunit/phpunit": "~4.5", + "squizlabs/php_codesniffer": "~2.3" + }, + "suggest": { + "mdanter/ecc": "Required to use Elliptic Curves based algorithms." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Lcobucci\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Luís Otávio Cobucci Oblonczyk", + "email": "lcobucci@gmail.com", + "role": "Developer" + } + ], + "description": "A simple library to work with JSON Web Token and JSON Web Signature", + "keywords": [ + "JWS", + "jwt" + ], + "time": "2017-09-01T08:23:26+00:00" + }, + { + "name": "league/event", + "version": "2.1.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/event.git", + "reference": "e4bfc88dbcb60c8d8a2939a71f9813e141bbe4cd" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/thephpleague/event/e4bfc88dbcb60c8d8a2939a71f9813e141bbe4cd.zip", + "reference": "e4bfc88dbcb60c8d8a2939a71f9813e141bbe4cd", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "~1.0.1", + "phpspec/phpspec": "~2.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Event\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Event package", + "keywords": [ + "emitter", + "event", + "listener" + ], + "time": "2015-05-21T12:24:47+00:00" + }, + { + "name": "league/flysystem", + "version": "1.0.45", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "a99f94e63b512d75f851b181afcdf0ee9ebef7e6" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/thephpleague/flysystem/a99f94e63b512d75f851b181afcdf0ee9ebef7e6.zip", + "reference": "a99f94e63b512d75f851b181afcdf0ee9ebef7e6", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, + "require-dev": { + "ext-fileinfo": "*", + "phpspec/phpspec": "^3.4", + "phpunit/phpunit": "^5.7" + }, + "suggest": { + "ext-fileinfo": "Required for MimeType", + "ext-ftp": "Allows you to use FTP server storage", + "ext-openssl": "Allows you to use FTPS server storage", + "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", + "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", + "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", + "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", + "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", + "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", + "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", + "league/flysystem-webdav": "Allows you to use WebDAV storage", + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", + "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", + "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction: Many filesystems, one API.", + "keywords": [ + "Cloud Files", + "WebDAV", + "abstraction", + "aws", + "cloud", + "copy.com", + "dropbox", + "file systems", + "files", + "filesystem", + "filesystems", + "ftp", + "rackspace", + "remote", + "s3", + "sftp", + "storage" + ], + "time": "2018-05-07T08:44:23+00:00" + }, + { + "name": "league/oauth2-server", + "version": "6.1.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth2-server.git", + "reference": "a0cabb573c7cd5ee01803daec992d6ee3677c4ae" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/thephpleague/oauth2-server/a0cabb573c7cd5ee01803daec992d6ee3677c4ae.zip", + "reference": "a0cabb573c7cd5ee01803daec992d6ee3677c4ae", + "shasum": "" + }, + "require": { + "defuse/php-encryption": "^2.1", + "ext-openssl": "*", + "lcobucci/jwt": "^3.1", + "league/event": "^2.1", + "paragonie/random_compat": "^2.0", + "php": ">=5.6.0", + "psr/http-message": "^1.0" + }, + "replace": { + "league/oauth2server": "*", + "lncd/oauth2": "*" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.38 || ^5.7.21", + "zendframework/zend-diactoros": "^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\OAuth2\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Bilbie", + "email": "hello@alexbilbie.com", + "homepage": "http://www.alexbilbie.com", + "role": "Developer" + } + ], + "description": "A lightweight and powerful OAuth 2.0 authorization and resource server library with support for all the core specification grants. This library will allow you to secure your API with OAuth and allow your applications users to approve apps that want to access their data from your API.", + "homepage": "https://oauth2.thephpleague.com/", + "keywords": [ + "Authentication", + "api", + "auth", + "authorisation", + "authorization", + "oauth", + "oauth 2", + "oauth 2.0", + "oauth2", + "protect", + "resource", + "secure", + "server" + ], + "time": "2017-12-23T23:33:42+00:00" + }, + { + "name": "maatwebsite/excel", + "version": "2.1.28", + "source": { + "type": "git", + "url": "https://github.com/Maatwebsite/Laravel-Excel.git", + "reference": "06e397a30595d1082963d6aa5ec0c3a9961d70c8" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/Maatwebsite/Laravel-Excel/06e397a30595d1082963d6aa5ec0c3a9961d70c8.zip", + "reference": "06e397a30595d1082963d6aa5ec0c3a9961d70c8", + "shasum": "" + }, + "require": { + "illuminate/cache": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*|5.6.*", + "illuminate/config": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*|5.6.*", + "illuminate/filesystem": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*|5.6.*", + "illuminate/support": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*|5.6.*", + "jeremeamia/superclosure": "^2.3", + "nesbot/carbon": "~1.0", + "php": ">=5.5", + "phpoffice/phpexcel": "^1.8.1", + "tijsverkoyen/css-to-inline-styles": "~2.0" + }, + "require-dev": { + "mockery/mockery": "~1.0", + "orchestra/testbench": "3.1.*|3.2.*|3.3.*|3.4.*|3.5.*|3.6.*", + "phpseclib/phpseclib": "~1.0", + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "illuminate/http": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*|5.6.*", + "illuminate/queue": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*|5.6.*", + "illuminate/routing": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*|5.6.*", + "illuminate/view": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*|5.6.*" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Maatwebsite\\Excel\\ExcelServiceProvider" + ], + "aliases": { + "Excel": "Maatwebsite\\Excel\\Facades\\Excel" + } + } + }, + "autoload": { + "classmap": [ + "src/Maatwebsite/Excel" + ], + "psr-0": { + "Maatwebsite\\Excel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maatwebsite.nl", + "email": "patrick@maatwebsite.nl" + } + ], + "description": "An eloquent way of importing and exporting Excel and CSV in Laravel 4 with the power of PHPExcel", + "keywords": [ + "PHPExcel", + "batch", + "csv", + "excel", + "export", + "import", + "laravel" + ], + "time": "2018-05-09T14:34:18+00:00" + }, + { + "name": "monolog/monolog", + "version": "1.23.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/Seldaek/monolog/fd8c787753b3a2ad11bc60c063cff1358a32a3b4.zip", + "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "jakub-onderka/php-parallel-lint": "0.9", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "phpunit/phpunit": "~4.5", + "phpunit/phpunit-mock-objects": "2.3.0", + "ruflin/elastica": ">=0.90 <3.0", + "sentry/sentry": "^0.13", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "sentry/sentry": "Allow sending log messages to a Sentry server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "time": "2017-06-19T01:22:40+00:00" + }, + { + "name": "mtdowling/cron-expression", + "version": "v1.2.1", + "source": { + "type": "git", + "url": "https://github.com/mtdowling/cron-expression.git", + "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/mtdowling/cron-expression/9504fa9ea681b586028adaaa0877db4aecf32bad.zip", + "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0|~5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "time": "2017-01-23T04:29:33+00:00" + }, + { + "name": "nesbot/carbon", + "version": "1.30.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "863a1a651ea324e1838da3a52753a4239b9d4bea" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/briannesbitt/Carbon/863a1a651ea324e1838da3a52753a4239b9d4bea.zip", + "reference": "863a1a651ea324e1838da3a52753a4239b9d4bea", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/translation": "~2.6 || ~3.0 || ~4.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2", + "phpunit/phpunit": "^4.8.35 || ^5.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "http://nesbot.com" + } + ], + "description": "A simple API extension for DateTime.", + "homepage": "http://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "time": "2018-06-15T11:52:26+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "35b8caf75e791ba1b2d24fec1552168d72692b12" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/nikic/PHP-Parser/35b8caf75e791ba1b2d24fec1552168d72692b12.zip", + "reference": "35b8caf75e791ba1b2d24fec1552168d72692b12", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.5 || ^7.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "time": "2018-06-03T11:33:10+00:00" + }, + { + "name": "overtrue/easy-sms", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/overtrue/easy-sms.git", + "reference": "1c08e5a2d7ec519449733ab7dd58daaf9ecc3fd3" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/overtrue/easy-sms/1c08e5a2d7ec519449733ab7dd58daaf9ecc3fd3.zip", + "reference": "1c08e5a2d7ec519449733ab7dd58daaf9ecc3fd3", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.2", + "php": ">=5.6" + }, + "require-dev": { + "mockery/mockery": "1.0.x-dev", + "phpunit/phpunit": "^6.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Overtrue\\EasySms\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "overtrue", + "email": "i@overtrue.me" + } + ], + "description": "The easiest way to send short message.", + "time": "2018-06-14T13:33:57+00:00" + }, + { + "name": "overtrue/laravel-socialite", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/overtrue/laravel-socialite.git", + "reference": "dd24ad6ae71cd5f5f5a52bba72930c26e9d6de6a" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/overtrue/laravel-socialite/dd24ad6ae71cd5f5f5a52bba72930c26e9d6de6a.zip", + "reference": "dd24ad6ae71cd5f5f5a52bba72930c26e9d6de6a", + "shasum": "" + }, + "require": { + "overtrue/socialite": "~2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Overtrue\\LaravelSocialite\\ServiceProvider" + ], + "aliases": { + "Socialite": "Overtrue\\LaravelSocialite\\Socialite" + } + } + }, + "autoload": { + "psr-4": { + "Overtrue\\LaravelSocialite\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "overtrue", + "email": "anzhengchao@gmail.com" + } + ], + "description": "Social OAuth authentication for Laravel 5.", + "time": "2017-12-14T05:34:22+00:00" + }, + { + "name": "overtrue/socialite", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/overtrue/socialite.git", + "reference": "20bc0ac598aa41365c209bbe4cb5c0cf314d46b3" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/overtrue/socialite/20bc0ac598aa41365c209bbe4cb5c0cf314d46b3.zip", + "reference": "20bc0ac598aa41365c209bbe4cb5c0cf314d46b3", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "~5.0|~6.0", + "php": ">=7.0", + "symfony/http-foundation": "^2.7|^3.0|^4.0" + }, + "require-dev": { + "mockery/mockery": "~0.9", + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Overtrue\\Socialite\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "overtrue", + "email": "anzhengchao@gmail.com" + } + ], + "description": "A collection of OAuth 2 packages that extracts from laravel/socialite.", + "keywords": [ + "login", + "oauth", + "qq", + "social", + "wechat", + "weibo" + ], + "time": "2018-03-28T02:22:49+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v2.0.15", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "10bcb46e8f3d365170f6de9d05245aa066b81f09" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/paragonie/random_compat/10bcb46e8f3d365170f6de9d05245aa066b81f09.zip", + "reference": "10bcb46e8f3d365170f6de9d05245aa066b81f09", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "autoload": { + "files": [ + "lib/random.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "time": "2018-06-08T15:26:40+00:00" + }, + { + "name": "phpoffice/phpexcel", + "version": "1.8.1", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PHPExcel.git", + "reference": "372c7cbb695a6f6f1e62649381aeaa37e7e70b32" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/PHPOffice/PHPExcel/372c7cbb695a6f6f1e62649381aeaa37e7e70b32.zip", + "reference": "372c7cbb695a6f6f1e62649381aeaa37e7e70b32", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "ext-xmlwriter": "*", + "php": ">=5.2.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "PHPExcel": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL" + ], + "authors": [ + { + "name": "Maarten Balliauw", + "homepage": "http://blog.maartenballiauw.be" + }, + { + "name": "Mark Baker" + }, + { + "name": "Franck Lefevre", + "homepage": "http://blog.rootslabs.net" + }, + { + "name": "Erik Tilt" + } + ], + "description": "PHPExcel - OpenXML - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "http://phpexcel.codeplex.com", + "keywords": [ + "OpenXML", + "excel", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "abandoned": "phpoffice/phpspreadsheet", + "time": "2015-05-01T07:00:55+00:00" + }, + { + "name": "phpseclib/phpseclib", + "version": "2.0.11", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "7053f06f91b3de78e143d430e55a8f7889efc08b" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/phpseclib/phpseclib/7053f06f91b3de78e143d430e55a8f7889efc08b.zip", + "reference": "7053f06f91b3de78e143d430e55a8f7889efc08b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phing/phing": "~2.7", + "phpunit/phpunit": "^4.8.35|^5.7|^6.0", + "sami/sami": "~2.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "suggest": { + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "type": "library", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "time": "2018-04-15T16:55:05+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/php-fig/container/b7ce3b176482dbbc1245ebf52b181af44c2cf55f.zip", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/php-fig/http-message/f6561bf28d520154e4b0ec72be95418abe6d9363.zip", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/php-fig/log/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d.zip", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2016-10-10T12:19:37+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/php-fig/simple-cache/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b.zip", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.9.6", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "4a2ce86f199d51b6e2524214dc06835e872f4fce" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/bobthecow/psysh/4a2ce86f199d51b6e2524214dc06835e872f4fce.zip", + "reference": "4a2ce86f199d51b6e2524214dc06835e872f4fce", + "shasum": "" + }, + "require": { + "dnoegel/php-xdg-base-dir": "0.1", + "jakub-onderka/php-console-highlighter": "0.3.*", + "nikic/php-parser": "~1.3|~2.0|~3.0|~4.0", + "php": ">=5.4.0", + "symfony/console": "~2.3.10|^2.4.2|~3.0|~4.0", + "symfony/var-dumper": "~2.7|~3.0|~4.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2", + "hoa/console": "~2.15|~3.16", + "phpunit/phpunit": "~4.8.35|~5.0|~6.0|~7.0" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", + "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.", + "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-develop": "0.9.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "time": "2018-06-10T17:57:20+00:00" + }, + { + "name": "pusher/pusher-php-server", + "version": "v3.0.4", + "source": { + "type": "git", + "url": "https://github.com/pusher/pusher-http-php.git", + "reference": "1496ef5ae12670ff8ffe83b9f47d1e4514608d9b" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/pusher/pusher-http-php/1496ef5ae12670ff8ffe83b9f47d1e4514608d9b.zip", + "reference": "1496ef5ae12670ff8ffe83b9f47d1e4514608d9b", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "php": "^5.4 || ^7.0", + "psr/log": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8 || ^5.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Pusher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Library for interacting with the Pusher REST API", + "keywords": [ + "events", + "messaging", + "php-pusher-server", + "publish", + "push", + "pusher", + "real time", + "real-time", + "realtime", + "rest", + "trigger" + ], + "time": "2018-05-21T13:25:35+00:00" + }, + { + "name": "ramsey/uuid", + "version": "3.7.3", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "44abcdad877d9a46685a3a4d221e3b2c4b87cb76" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/ramsey/uuid/44abcdad877d9a46685a3a4d221e3b2c4b87cb76.zip", + "reference": "44abcdad877d9a46685a3a4d221e3b2c4b87cb76", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "^1.0|^2.0", + "php": "^5.4 || ^7.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "codeception/aspect-mock": "^1.0 | ~2.0.0", + "doctrine/annotations": "~1.2.0", + "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ^2.1", + "ircmaxell/random-lib": "^1.1", + "jakub-onderka/php-parallel-lint": "^0.9.0", + "mockery/mockery": "^0.9.9", + "moontoast/math": "^1.1", + "php-mock/php-mock-phpunit": "^0.3|^1.1", + "phpunit/phpunit": "^4.7|^5.0", + "squizlabs/php_codesniffer": "^2.3" + }, + "suggest": { + "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator", + "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator", + "ircmaxell/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).", + "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marijn Huizendveld", + "email": "marijn.huizendveld@gmail.com" + }, + { + "name": "Thibaud Fabre", + "email": "thibaud@aztech.io" + }, + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).", + "homepage": "https://github.com/ramsey/uuid", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "time": "2018-01-20T00:28:24+00:00" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v6.0.2", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "412333372fb6c8ffb65496a2bbd7321af75733fc" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/swiftmailer/swiftmailer/412333372fb6c8ffb65496a2bbd7321af75733fc.zip", + "reference": "412333372fb6c8ffb65496a2bbd7321af75733fc", + "shasum": "" + }, + "require": { + "egulias/email-validator": "~2.0", + "php": ">=7.0.0" + }, + "require-dev": { + "mockery/mockery": "~0.9.1", + "symfony/phpunit-bridge": "~3.3@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.0-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "http://swiftmailer.symfony.com", + "keywords": [ + "email", + "mail", + "mailer" + ], + "time": "2017-09-30T22:39:41+00:00" + }, + { + "name": "symfony/console", + "version": "v3.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "36f83f642443c46f3cf751d4d2ee5d047d757a27" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/symfony/console/36f83f642443c46f3cf751d4d2ee5d047d757a27.zip", + "reference": "36f83f642443c46f3cf751d4d2ee5d047d757a27", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/debug": "~2.8|~3.0|~4.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/process": "<3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.3|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~2.8|~3.0|~4.0", + "symfony/lock": "~3.4|~4.0", + "symfony/process": "~3.3|~4.0" + }, + "suggest": { + "psr/log-implementation": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2018-05-16T08:49:21+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v4.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "03ac71606ecb0b0ce792faa17d74cc32c2949ef4" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/symfony/css-selector/03ac71606ecb0b0ce792faa17d74cc32c2949ef4.zip", + "reference": "03ac71606ecb0b0ce792faa17d74cc32c2949ef4", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony CssSelector Component", + "homepage": "https://symfony.com", + "time": "2018-05-30T07:26:09+00:00" + }, + { + "name": "symfony/debug", + "version": "v3.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "b28fd73fefbac341f673f5efd707d539d6a19f68" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/symfony/debug/b28fd73fefbac341f673f5efd707d539d6a19f68.zip", + "reference": "b28fd73fefbac341f673f5efd707d539d6a19f68", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + }, + "require-dev": { + "symfony/http-kernel": "~2.8|~3.0|~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com", + "time": "2018-05-16T14:03:39+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v4.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "2391ed210a239868e7256eb6921b1bd83f3087b5" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/symfony/event-dispatcher/2391ed210a239868e7256eb6921b1bd83f3087b5.zip", + "reference": "2391ed210a239868e7256eb6921b1bd83f3087b5", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "conflict": { + "symfony/dependency-injection": "<3.4" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2018-04-06T07:35:57+00:00" + }, + { + "name": "symfony/finder", + "version": "v3.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "472a92f3df8b247b49ae364275fb32943b9656c6" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/symfony/finder/472a92f3df8b247b49ae364275fb32943b9656c6.zip", + "reference": "472a92f3df8b247b49ae364275fb32943b9656c6", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2018-05-16T08:49:21+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v3.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "a7b5fc605d1c215cea1122359044b1e682eb70c0" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/symfony/http-foundation/a7b5fc605d1c215cea1122359044b1e682eb70c0.zip", + "reference": "a7b5fc605d1c215cea1122359044b1e682eb70c0", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php70": "~1.6" + }, + "require-dev": { + "symfony/expression-language": "~2.8|~3.0|~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpFoundation Component", + "homepage": "https://symfony.com", + "time": "2018-05-25T11:07:31+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v3.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "3dac45df55ee0c5134c457a730cd68e2a2ce0445" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/symfony/http-kernel/3dac45df55ee0c5134c457a730cd68e2a2ce0445.zip", + "reference": "3dac45df55ee0c5134c457a730cd68e2a2ce0445", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "psr/log": "~1.0", + "symfony/debug": "~2.8|~3.0|~4.0", + "symfony/event-dispatcher": "~2.8|~3.0|~4.0", + "symfony/http-foundation": "^3.4.4|^4.0.4", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/config": "<2.8", + "symfony/dependency-injection": "<3.4.5|<4.0.5,>=4", + "symfony/var-dumper": "<3.3", + "twig/twig": "<1.34|<2.4,>=2" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/cache": "~1.0", + "symfony/browser-kit": "~2.8|~3.0|~4.0", + "symfony/class-loader": "~2.8|~3.0", + "symfony/config": "~2.8|~3.0|~4.0", + "symfony/console": "~2.8|~3.0|~4.0", + "symfony/css-selector": "~2.8|~3.0|~4.0", + "symfony/dependency-injection": "^3.4.5|^4.0.5", + "symfony/dom-crawler": "~2.8|~3.0|~4.0", + "symfony/expression-language": "~2.8|~3.0|~4.0", + "symfony/finder": "~2.8|~3.0|~4.0", + "symfony/process": "~2.8|~3.0|~4.0", + "symfony/routing": "~3.4|~4.0", + "symfony/stopwatch": "~2.8|~3.0|~4.0", + "symfony/templating": "~2.8|~3.0|~4.0", + "symfony/translation": "~2.8|~3.0|~4.0", + "symfony/var-dumper": "~3.3|~4.0" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "", + "symfony/finder": "", + "symfony/var-dumper": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpKernel Component", + "homepage": "https://symfony.com", + "time": "2018-05-25T13:16:28+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.8.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/symfony/polyfill-ctype/7cc359f1b7b80fc25ed7796be7d96adc9b354bae.zip", + "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2018-04-30T19:57:29+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.8.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "3296adf6a6454a050679cde90f95350ad604b171" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/symfony/polyfill-mbstring/3296adf6a6454a050679cde90f95350ad604b171.zip", + "reference": "3296adf6a6454a050679cde90f95350ad604b171", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2018-04-26T10:06:28+00:00" + }, + { + "name": "symfony/polyfill-php56", + "version": "v1.8.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php56.git", + "reference": "af98553c84912459db3f636329567809d639a8f6" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/symfony/polyfill-php56/af98553c84912459db3f636329567809d639a8f6.zip", + "reference": "af98553c84912459db3f636329567809d639a8f6", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-util": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php56\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2018-04-26T10:06:28+00:00" + }, + { + "name": "symfony/polyfill-php70", + "version": "v1.8.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php70.git", + "reference": "77454693d8f10dd23bb24955cffd2d82db1007a6" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/symfony/polyfill-php70/77454693d8f10dd23bb24955cffd2d82db1007a6.zip", + "reference": "77454693d8f10dd23bb24955cffd2d82db1007a6", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "~1.0|~2.0", + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php70\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2018-04-26T10:06:28+00:00" + }, + { + "name": "symfony/polyfill-util", + "version": "v1.8.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-util.git", + "reference": "1a5ad95d9436cbff3296034fe9f8d586dce3fb3a" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/symfony/polyfill-util/1a5ad95d9436cbff3296034fe9f8d586dce3fb3a.zip", + "reference": "1a5ad95d9436cbff3296034fe9f8d586dce3fb3a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Util\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony utilities for portability of PHP codes", + "homepage": "https://symfony.com", + "keywords": [ + "compat", + "compatibility", + "polyfill", + "shim" + ], + "time": "2018-04-26T10:06:28+00:00" + }, + { + "name": "symfony/process", + "version": "v3.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "4cbf2db9abcb01486a21b7a059e03a62fae63187" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/symfony/process/4cbf2db9abcb01486a21b7a059e03a62fae63187.zip", + "reference": "4cbf2db9abcb01486a21b7a059e03a62fae63187", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2018-05-16T08:49:21+00:00" + }, + { + "name": "symfony/psr-http-message-bridge", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/psr-http-message-bridge.git", + "reference": "c2b757934f2d9681a287e662efbc27c41fe8ef86" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/symfony/psr-http-message-bridge/c2b757934f2d9681a287e662efbc27c41fe8ef86.zip", + "reference": "c2b757934f2d9681a287e662efbc27c41fe8ef86", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "psr/http-message": "~1.0", + "symfony/http-foundation": "~2.3|~3.0|~4.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "~3.2|4.0" + }, + "suggest": { + "psr/http-message-implementation": "To use the HttpFoundation factory", + "zendframework/zend-diactoros": "To use the Zend Diactoros factory" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\PsrHttpMessage\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "PSR HTTP message bridge", + "homepage": "http://symfony.com", + "keywords": [ + "http", + "http-message", + "psr-7" + ], + "time": "2017-12-19T00:31:44+00:00" + }, + { + "name": "symfony/routing", + "version": "v3.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "e382da877f5304aabc12ec3073eec430670c8296" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/symfony/routing/e382da877f5304aabc12ec3073eec430670c8296.zip", + "reference": "e382da877f5304aabc12ec3073eec430670c8296", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "conflict": { + "symfony/config": "<3.3.1", + "symfony/dependency-injection": "<3.3", + "symfony/yaml": "<3.4" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/common": "~2.2", + "psr/log": "~1.0", + "symfony/config": "^3.3.1|~4.0", + "symfony/dependency-injection": "~3.3|~4.0", + "symfony/expression-language": "~2.8|~3.0|~4.0", + "symfony/http-foundation": "~2.8|~3.0|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/dependency-injection": "For loading routes from a service", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Routing Component", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "time": "2018-05-16T12:49:49+00:00" + }, + { + "name": "symfony/translation", + "version": "v4.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "16328f5b217cebc8dd4adfe4aeeaa8c377581f5a" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/symfony/translation/16328f5b217cebc8dd4adfe4aeeaa8c377581f5a.zip", + "reference": "16328f5b217cebc8dd4adfe4aeeaa8c377581f5a", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/config": "<3.4", + "symfony/dependency-injection": "<3.4", + "symfony/yaml": "<3.4" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/finder": "~2.8|~3.0|~4.0", + "symfony/intl": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Translation Component", + "homepage": "https://symfony.com", + "time": "2018-05-30T07:26:09+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v3.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "0e6545672d8c9ce70dd472adc2f8b03155a46f73" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/symfony/var-dumper/0e6545672d8c9ce70dd472adc2f8b03155a46f73.zip", + "reference": "0e6545672d8c9ce70dd472adc2f8b03155a46f73", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" + }, + "require-dev": { + "ext-iconv": "*", + "twig/twig": "~1.34|~2.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "ext-symfony_debug": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "time": "2018-04-26T12:42:15+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "0ed4a2ea4e0902dac0489e6436ebcd5bbcae9757" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/tijsverkoyen/CssToInlineStyles/0ed4a2ea4e0902dac0489e6436ebcd5bbcae9757.zip", + "reference": "0ed4a2ea4e0902dac0489e6436ebcd5bbcae9757", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "time": "2017-11-27T11:13:29+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/vlucas/phpdotenv/3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c.zip", + "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "phpunit/phpunit": "^4.8 || ^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause-Attribution" + ], + "authors": [ + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "http://www.vancelucas.com" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "time": "2016-09-01T10:05:43+00:00" + }, + { + "name": "zendframework/zend-diactoros", + "version": "1.7.2", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-diactoros.git", + "reference": "741e7a571836f038de731105f4742ca8a164e43a" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/zendframework/zend-diactoros/741e7a571836f038de731105f4742ca8a164e43a.zip", + "reference": "741e7a571836f038de731105f4742ca8a164e43a", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0", + "psr/http-message": "^1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-dom": "*", + "ext-libxml": "*", + "phpunit/phpunit": "^5.7.16 || ^6.0.8", + "zendframework/zend-coding-standard": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.7.x-dev", + "dev-develop": "1.8.x-dev", + "dev-release-2.0": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Diactoros\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "description": "PSR HTTP Message implementations", + "homepage": "https://github.com/zendframework/zend-diactoros", + "keywords": [ + "http", + "psr", + "psr-7" + ], + "time": "2018-05-29T16:53:08+00:00" + } + ], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/doctrine/instantiator/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda.zip", + "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "^6.2.3", + "squizlabs/php_codesniffer": "^3.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2017-07-22T11:58:36+00:00" + }, + { + "name": "filp/whoops", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "181c4502d8f34db7aed7bfe88d4f87875b8e947a" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/filp/whoops/181c4502d8f34db7aed7bfe88d4f87875b8e947a.zip", + "reference": "181c4502d8f34db7aed7bfe88d4f87875b8e947a", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0", + "psr/log": "^1.0.1" + }, + "require-dev": { + "mockery/mockery": "^0.9 || ^1.0", + "phpunit/phpunit": "^4.8.35 || ^5.7", + "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "time": "2018-03-03T17:56:25+00:00" + }, + { + "name": "fzaninotto/faker", + "version": "v1.7.1", + "source": { + "type": "git", + "url": "https://github.com/fzaninotto/Faker.git", + "reference": "d3ed4cc37051c1ca52d22d76b437d14809fc7e0d" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/fzaninotto/Faker/d3ed4cc37051c1ca52d22d76b437d14809fc7e0d.zip", + "reference": "d3ed4cc37051c1ca52d22d76b437d14809fc7e0d", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "ext-intl": "*", + "phpunit/phpunit": "^4.0 || ^5.0", + "squizlabs/php_codesniffer": "^1.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "time": "2017-08-15T16:48:10+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v1.2.2", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/hamcrest/hamcrest-php/b37020aa976fa52d3de9aa904aa2522dc518f79c.zip", + "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "1.3.3", + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "autoload": { + "classmap": [ + "hamcrest" + ], + "files": [ + "hamcrest/Hamcrest.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "time": "2015-05-11T14:41:42+00:00" + }, + { + "name": "mockery/mockery", + "version": "0.9.9", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "6fdb61243844dc924071d3404bb23994ea0b6856" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/mockery/mockery/6fdb61243844dc924071d3404bb23994ea0b6856.zip", + "reference": "6fdb61243844dc924071d3404bb23994ea0b6856", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "~1.1", + "lib-pcre": ">=7.0", + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.9.x-dev" + } + }, + "autoload": { + "psr-0": { + "Mockery": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "http://davedevelopment.co.uk" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework for use in unit testing with PHPUnit, PHPSpec or any other testing framework. Its core goal is to offer a test double framework with a succinct API capable of clearly defining all possible object operations and interactions using a human readable Domain Specific Language (DSL). Designed as a drop in alternative to PHPUnit's phpunit-mock-objects library, Mockery is easy to integrate with PHPUnit and can operate alongside phpunit-mock-objects without the World ending.", + "homepage": "http://github.com/padraic/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "time": "2017-02-28T12:52:32+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.8.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/myclabs/DeepCopy/3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8.zip", + "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "replace": { + "myclabs/deep-copy": "self.version" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "time": "2018-06-11T23:09:50+00:00" + }, + { + "name": "phar-io/manifest", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/phar-io/manifest/2df402786ab5368a0169091f61a7c1e0eb6852d0.zip", + "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "phar-io/version": "^1.0.1", + "php": "^5.6 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "time": "2017-03-05T18:14:27+00:00" + }, + { + "name": "phar-io/version", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/phar-io/version/a70c0ced4be299a63d32fa96d9281d03e94041df.zip", + "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "time": "2017-03-05T17:38:23+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/phpDocumentor/ReflectionCommon/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6.zip", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2017-09-11T18:02:19+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "4.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "94fd0001232e47129dd3504189fa1c7225010d08" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/phpDocumentor/ReflectionDocBlock/94fd0001232e47129dd3504189fa1c7225010d08.zip", + "reference": "94fd0001232e47129dd3504189fa1c7225010d08", + "shasum": "" + }, + "require": { + "php": "^7.0", + "phpdocumentor/reflection-common": "^1.0.0", + "phpdocumentor/type-resolver": "^0.4.0", + "webmozart/assert": "^1.0" + }, + "require-dev": { + "doctrine/instantiator": "~1.0.5", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2017-11-30T07:14:17+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "0.4.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/phpDocumentor/TypeResolver/9c977708995954784726e25d0cd1dddf4e65b0f7.zip", + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0", + "phpdocumentor/reflection-common": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^5.2||^4.8.24" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "time": "2017-07-14T14:27:02+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "1.7.6", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/phpspec/prophecy/33a7e3c4fda54e912ff6338c48823bd5c0f0b712.zip", + "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", + "sebastian/comparator": "^1.1|^2.0|^3.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.5|^3.2", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.7.x-dev" + } + }, + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2018-04-18T13:57:24+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "5.3.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "c89677919c5dd6d3b3852f230a663118762218ac" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/sebastianbergmann/php-code-coverage/c89677919c5dd6d3b3852f230a663118762218ac.zip", + "reference": "c89677919c5dd6d3b3852f230a663118762218ac", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^7.0", + "phpunit/php-file-iterator": "^1.4.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-token-stream": "^2.0.1", + "sebastian/code-unit-reverse-lookup": "^1.0.1", + "sebastian/environment": "^3.0", + "sebastian/version": "^2.0.1", + "theseer/tokenizer": "^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "suggest": { + "ext-xdebug": "^2.5.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2018-04-06T15:36:58+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.4.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/sebastianbergmann/php-file-iterator/730b01bc3e867237eaac355e06a36b85dd93a8b4.zip", + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2017-11-27T13:52:08+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/sebastianbergmann/php-text-template/31f8b717e51d9a2afca6c9f046f5d69fc27c8686.zip", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2015-06-21T13:50:34+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.9", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/sebastianbergmann/php-timer/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f.zip", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2017-02-26T11:10:40+00:00" + }, + { + "name": "phpunit/php-token-stream", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "791198a2c6254db10131eecfe8c06670700904db" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/sebastianbergmann/php-token-stream/791198a2c6254db10131eecfe8c06670700904db.zip", + "reference": "791198a2c6254db10131eecfe8c06670700904db", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2017-11-27T05:48:46+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "6.5.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "4f21a3c6b97c42952fd5c2837bb354ec0199b97b" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/sebastianbergmann/phpunit/4f21a3c6b97c42952fd5c2837bb354ec0199b97b.zip", + "reference": "4f21a3c6b97c42952fd5c2837bb354ec0199b97b", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "myclabs/deep-copy": "^1.6.1", + "phar-io/manifest": "^1.0.1", + "phar-io/version": "^1.0", + "php": "^7.0", + "phpspec/prophecy": "^1.7", + "phpunit/php-code-coverage": "^5.3", + "phpunit/php-file-iterator": "^1.4.3", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-timer": "^1.0.9", + "phpunit/phpunit-mock-objects": "^5.0.5", + "sebastian/comparator": "^2.1", + "sebastian/diff": "^2.0", + "sebastian/environment": "^3.1", + "sebastian/exporter": "^3.1", + "sebastian/global-state": "^2.0", + "sebastian/object-enumerator": "^3.0.3", + "sebastian/resource-operations": "^1.0", + "sebastian/version": "^2.0.1" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "3.0.2", + "phpunit/dbunit": "<3.0" + }, + "require-dev": { + "ext-pdo": "*" + }, + "suggest": { + "ext-xdebug": "*", + "phpunit/php-invoker": "^1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.5.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2018-04-10T11:38:34+00:00" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "5.0.7", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "3eaf040f20154d27d6da59ca2c6e28ac8fd56dce" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/sebastianbergmann/phpunit-mock-objects/3eaf040f20154d27d6da59ca2c6e28ac8fd56dce.zip", + "reference": "3eaf040f20154d27d6da59ca2c6e28ac8fd56dce", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.5", + "php": "^7.0", + "phpunit/php-text-template": "^1.2.1", + "sebastian/exporter": "^3.1" + }, + "conflict": { + "phpunit/phpunit": "<6.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.5" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2018-05-29T13:50:43+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/sebastianbergmann/code-unit-reverse-lookup/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18.zip", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "time": "2017-03-04T06:30:41+00:00" + }, + { + "name": "sebastian/comparator", + "version": "2.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/sebastianbergmann/comparator/34369daee48eafb2651bea869b4b15d75ccc35f9.zip", + "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/diff": "^2.0 || ^3.0", + "sebastian/exporter": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2018-02-01T13:46:46+00:00" + }, + { + "name": "sebastian/diff", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/sebastianbergmann/diff/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd.zip", + "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2017-08-03T08:09:46+00:00" + }, + { + "name": "sebastian/environment", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/sebastianbergmann/environment/cd0871b3975fb7fc44d11314fd1ee20925fce4f5.zip", + "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2017-07-01T08:51:00+00:00" + }, + { + "name": "sebastian/exporter", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/sebastianbergmann/exporter/234199f4528de6d12aaa58b612e98f7d36adb937.zip", + "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2017-04-03T13:19:02+00:00" + }, + { + "name": "sebastian/global-state", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/sebastianbergmann/global-state/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4.zip", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2017-04-27T15:39:26+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/sebastianbergmann/object-enumerator/7cfd9e65d11ffb5af41198476395774d4c8a84c5.zip", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "time": "2017-08-03T12:35:26+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "773f97c67f28de00d397be301821b06708fca0be" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/sebastianbergmann/object-reflector/773f97c67f28de00d397be301821b06708fca0be.zip", + "reference": "773f97c67f28de00d397be301821b06708fca0be", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "time": "2017-03-29T09:07:27+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/sebastianbergmann/recursion-context/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8.zip", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2017-03-03T06:23:57+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/sebastianbergmann/resource-operations/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52.zip", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "shasum": "" + }, + "require": { + "php": ">=5.6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "time": "2015-07-28T20:34:47+00:00" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/sebastianbergmann/version/99732be0ddb3361e16ad77b68ba41efc8e979019.zip", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2016-10-03T07:35:21+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/theseer/tokenizer/cb2f008f3f05af2893a87208fe6a6c4985483f8b.zip", + "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "time": "2017-04-07T12:08:54+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "0df1908962e7a3071564e857d86874dad1ef204a" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/webmozart/assert/0df1908962e7a3071564e857d86874dad1ef204a.zip", + "reference": "0df1908962e7a3071564e857d86874dad1ef204a", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "time": "2018-01-29T19:49:41+00:00" + }, + { + "name": "xethron/laravel-4-generators", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/Xethron/Laravel-4-Generators.git", + "reference": "526f0a07d8ae44e365a20b1bf64c9956acd2a859" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/Xethron/Laravel-4-Generators/526f0a07d8ae44e365a20b1bf64c9956acd2a859.zip", + "reference": "526f0a07d8ae44e365a20b1bf64c9956acd2a859", + "shasum": "" + }, + "require": { + "illuminate/support": "~5.0", + "php": ">=5.4.0" + }, + "require-dev": { + "behat/behat": "~2.5.1", + "behat/mink": "~1.5.0", + "behat/mink-extension": "~1.2.0", + "behat/mink-goutte-driver": "~1.0.9", + "behat/mink-selenium2-driver": "~1.1.1", + "phpspec/phpspec": "~2.0", + "phpunit/phpunit": "~3.7" + }, + "type": "library", + "autoload": { + "psr-0": { + "Way\\Generators": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeffrey Way", + "email": "jeffrey@jeffrey-way.com" + } + ], + "description": "Rapidly generate resources, migrations, models, and much more.", + "time": "2017-02-23T11:20:49+00:00" + }, + { + "name": "xethron/migrations-generator", + "version": "v2.0.2", + "source": { + "type": "git", + "url": "https://github.com/Xethron/migrations-generator.git", + "reference": "a05bd7319ed808fcc3125212e37d30ccbe0d2b8b" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/Xethron/migrations-generator/a05bd7319ed808fcc3125212e37d30ccbe0d2b8b.zip", + "reference": "a05bd7319ed808fcc3125212e37d30ccbe0d2b8b", + "shasum": "" + }, + "require": { + "doctrine/dbal": "~2.4", + "illuminate/support": ">=4.1", + "php": ">=5.4.0", + "xethron/laravel-4-generators": "~3.1.0" + }, + "require-dev": { + "illuminate/cache": ">=4.1.0", + "illuminate/console": ">=4.1.0", + "mockery/mockery": ">=0.9.0", + "phpunit/phpunit": ">=4.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Way\\Generators\\GeneratorsServiceProvider", + "Xethron\\MigrationsGenerator\\MigrationsGeneratorServiceProvider" + ] + } + }, + "autoload": { + "psr-0": { + "Xethron\\MigrationsGenerator": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Breytenbach", + "email": "bernhard@coffeecode.co.za" + } + ], + "description": "Generates Laravel Migrations from an existing database", + "keywords": [ + "artisan", + "generator", + "laravel", + "migration", + "migrations" + ], + "time": "2017-09-19T17:31:57+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.0.0" + }, + "platform-dev": [] +} diff --git a/backend/config/app.php b/backend/config/app.php new file mode 100644 index 00000000..47aacee0 --- /dev/null +++ b/backend/config/app.php @@ -0,0 +1,239 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services your application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | your application so that it is used when running Artisan tasks. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. We have gone + | ahead and set this to a sensible default for you out of the box. + | + */ + + 'timezone' => 'PRC', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by the translation service provider. You are free to set this value + | to any of the locales which will be supported by the application. + | + */ + + 'locale' => 'zh-CN', + + /* + |-------------------------------------------------------------------------- + | Application Fallback Locale + |-------------------------------------------------------------------------- + | + | The fallback locale determines the locale to use when the current one + | is not available. You may change the value to correspond to any of + | the language folders that are provided through your application. + | + */ + + 'fallback_locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is used by the Illuminate encrypter service and should be set + | to a random, 32 character string, otherwise these encrypted strings + | will not be safe. Please do this before deploying an application! + | + */ + + 'key' => env('APP_KEY'), + + 'cipher' => 'AES-256-CBC', + + /* + |-------------------------------------------------------------------------- + | Logging Configuration + |-------------------------------------------------------------------------- + | + | Here you may configure the log settings for your application. Out of + | the box, Laravel uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Settings: "single", "daily", "syslog", "errorlog" + | + */ + + 'log' => env('APP_LOG', 'single'), + + 'log_level' => env('APP_LOG_LEVEL', 'debug'), + + // 业务相关的各种配置 + 'sms_gateway_type' => env('SMS_GATEWAY_TYPE', null), + 'sms_api_key' => env('SMS_API_KEY', null), + + /* + |-------------------------------------------------------------------------- + | Autoloaded Service Providers + |-------------------------------------------------------------------------- + | + | The service providers listed here will be automatically loaded on the + | request to your application. Feel free to add your own services to + | this array to grant expanded functionality to your applications. + | + */ + + 'providers' => [ + + /* + * Laravel Framework Service Providers... + */ + Illuminate\Auth\AuthServiceProvider::class, + Illuminate\Broadcasting\BroadcastServiceProvider::class, + Illuminate\Bus\BusServiceProvider::class, + Illuminate\Cache\CacheServiceProvider::class, + Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, + Illuminate\Cookie\CookieServiceProvider::class, + Illuminate\Database\DatabaseServiceProvider::class, + Illuminate\Encryption\EncryptionServiceProvider::class, + Illuminate\Filesystem\FilesystemServiceProvider::class, + Illuminate\Foundation\Providers\FoundationServiceProvider::class, + Illuminate\Hashing\HashServiceProvider::class, + Illuminate\Mail\MailServiceProvider::class, + Illuminate\Notifications\NotificationServiceProvider::class, + Illuminate\Pagination\PaginationServiceProvider::class, + Illuminate\Pipeline\PipelineServiceProvider::class, + Illuminate\Queue\QueueServiceProvider::class, + Illuminate\Redis\RedisServiceProvider::class, + Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, + Illuminate\Session\SessionServiceProvider::class, + Illuminate\Translation\TranslationServiceProvider::class, + Illuminate\Validation\ValidationServiceProvider::class, + Illuminate\View\ViewServiceProvider::class, + Laravel\Passport\PassportServiceProvider::class, + + /* + * Package Service Providers... + */ + Barryvdh\Cors\ServiceProvider::class, + Maatwebsite\Excel\ExcelServiceProvider::class, + /* + * Application Service Providers... + */ + App\Providers\AppServiceProvider::class, + App\Providers\AuthServiceProvider::class, + App\Providers\BroadcastServiceProvider::class, + App\Providers\EventServiceProvider::class, + App\Providers\RouteServiceProvider::class, + Overtrue\LaravelSocialite\ServiceProvider::class, + + ], + + /* + |-------------------------------------------------------------------------- + | Class Aliases + |-------------------------------------------------------------------------- + | + | This array of class aliases will be registered when this application + | is started. However, feel free to register as many as you wish as + | the aliases are "lazy" loaded so they don't hinder performance. + | + */ + + 'aliases' => [ + + 'App' => Illuminate\Support\Facades\App::class, + 'Artisan' => Illuminate\Support\Facades\Artisan::class, + 'Auth' => Illuminate\Support\Facades\Auth::class, + 'Blade' => Illuminate\Support\Facades\Blade::class, + 'Broadcast' => Illuminate\Support\Facades\Broadcast::class, + 'Bus' => Illuminate\Support\Facades\Bus::class, + 'Cache' => Illuminate\Support\Facades\Cache::class, + 'Config' => Illuminate\Support\Facades\Config::class, + 'Cookie' => Illuminate\Support\Facades\Cookie::class, + 'Crypt' => Illuminate\Support\Facades\Crypt::class, + 'DB' => Illuminate\Support\Facades\DB::class, + 'Eloquent' => Illuminate\Database\Eloquent\Model::class, + 'Event' => Illuminate\Support\Facades\Event::class, + 'File' => Illuminate\Support\Facades\File::class, + 'Gate' => Illuminate\Support\Facades\Gate::class, + 'Hash' => Illuminate\Support\Facades\Hash::class, + 'Lang' => Illuminate\Support\Facades\Lang::class, + 'Log' => Illuminate\Support\Facades\Log::class, + 'Mail' => Illuminate\Support\Facades\Mail::class, + 'Notification' => Illuminate\Support\Facades\Notification::class, + 'Password' => Illuminate\Support\Facades\Password::class, + 'Queue' => Illuminate\Support\Facades\Queue::class, + 'Redirect' => Illuminate\Support\Facades\Redirect::class, + 'Redis' => Illuminate\Support\Facades\Redis::class, + 'Request' => Illuminate\Support\Facades\Request::class, + 'Response' => Illuminate\Support\Facades\Response::class, + 'Route' => Illuminate\Support\Facades\Route::class, + 'Schema' => Illuminate\Support\Facades\Schema::class, + 'Session' => Illuminate\Support\Facades\Session::class, + 'Storage' => Illuminate\Support\Facades\Storage::class, + 'URL' => Illuminate\Support\Facades\URL::class, + 'Validator' => Illuminate\Support\Facades\Validator::class, + 'View' => Illuminate\Support\Facades\View::class, + 'Excel' => Maatwebsite\Excel\Facades\Excel::class, + 'Socialite' => Overtrue\LaravelSocialite\Socialite::class, + ], + +]; diff --git a/backend/config/auth.php b/backend/config/auth.php new file mode 100644 index 00000000..67844ced --- /dev/null +++ b/backend/config/auth.php @@ -0,0 +1,102 @@ + [ + 'guard' => 'web', + 'passwords' => 'users', + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | here which uses session storage and the Eloquent user provider. + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | Supported: "session", "token" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + + 'api' => [ + 'driver' => 'passport', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | If you have multiple user tables or models you may configure multiple + | sources which represent each model / table. These sources may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => App\Models\User::class, + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | You may specify multiple password reset configurations if you have more + | than one user table or model in the application and you want to have + | separate password reset settings based on the specific user types. + | + | The expire time is the number of minutes that the reset token should be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => 'password_resets', + 'expire' => 60, + ], + ], + +]; diff --git a/api/config/broadcasting.php b/backend/config/broadcasting.php similarity index 94% rename from api/config/broadcasting.php rename to backend/config/broadcasting.php index 3bba1103..f4cc455d 100644 --- a/api/config/broadcasting.php +++ b/backend/config/broadcasting.php @@ -36,8 +36,8 @@ 'secret' => env('PUSHER_APP_SECRET'), 'app_id' => env('PUSHER_APP_ID'), 'options' => [ - 'cluster' => env('PUSHER_APP_CLUSTER'), - 'useTLS' => true, + 'cluster' => 'ap1', + 'encrypted' => true ], ], diff --git a/api/config/cache.php b/backend/config/cache.php similarity index 78% rename from api/config/cache.php rename to backend/config/cache.php index 46751e62..e87f0320 100644 --- a/api/config/cache.php +++ b/backend/config/cache.php @@ -1,7 +1,5 @@ [ - // Memcached::OPT_CONNECT_TIMEOUT => 2000, + // Memcached::OPT_CONNECT_TIMEOUT => 2000, ], 'servers' => [ [ @@ -73,16 +70,7 @@ 'redis' => [ 'driver' => 'redis', - 'connection' => 'cache', - ], - - 'dynamodb' => [ - 'driver' => 'dynamodb', - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), - 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), - 'endpoint' => env('DYNAMODB_ENDPOINT'), + 'connection' => 'default', ], ], @@ -98,6 +86,6 @@ | */ - 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'), + 'prefix' => 'laravel', ]; diff --git a/backend/config/cors.php b/backend/config/cors.php new file mode 100644 index 00000000..a6ba3e6f --- /dev/null +++ b/backend/config/cors.php @@ -0,0 +1,21 @@ + true, + 'allowedOrigins' => ['*'], + 'allowedHeaders' => ['*'], + 'allowedMethods' => ['*'], + 'exposedHeaders' => [], + 'maxAge' => 0, +]; diff --git a/backend/config/database.php b/backend/config/database.php new file mode 100644 index 00000000..5ed066dd --- /dev/null +++ b/backend/config/database.php @@ -0,0 +1,120 @@ + env('DB_CONNECTION', 'mysql'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Here are each of the database connections setup for your application. + | Of course, examples of configuring each database platform that is + | supported by Laravel is shown below to make development simple. + | + | + | All database work in Laravel is done through the PHP PDO facilities + | so make sure you have the driver for your particular database of + | choice installed on your machine before you begin development. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => 'utf8', + 'collation' => 'utf8_unicode_ci', + 'prefix' => '', + 'strict' => true, + 'engine' => null, + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'schema' => 'public', + 'sslmode' => 'prefer', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run in the database. + | + */ + + 'migrations' => 'migrations', + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer set of commands than a typical key-value systems + | such as APC or Memcached. Laravel makes it easy to dig right in. + | + */ + + 'redis' => [ + + 'client' => 'predis', + + 'default' => [ + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'password' => env('REDIS_PASSWORD', null), + 'port' => env('REDIS_PORT', 6379), + 'database' => 0, + ], + + ], + +]; diff --git a/backend/config/excel.php b/backend/config/excel.php new file mode 100644 index 00000000..06823bb6 --- /dev/null +++ b/backend/config/excel.php @@ -0,0 +1,705 @@ + [ + + /* + |-------------------------------------------------------------------------- + | Enable/Disable cell caching + |-------------------------------------------------------------------------- + */ + 'enable' => true, + + /* + |-------------------------------------------------------------------------- + | Caching driver + |-------------------------------------------------------------------------- + | + | Set the caching driver + | + | Available methods: + | memory|gzip|serialized|igbinary|discISAM|apc|memcache|temp|wincache|sqlite|sqlite3 + | + */ + 'driver' => 'memory', + + /* + |-------------------------------------------------------------------------- + | Cache settings + |-------------------------------------------------------------------------- + */ + 'settings' => [ + + 'memoryCacheSize' => '32MB', + 'cacheTime' => 600 + + ], + + /* + |-------------------------------------------------------------------------- + | Memcache settings + |-------------------------------------------------------------------------- + */ + 'memcache' => [ + + 'host' => 'localhost', + 'port' => 11211, + + ], + + /* + |-------------------------------------------------------------------------- + | Cache dir (for discISAM) + |-------------------------------------------------------------------------- + */ + + 'dir' => storage_path('cache') + ], + + 'properties' => [ + 'creator' => 'Maatwebsite', + 'lastModifiedBy' => 'Maatwebsite', + 'title' => 'Spreadsheet', + 'description' => 'Default spreadsheet export', + 'subject' => 'Spreadsheet export', + 'keywords' => 'maatwebsite, excel, export', + 'category' => 'Excel', + 'manager' => 'Maatwebsite', + 'company' => 'Maatwebsite', + ], + + /* + |-------------------------------------------------------------------------- + | Sheets settings + |-------------------------------------------------------------------------- + */ + 'sheets' => [ + + /* + |-------------------------------------------------------------------------- + | Default page setup + |-------------------------------------------------------------------------- + */ + 'pageSetup' => [ + 'orientation' => 'portrait', + 'paperSize' => '9', + 'scale' => '100', + 'fitToPage' => false, + 'fitToHeight' => true, + 'fitToWidth' => true, + 'columnsToRepeatAtLeft' => ['', ''], + 'rowsToRepeatAtTop' => [0, 0], + 'horizontalCentered' => false, + 'verticalCentered' => false, + 'printArea' => null, + 'firstPageNumber' => null, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Creator + |-------------------------------------------------------------------------- + | + | The default creator of a new Excel file + | + */ + + 'creator' => 'Maatwebsite', + + 'csv' => [ + /* + |-------------------------------------------------------------------------- + | Delimiter + |-------------------------------------------------------------------------- + | + | The default delimiter which will be used to read out a CSV file + | + */ + + 'delimiter' => ',', + + /* + |-------------------------------------------------------------------------- + | Enclosure + |-------------------------------------------------------------------------- + */ + + 'enclosure' => '"', + + /* + |-------------------------------------------------------------------------- + | Line endings + |-------------------------------------------------------------------------- + */ + + 'line_ending' => "\r\n", + + /* + |-------------------------------------------------------------------------- + | setUseBom + |-------------------------------------------------------------------------- + */ + + 'use_bom' => false + ], + + 'export' => [ + + /* + |-------------------------------------------------------------------------- + | Autosize columns + |-------------------------------------------------------------------------- + | + | Disable/enable column autosize or set the autosizing for + | an array of columns ( array('A', 'B') ) + | + */ + 'autosize' => true, + + /* + |-------------------------------------------------------------------------- + | Autosize method + |-------------------------------------------------------------------------- + | + | --> PHPExcel_Shared_Font::AUTOSIZE_METHOD_APPROX + | The default is based on an estimate, which does its calculation based + | on the number of characters in the cell value (applying any calculation + | and format mask, and allowing for wordwrap and rotation) and with an + | "arbitrary" adjustment based on the font (Arial, Calibri or Verdana, + | defaulting to Calibri if any other font is used) and a proportional + | adjustment for the font size. + | + | --> PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT + | The second method is more accurate, based on actual style formatting as + | well (bold, italic, etc), and is calculated by generating a gd2 imagettf + | bounding box and using its dimensions to determine the size; but this + | method is significantly slower, and its accuracy is still dependent on + | having the appropriate fonts installed. + | + */ + 'autosize-method' => PHPExcel_Shared_Font::AUTOSIZE_METHOD_APPROX, + + /* + |-------------------------------------------------------------------------- + | Auto generate table heading + |-------------------------------------------------------------------------- + | + | If set to true, the array indices (or model attribute names) + | will automatically be used as first row (table heading) + | + */ + 'generate_heading_by_indices' => true, + + /* + |-------------------------------------------------------------------------- + | Auto set alignment on merged cells + |-------------------------------------------------------------------------- + */ + 'merged_cell_alignment' => 'left', + + /* + |-------------------------------------------------------------------------- + | Pre-calculate formulas during export + |-------------------------------------------------------------------------- + */ + 'calculate' => false, + + /* + |-------------------------------------------------------------------------- + | Include Charts during export + |-------------------------------------------------------------------------- + */ + 'includeCharts' => false, + + /* + |-------------------------------------------------------------------------- + | Default sheet settings + |-------------------------------------------------------------------------- + */ + 'sheets' => [ + + /* + |-------------------------------------------------------------------------- + | Default page margin + |-------------------------------------------------------------------------- + | + | 1) When set to false, default margins will be used + | 2) It's possible to enter a single margin which will + | be used for all margins. + | 3) Alternatively you can pass an array with 4 margins + | Default order: array(top, right, bottom, left) + | + */ + 'page_margin' => false, + + /* + |-------------------------------------------------------------------------- + | Value in source array that stands for blank cell + |-------------------------------------------------------------------------- + */ + 'nullValue' => null, + + /* + |-------------------------------------------------------------------------- + | Insert array starting from this cell address as the top left coordinate + |-------------------------------------------------------------------------- + */ + 'startCell' => 'A1', + + /* + |-------------------------------------------------------------------------- + | Apply strict comparison when testing for null values in the array + |-------------------------------------------------------------------------- + */ + 'strictNullComparison' => false + ], + + /* + |-------------------------------------------------------------------------- + | Store settings + |-------------------------------------------------------------------------- + */ + + 'store' => [ + + /* + |-------------------------------------------------------------------------- + | Path + |-------------------------------------------------------------------------- + | + | The path we want to save excel file to + | + */ + 'path' => storage_path('exports'), + + /* + |-------------------------------------------------------------------------- + | Return info + |-------------------------------------------------------------------------- + | + | Whether we want to return information about the stored file or not + | + */ + 'returnInfo' => false + + ], + + /* + |-------------------------------------------------------------------------- + | PDF Settings + |-------------------------------------------------------------------------- + */ + 'pdf' => [ + + /* + |-------------------------------------------------------------------------- + | PDF Drivers + |-------------------------------------------------------------------------- + | Supported: DomPDF, tcPDF, mPDF + */ + 'driver' => 'DomPDF', + + /* + |-------------------------------------------------------------------------- + | PDF Driver settings + |-------------------------------------------------------------------------- + */ + 'drivers' => [ + + /* + |-------------------------------------------------------------------------- + | DomPDF settings + |-------------------------------------------------------------------------- + */ + 'DomPDF' => [ + 'path' => base_path('vendor/dompdf/dompdf/') + ], + + /* + |-------------------------------------------------------------------------- + | tcPDF settings + |-------------------------------------------------------------------------- + */ + 'tcPDF' => [ + 'path' => base_path('vendor/tecnick.com/tcpdf/') + ], + + /* + |-------------------------------------------------------------------------- + | mPDF settings + |-------------------------------------------------------------------------- + */ + 'mPDF' => [ + 'path' => base_path('vendor/mpdf/mpdf/') + ], + ] + ] + ], + + 'filters' => [ + /* + |-------------------------------------------------------------------------- + | Register read filters + |-------------------------------------------------------------------------- + */ + + 'registered' => [ + 'chunk' => 'Maatwebsite\Excel\Filters\ChunkReadFilter' + ], + + /* + |-------------------------------------------------------------------------- + | Enable certain filters for every file read + |-------------------------------------------------------------------------- + */ + + 'enabled' => [] + ], + + 'import' => [ + + /* + |-------------------------------------------------------------------------- + | Has heading + |-------------------------------------------------------------------------- + | + | The sheet has a heading (first) row which we can use as attribute names + | + | Options: true|false|slugged|slugged_with_count|ascii|numeric|hashed|trans|original + | + */ + + 'heading' => 'slugged', + //'heading' => 'true', + + /* + |-------------------------------------------------------------------------- + | First Row with data or heading of data + |-------------------------------------------------------------------------- + | + | If the heading row is not the first row, or the data doesn't start + | on the first row, here you can change the start row. + | + */ + + 'startRow' => 1, + + /* + |-------------------------------------------------------------------------- + | Cell name word separator + |-------------------------------------------------------------------------- + | + | The default separator which is used for the cell names + | Note: only applies to 'heading' settings 'true' && 'slugged' + | + */ + + 'separator' => '_', + + /* + |-------------------------------------------------------------------------- + | Slug whitelisting + |-------------------------------------------------------------------------- + | + | Here you can whitelist certain characters in the slug. + | E.g. user.last_name will not remove . and _ + | Note: only applies to 'heading' settings 'true' && 'slugged' + | + */ + + 'slug_whitelist' => '._', + + /* + |-------------------------------------------------------------------------- + | Include Charts during import + |-------------------------------------------------------------------------- + */ + + 'includeCharts' => false, + + /* + |-------------------------------------------------------------------------- + | Sheet heading conversion + |-------------------------------------------------------------------------- + | + | Convert headings to ASCII + | Note: only applies to 'heading' settings 'true' && 'slugged' + | + */ + + 'to_ascii' => false, + + /* + |-------------------------------------------------------------------------- + | Import encoding + |-------------------------------------------------------------------------- + */ + + 'encoding' => [ + + 'input' => 'UTF-8', + 'output' => 'UTF-8' + + ], + + /* + |-------------------------------------------------------------------------- + | Calculate + |-------------------------------------------------------------------------- + | + | By default cells with formulas will be calculated. + | + */ + + 'calculate' => true, + + /* + |-------------------------------------------------------------------------- + | Ignore empty cells + |-------------------------------------------------------------------------- + | + | By default empty cells are not ignored + | + */ + + 'ignoreEmpty' => false, + + /* + |-------------------------------------------------------------------------- + | Force sheet collection + |-------------------------------------------------------------------------- + | + | For a sheet collection even when there is only 1 sheets. + | When set to false and only 1 sheet found, the parsed file will return + | a row collection instead of a sheet collection. + | When set to true, it will return a sheet collection instead. + | + */ + 'force_sheets_collection' => false, + + /* + |-------------------------------------------------------------------------- + | Date format + |-------------------------------------------------------------------------- + | + | The format dates will be parsed to + | + */ + + 'dates' => [ + + /* + |-------------------------------------------------------------------------- + | Enable/disable date formatting + |-------------------------------------------------------------------------- + */ + 'enabled' => true, + + /* + |-------------------------------------------------------------------------- + | Default date format + |-------------------------------------------------------------------------- + | + | If set to false, a carbon object will return + | + */ + 'format' => false, + + /* + |-------------------------------------------------------------------------- + | Date columns + |-------------------------------------------------------------------------- + */ + 'columns' => [] + ], + + /* + |-------------------------------------------------------------------------- + | Import sheets by config + |-------------------------------------------------------------------------- + */ + 'sheets' => [ + + /* + |-------------------------------------------------------------------------- + | Example sheet + |-------------------------------------------------------------------------- + | + | Example sheet "test" will grab the firstname at cell A2 + | + */ + + 'test' => [ + + 'firstname' => 'A2' + + ] + + ] + ], + + 'views' => [ + + /* + |-------------------------------------------------------------------------- + | Styles + |-------------------------------------------------------------------------- + | + | The default styles which will be used when parsing a view + | + */ + + 'styles' => [ + + /* + |-------------------------------------------------------------------------- + | Table headings + |-------------------------------------------------------------------------- + */ + 'th' => [ + 'font' => [ + 'bold' => true, + 'size' => 12, + ] + ], + + /* + |-------------------------------------------------------------------------- + | Strong tags + |-------------------------------------------------------------------------- + */ + 'strong' => [ + 'font' => [ + 'bold' => true, + 'size' => 12, + ] + ], + + /* + |-------------------------------------------------------------------------- + | Bold tags + |-------------------------------------------------------------------------- + */ + 'b' => [ + 'font' => [ + 'bold' => true, + 'size' => 12, + ] + ], + + /* + |-------------------------------------------------------------------------- + | Italic tags + |-------------------------------------------------------------------------- + */ + 'i' => [ + 'font' => [ + 'italic' => true, + 'size' => 12, + ] + ], + + /* + |-------------------------------------------------------------------------- + | Heading 1 + |-------------------------------------------------------------------------- + */ + 'h1' => [ + 'font' => [ + 'bold' => true, + 'size' => 24, + ] + ], + + /* + |-------------------------------------------------------------------------- + | Heading 2 + |-------------------------------------------------------------------------- + */ + 'h2' => [ + 'font' => [ + 'bold' => true, + 'size' => 18, + ] + ], + + /* + |-------------------------------------------------------------------------- + | Heading 3 + |-------------------------------------------------------------------------- + */ + 'h3' => [ + 'font' => [ + 'bold' => true, + 'size' => 13.5, + ] + ], + + /* + |-------------------------------------------------------------------------- + | Heading 4 + |-------------------------------------------------------------------------- + */ + 'h4' => [ + 'font' => [ + 'bold' => true, + 'size' => 12, + ] + ], + + /* + |-------------------------------------------------------------------------- + | Heading 5 + |-------------------------------------------------------------------------- + */ + 'h5' => [ + 'font' => [ + 'bold' => true, + 'size' => 10, + ] + ], + + /* + |-------------------------------------------------------------------------- + | Heading 6 + |-------------------------------------------------------------------------- + */ + 'h6' => [ + 'font' => [ + 'bold' => true, + 'size' => 7.5, + ] + ], + + /* + |-------------------------------------------------------------------------- + | Hyperlinks + |-------------------------------------------------------------------------- + */ + 'a' => [ + 'font' => [ + 'underline' => true, + 'color' => ['argb' => 'FF0000FF'], + ] + ], + + /* + |-------------------------------------------------------------------------- + | Horizontal rules + |-------------------------------------------------------------------------- + */ + 'hr' => [ + 'borders' => [ + 'bottom' => [ + 'style' => 'thin', + 'color' => ['FF000000'] + ], + ] + ] + ] + + ] + +); diff --git a/api/config/filesystems.php b/backend/config/filesystems.php similarity index 84% rename from api/config/filesystems.php rename to backend/config/filesystems.php index 39ab61db..36a61abd 100644 --- a/api/config/filesystems.php +++ b/backend/config/filesystems.php @@ -37,7 +37,7 @@ | may even configure multiple disks of the same driver. Defaults have | been setup for each driver as an example of the required options. | - | Supported Drivers: "local", "ftp", "sftp", "s3" + | Supported Drivers: "local", "ftp", "s3", "rackspace" | */ @@ -47,9 +47,9 @@ 'driver' => 'local', 'root' => storage_path('app'), ], - 'code' => [ - 'driver' => 'local', - 'root' => public_path('code'), + 'test' => [ + 'driver' => 'local', + 'root' => 'e:/test' ], 'public' => [ 'driver' => 'local', @@ -57,15 +57,16 @@ 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ], - + 'uploads' => [ + 'driver' => 'local', + 'root' => public_path('uploads'), + ], 's3' => [ 'driver' => 's3', - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'region' => env('AWS_DEFAULT_REGION'), + 'key' => env('AWS_KEY'), + 'secret' => env('AWS_SECRET'), + 'region' => env('AWS_REGION'), 'bucket' => env('AWS_BUCKET'), - 'url' => env('AWS_URL'), - 'endpoint' => env('AWS_ENDPOINT'), ], ], diff --git a/api/config/mail.php b/backend/config/mail.php similarity index 87% rename from api/config/mail.php rename to backend/config/mail.php index 3c65eb3f..bb92224c 100644 --- a/api/config/mail.php +++ b/backend/config/mail.php @@ -11,8 +11,8 @@ | sending of e-mail. You may specify which one you're using throughout | your application here. By default, Laravel is setup for SMTP mail. | - | Supported: "smtp", "sendmail", "mailgun", "ses", - | "postmark", "log", "array" + | Supported: "smtp", "sendmail", "mailgun", "mandrill", "ses", + | "sparkpost", "log", "array" | */ @@ -120,17 +120,4 @@ ], ], - /* - |-------------------------------------------------------------------------- - | Log Channel - |-------------------------------------------------------------------------- - | - | If you are using the "log" driver, you may specify the logging channel - | if you prefer to keep mail messages separate from other log entries - | for simpler reading. Otherwise, the default channel will be used. - | - */ - - 'log_channel' => env('MAIL_LOG_CHANNEL'), - ]; diff --git a/backend/config/queue.php b/backend/config/queue.php new file mode 100644 index 00000000..4d83ebd0 --- /dev/null +++ b/backend/config/queue.php @@ -0,0 +1,85 @@ + env('QUEUE_DRIVER', 'sync'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection information for each server that + | is used by your application. A default configuration has been added + | for each back-end shipped with Laravel. You are free to add more. + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'jobs', + 'queue' => 'default', + 'retry_after' => 90, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => 'localhost', + 'queue' => 'default', + 'retry_after' => 90, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => 'your-public-key', + 'secret' => 'your-secret-key', + 'prefix' => 'https://sqs.us-east-1.amazonaws.com/your-account-id', + 'queue' => 'your-queue-name', + 'region' => 'us-east-1', + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + 'queue' => 'default', + 'retry_after' => 90, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control which database and table are used to store the jobs that + | have failed. You may change them to any database / table you wish. + | + */ + + 'failed' => [ + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/backend/config/services.php b/backend/config/services.php new file mode 100644 index 00000000..2d9c8ddc --- /dev/null +++ b/backend/config/services.php @@ -0,0 +1,43 @@ + [ + 'domain' => env('MAILGUN_DOMAIN'), + 'secret' => env('MAILGUN_SECRET'), + ], + + 'ses' => [ + 'key' => env('SES_KEY'), + 'secret' => env('SES_SECRET'), + 'region' => 'us-east-1', + ], + + 'sparkpost' => [ + 'secret' => env('SPARKPOST_SECRET'), + ], + + 'stripe' => [ + 'model' => App\Models\User::class, + 'key' => env('STRIPE_KEY'), + 'secret' => env('STRIPE_SECRET'), + ], + 'github' => [ + 'client_id' => '52c2e3cc172fee5bccd7', + 'client_secret' => 'fb41f02e19c7bf55319d80c8fe55a6c2ef699bbd', + 'redirect' => 'http://back.ynxpyz.cn/oauth/github/callback', + ], + +]; diff --git a/api/config/session.php b/backend/config/session.php similarity index 91% rename from api/config/session.php rename to backend/config/session.php index 857ebc3e..71ad0ed1 100644 --- a/api/config/session.php +++ b/backend/config/session.php @@ -1,7 +1,5 @@ env('SESSION_LIFETIME', 120), + 'lifetime' => 120, 'expire_on_close' => false, @@ -72,7 +70,7 @@ | */ - 'connection' => env('SESSION_CONNECTION', null), + 'connection' => null, /* |-------------------------------------------------------------------------- @@ -92,13 +90,13 @@ | Session Cache Store |-------------------------------------------------------------------------- | - | When using the "apc", "memcached", or "dynamodb" session drivers you may - | list a cache store that should be used for these sessions. This value - | must match with one of the application's configured cache "stores". + | When using the "apc" or "memcached" session drivers, you may specify a + | cache store that should be used for these sessions. This value must + | correspond with one of the application's configured cache stores. | */ - 'store' => env('SESSION_STORE', null), + 'store' => null, /* |-------------------------------------------------------------------------- @@ -126,7 +124,7 @@ 'cookie' => env( 'SESSION_COOKIE', - Str::slug(env('APP_NAME', 'laravel'), '_').'_session' + str_slug(env('APP_NAME', 'laravel'), '_').'_session' ), /* @@ -190,7 +188,7 @@ | take place, and can be used to mitigate CSRF attacks. By default, we | do not enable this as other CSRF protection services are in place. | - | Supported: "lax", "strict", "none" + | Supported: "lax", "strict" | */ diff --git a/api/config/view.php b/backend/config/view.php similarity index 89% rename from api/config/view.php rename to backend/config/view.php index 22b8a18d..2acfd9cc 100644 --- a/api/config/view.php +++ b/backend/config/view.php @@ -28,9 +28,6 @@ | */ - 'compiled' => env( - 'VIEW_COMPILED_PATH', - realpath(storage_path('framework/views')) - ), + 'compiled' => realpath(storage_path('framework/views')), ]; diff --git a/backend/config/wechat.php b/backend/config/wechat.php new file mode 100644 index 00000000..7b31e782 --- /dev/null +++ b/backend/config/wechat.php @@ -0,0 +1,137 @@ + + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +return [ + /* + * 默认配置,将会合并到各模块中 + */ + 'defaults' => [ + /* + * Debug 模式,bool 值:true/false + * + * 当值为 false 时,所有的日志都不会记录 + */ + 'debug' => true, + + /* + * 指定 API 调用返回结果的类型:array(default)/collection/object/raw/自定义类名 + */ + 'response_type' => 'array', + + /* + * 使用 Laravel 的缓存系统 + */ + 'use_laravel_cache' => true, + + /* + * 日志配置 + * + * level: 日志级别,可选为: + * debug/info/notice/warning/error/critical/alert/emergency + * file:日志文件位置(绝对路径!!!),要求可写权限 + */ + 'log' => [ + 'level' => env('WECHAT_LOG_LEVEL', 'debug'), + 'file' => env('WECHAT_LOG_FILE', storage_path('logs/wechat.log')), + ], + ], + + /* + * 路由配置 + */ + 'route' => [ + /* + * 开放平台第三方平台路由配置 + */ + // 'open_platform' => [ + // 'uri' => 'serve', + // 'action' => Overtrue\LaravelWeChat\Controllers\OpenPlatformController::class, + // 'attributes' => [ + // 'prefix' => 'open-platform', + // 'middleware' => null, + // ], + // ], + ], + + /* + * 公众号 + */ + 'official_account' => [ + 'app_id' => env('WECHAT_OFFICIAL_ACCOUNT_APPID', 'your-app-id'), // AppID + 'secret' => env('WECHAT_OFFICIAL_ACCOUNT_SECRET', 'your-app-secret'), // AppSecret + 'token' => env('WECHAT_OFFICIAL_ACCOUNT_TOKEN', 'your-token'), // Token + 'aes_key' => env('WECHAT_OFFICIAL_ACCOUNT_AES_KEY', ''), // EncodingAESKey + + /* + * OAuth 配置 + * + * only_wechat_browser: 只在微信浏览器跳转 + * scopes:公众平台(snsapi_userinfo / snsapi_base),开放平台:snsapi_login + * callback:OAuth授权完成后的回调页地址(如果使用中间件,则随便填写。。。) + */ + // 'oauth' => [ + // 'only_wechat_browser' => false, + // 'scopes' => array_map('trim', explode(',', env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_SCOPES', 'snsapi_userinfo'))), + // 'callback' => env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_CALLBACK', '/examples/oauth_callback.php'), + // ], + ], + + /* + * 开放平台第三方平台 + */ + // 'open_platform' => [ + // 'app_id' => env('WECHAT_OPEN_PLATFORM_APPID', ''), + // 'secret' => env('WECHAT_OPEN_PLATFORM_SECRET', ''), + // 'token' => env('WECHAT_OPEN_PLATFORM_TOKEN', ''), + // 'aes_key' => env('WECHAT_OPEN_PLATFORM_AES_KEY', ''), + // ], + + /* + * 小程序 + */ + // 'mini_program' => [ + // 'app_id' => env('WECHAT_MINI_PROGRAM_APPID', ''), + // 'secret' => env('WECHAT_MINI_PROGRAM_SECRET', ''), + // 'token' => env('WECHAT_MINI_PROGRAM_TOKEN', ''), + // 'aes_key' => env('WECHAT_MINI_PROGRAM_AES_KEY', ''), + // ], + + /* + * 微信支付 + */ + // 'payment' => [ + // 'sandbox' => env('WECHAT_PAYMENT_SANDBOX', false), + // 'app_id' => env('WECHAT_PAYMENT_APPID', ''), + // 'mch_id' => env('WECHAT_PAYMENT_MCH_ID', 'your-mch-id'), + // 'key' => env('WECHAT_PAYMENT_KEY', 'key-for-signature'), + // 'cert_path' => env('WECHAT_PAYMENT_CERT_PATH', 'path/to/cert/apiclient_cert.pem'), // XXX: 绝对路径!!!! + // 'key_path' => env('WECHAT_PAYMENT_KEY_PATH', 'path/to/cert/apiclient_key.pem'), // XXX: 绝对路径!!!! + // 'notify_url' => 'http://example.com/payments/wechat-notify', // 默认支付结果通知地址 + // // ... + // ], + + /* + * 企业微信 + */ + // 'work' => [ + // // 企业 ID + // 'corp_id' => 'xxxxxxxxxxxxxxxxx', + + // // 应用列表 + // 'agents' => [ + // 'contacts' => [ + // 'agent_id' => 100020, + // 'secret' => env('WECHAT_WORK_AGENT_CONTACTS_SECRET', ''), + // ], + // //... + // ], + // ], +]; diff --git a/backend/database/.gitignore b/backend/database/.gitignore new file mode 100644 index 00000000..9b1dffd9 --- /dev/null +++ b/backend/database/.gitignore @@ -0,0 +1 @@ +*.sqlite diff --git a/backend/database/factories/ModelsPermissionFactory.php b/backend/database/factories/ModelsPermissionFactory.php new file mode 100644 index 00000000..6d332072 --- /dev/null +++ b/backend/database/factories/ModelsPermissionFactory.php @@ -0,0 +1,17 @@ +define(App\Models\Permission::class, function (Faker $faker) { + $methods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'] ; + $pid = random_int(0,8); + $type = random_int(1,2); + return [ + // + 'name' => $faker->title, + 'pid' => $pid, + 'type' => $type, + 'method' => $type == 2 ? $faker->randomElement($methods): '', + 'route_name' => $type == 2 ? $faker->title: '', + ]; +}); diff --git a/backend/database/factories/ModelsStudentFactory.php b/backend/database/factories/ModelsStudentFactory.php new file mode 100644 index 00000000..b147094f --- /dev/null +++ b/backend/database/factories/ModelsStudentFactory.php @@ -0,0 +1,16 @@ +define(App\Models\Student::class, function (Faker $faker) { + $arrSex = ['男', '女']; + return [ + // + 'student_name' => $faker->name, + 'student_sex' => $arrSex[mt_rand(0,1)], + 'student_phone' => get_phone(), + 'student_status' => mt_rand(0,1), + 'student_remark' => str_random(20) + ]; + +}); diff --git a/backend/database/factories/ModelsTeacherFactory.php b/backend/database/factories/ModelsTeacherFactory.php new file mode 100644 index 00000000..334b6733 --- /dev/null +++ b/backend/database/factories/ModelsTeacherFactory.php @@ -0,0 +1,24 @@ +define(App\Models\Teacher::class, function (Faker $faker) { + $arrSex = ['男', '女']; + $arrPol = ['中共党员','中共预备党员', '共青团员', '民革党员', '民盟盟员', '民建会员', '民进会员', '农工党党员', '致公党党员', '九三学社社员', '台盟盟员', '无党派人士', '群众']; + return [ + 'name' => $faker->name, + 'sex' => $arrSex[mt_rand(0,count($arrSex)-1)], + 'nation_id' => mt_rand(1,56), + 'birthday' => $faker->date(), + 'work_time' => $faker->date(), + 'political' => $arrPol[mt_rand(0, count($arrPol)-1)], + 'join_date' => $faker->date(), + 'card_id' => get_card_id(), + 'phone' => get_phone(), + 'phone2' => get_phone() , + 'type' => 1, + 'open_id'=> str_random(28), + 'state' => 1, + 'teaching_id' => mt_rand(1,17) + ]; +}); diff --git a/backend/database/factories/RoleFactory.php b/backend/database/factories/RoleFactory.php new file mode 100644 index 00000000..184cbd20 --- /dev/null +++ b/backend/database/factories/RoleFactory.php @@ -0,0 +1,9 @@ +define(App\Models\Role::class, function (Faker $faker) { + return [ + // + ]; +}); diff --git a/backend/database/factories/SessionFactory.php b/backend/database/factories/SessionFactory.php new file mode 100644 index 00000000..2728a238 --- /dev/null +++ b/backend/database/factories/SessionFactory.php @@ -0,0 +1,9 @@ +define(App\Models\Session::class, function (Faker $faker) { + return [ + // + ]; +}); diff --git a/backend/database/factories/UserFactory.php b/backend/database/factories/UserFactory.php new file mode 100644 index 00000000..4428f69b --- /dev/null +++ b/backend/database/factories/UserFactory.php @@ -0,0 +1,25 @@ +define(App\Models\User::class, function (Faker $faker) { + static $password; + + return [ + 'name' => $faker->name, + 'email' => $faker->unique()->safeEmail, + 'password' => $password ?: $password = bcrypt('123456'), + 'remember_token' => str_random(10), + ]; +}); \ No newline at end of file diff --git a/backend/database/factories/threeLoginFactory.php b/backend/database/factories/threeLoginFactory.php new file mode 100644 index 00000000..b303b4d4 --- /dev/null +++ b/backend/database/factories/threeLoginFactory.php @@ -0,0 +1,9 @@ +define(App\threeLogin::class, function (Faker $faker) { + return [ + // + ]; +}); diff --git a/backend/database/migrations/2014_10_12_000000_create_users_table.php b/backend/database/migrations/2014_10_12_000000_create_users_table.php new file mode 100644 index 00000000..f82241b4 --- /dev/null +++ b/backend/database/migrations/2014_10_12_000000_create_users_table.php @@ -0,0 +1,38 @@ +increments('id'); + $table->string('name'); + $table->string('email')->unique(); + $table->string('password'); + $table->string('role', 50)->default('editor')->comment('权限组'); + $table->string('avatar', 100)->nullable()->comment('头像'); + $table->rememberToken(); + $table->softDeletes(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('users'); + } +} diff --git a/api/database/migrations/2014_10_12_100000_create_password_resets_table.php b/backend/database/migrations/2014_10_12_100000_create_password_resets_table.php similarity index 100% rename from api/database/migrations/2014_10_12_100000_create_password_resets_table.php rename to backend/database/migrations/2014_10_12_100000_create_password_resets_table.php diff --git a/backend/database/migrations/2017_12_21_013300_create_sessions_table.php b/backend/database/migrations/2017_12_21_013300_create_sessions_table.php new file mode 100644 index 00000000..3dc4869e --- /dev/null +++ b/backend/database/migrations/2017_12_21_013300_create_sessions_table.php @@ -0,0 +1,39 @@ +increments('id'); + $table->unsignedSmallInteger('year')->comment('学年'); // 2016代表2016-2017 2017代表2017-2018 + $table->unsignedTinyInteger('team')->default('1')->comment('学期 1 上学期 2 下学期'); // 1->上学期 2->下学期 + $table->unsignedTinyInteger('one')->comment('高一班级数'); + $table->unsignedTinyInteger('two')->comment('高二班级数'); + $table->unsignedTinyInteger('three')->comment('高三班级数'); + $table->string('remark', 50)->nullable()->comment('备注'); + $table->softDeletes(); + $table->timestamps(); + $table->comment ='学期表'; + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('sessions'); + } +} diff --git a/backend/database/migrations/2017_12_25_102529_create_roles_table.php b/backend/database/migrations/2017_12_25_102529_create_roles_table.php new file mode 100644 index 00000000..ff0e7ee4 --- /dev/null +++ b/backend/database/migrations/2017_12_25_102529_create_roles_table.php @@ -0,0 +1,36 @@ +increments('id'); + $table->string('name', '20')->comment('名称'); + $table->string('explain', '20')->comment('说明'); + $table->string('permission', '50')->comment('资源列表')->nullable(); + $table->string('remark', '50')->comment('备注')->nullable(); + $table->softDeletes(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('roles'); + } +} diff --git a/backend/database/migrations/2018_02_13_112400_create_permissions_table.php b/backend/database/migrations/2018_02_13_112400_create_permissions_table.php new file mode 100644 index 00000000..70df920b --- /dev/null +++ b/backend/database/migrations/2018_02_13_112400_create_permissions_table.php @@ -0,0 +1,39 @@ +increments('id'); + $table->string('name')->comment('功能名称'); + $table->unsignedInteger('pid')->comment('父节点'); + $table->unsignedTinyInteger('type')->comment('节点类型(1->分组 2->节点)'); + $table->string('method')->nullable()->comment('方法'); + $table->string('route_name')->nullable()->comment('路由名称'); + $table->string('route_match')->nullable()->comment('路由模式'); + $table->string('remark')->nullable()->comment('功能备注'); + $table->softDeletes(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('permissions'); + } +} diff --git a/backend/database/migrations/2018_02_24_140731_create_teachers_table.php b/backend/database/migrations/2018_02_24_140731_create_teachers_table.php new file mode 100644 index 00000000..09ea4824 --- /dev/null +++ b/backend/database/migrations/2018_02_24_140731_create_teachers_table.php @@ -0,0 +1,51 @@ +increments('id'); + $table->string('name')->comment('姓名'); + $table->char('sex', 1)->comment('性别'); + $table->unsignedTinyInteger('nation_id')->comment('民族ID'); + $table->date('birthday')->comment('生日'); + $table->date('work_time')->comment('工作日期'); + $table->string('political')->comment('政治面貌')->default('群众'); + $table->date('join_date')->comment('入党、团时间')->nullable(); + $table->string('card_id')->comment('身份证'); + $table->char('phone', 13)->comment('联系号码1'); + $table->char('phone2', 13)->comment('联系号码2')->nullable(); + $table->unsignedTinyInteger('type')->comment('类型(1->教师 0->职工)')->default(1); + $table->string('open_id')->comment('微信绑定OpenId')->nullable(); + $table->unsignedTinyInteger('state')->comment('人员状态(1->正常 2->调出 3->退出 4->停薪留职)')->default(1); + $table->unsignedTinyInteger('teaching_id')->comment('教学科目Id')->nullable; + $table->timestamps(); + $table->unique('card_id'); + $table->unique('phone'); + $table->unique('phone2'); + // 要设置外键的话 必须先保证相应的表格先存在 + // $table->foreign('teaching_id')->reference('id')->on('yz_teaching'); + // $table->foreign('nation_id')->reference('id')->on('yz_nation'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('yz_teacher'); + } +} diff --git a/backend/database/migrations/2018_03_17_145500_create_students_table.php b/backend/database/migrations/2018_03_17_145500_create_students_table.php new file mode 100644 index 00000000..5a8a579b --- /dev/null +++ b/backend/database/migrations/2018_03_17_145500_create_students_table.php @@ -0,0 +1,37 @@ +increments('student_id'); + $table->string('student_name', 20)->comment('学生姓名'); + $table->string('student_sex', 1)->comment('学生性别 男 女'); + $table->string('student_phone', 11)->comment('学生电话'); + $table->integer('student_status')->comment('学生状态'); + $table->string('student_remark', 255)->nullable()->comment('备注'); + $table->softDeletes(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('students'); + } +} diff --git a/backend/database/migrations/2018_06_06_231839_create_three_logins_table.php b/backend/database/migrations/2018_06_06_231839_create_three_logins_table.php new file mode 100644 index 00000000..808c742c --- /dev/null +++ b/backend/database/migrations/2018_06_06_231839_create_three_logins_table.php @@ -0,0 +1,35 @@ +increments('id'); + $table->integer('user_id')->nullable()->comment('用户id'); + $table->integer('platform_id')->comment('第三方平台上的id号'); + $table->string('provider')->comment('第三方平台'); + $table->string('remark')->nullable()->comment('备注'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('three_logins'); + } +} diff --git a/backend/database/migrations/2018_06_23_175407_create_log_logins_table.php b/backend/database/migrations/2018_06_23_175407_create_log_logins_table.php new file mode 100644 index 00000000..6fde4e8d --- /dev/null +++ b/backend/database/migrations/2018_06_23_175407_create_log_logins_table.php @@ -0,0 +1,36 @@ +increments('id'); + $table->integer('user_id')->comment('用户ID'); + $table->string('user_name')->comment('用户名称'); + $table->char('ip',20)->comment('用户IP地址'); + $table->char('type',10)->comment('事件类型'); + $table->string('desc')->comment('事件描述'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('log_logins'); + } +} diff --git a/backend/database/migrations/2018_06_23_175432_create_log_works_table.php b/backend/database/migrations/2018_06_23_175432_create_log_works_table.php new file mode 100644 index 00000000..db6fd237 --- /dev/null +++ b/backend/database/migrations/2018_06_23_175432_create_log_works_table.php @@ -0,0 +1,37 @@ +increments('id'); + $table->integer('user_id')->comment('用户ID'); + $table->string('user_name')->comment('用户名称'); + $table->char('ip',20)->comment('用户IP地址'); + $table->char('type',10)->comment('事件类型'); + $table->string('route_name')->comment('路由名称'); + $table->string('desc')->comment('事件描述'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('log_works'); + } +} diff --git a/backend/database/migrations/2018_06_23_181323_create_dicts_table.php b/backend/database/migrations/2018_06_23_181323_create_dicts_table.php new file mode 100644 index 00000000..b157fce3 --- /dev/null +++ b/backend/database/migrations/2018_06_23_181323_create_dicts_table.php @@ -0,0 +1,34 @@ +increments('id'); + $table->char('name', 20)->comment('字典分类名称'); + $table->string('desc') ->comment('字典分类描述'); + $table->string('remark')->comment(' 备注')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('dicts'); + } +} diff --git a/backend/database/migrations/2018_06_23_181337_create_dict_details_table.php b/backend/database/migrations/2018_06_23_181337_create_dict_details_table.php new file mode 100644 index 00000000..282ebdc3 --- /dev/null +++ b/backend/database/migrations/2018_06_23_181337_create_dict_details_table.php @@ -0,0 +1,35 @@ +increments('id'); + $table->integer('dict_id')->comment('字典分类Id'); + $table->tinyInteger('level')->comment('分类下详细种类'); + $table->string('desc') ->comment('种类描述'); + $table->string('remark')->comment(' 备注')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('dict_details'); + } +} diff --git a/backend/database/seeds/DatabaseSeeder.php b/backend/database/seeds/DatabaseSeeder.php new file mode 100644 index 00000000..88b66f99 --- /dev/null +++ b/backend/database/seeds/DatabaseSeeder.php @@ -0,0 +1,19 @@ +call(UsersTableSeeder::class); + $this->call(RolesTableSeeder::class); + $this->call(SessionsTableSeeder::class); + $this->call(PermissionsTableSeeder::class); + } +} diff --git a/backend/database/seeds/PermissionsTableSeeder.php b/backend/database/seeds/PermissionsTableSeeder.php new file mode 100644 index 00000000..23326d08 --- /dev/null +++ b/backend/database/seeds/PermissionsTableSeeder.php @@ -0,0 +1,101 @@ +insertGetId([ + 'name' => '学期管理', + 'pid' => 0, + 'type' => 1, + 'method' => '', + 'route_name' => '', + 'route_match' => '', + 'remark' => '管理学期信息', + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now() + ]); + DB::table('permissions') ->insert([ + 'name' => '获取学期列表', + 'pid' => $id, + 'type' => 2, + 'method' => 'GET', + 'route_name' => 'session.index', + 'route_match' => '/^\/api\/session$/', + 'remark' => '获取学期列表信息', + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now() + ]); + + DB::table('permissions') ->insert([ + 'name' => '获取指定的学期信息', + 'pid' => $id, + 'type' => 2, + 'method' => 'GET', + 'route_name' => 'session.show', + 'route_match' => '/^\/api\/session\/\d+$/', + 'remark' => '获取指定的学期信息', + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now() + ]); + + DB::table('permissions') ->insert([ + 'name' => '创建新的学期信息', + 'pid' => $id, + 'type' => 2, + 'method' => 'POST', + 'route_name' => 'session.store', + 'route_match' => '/^\/api\/session$/', + 'remark' => '创建新的学期信息', + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now() + ]); + + DB::table('permissions') ->insert([ + 'name' => '更新指定的学期信息', + 'pid' => $id, + 'type' => 2, + 'method' => 'PATCH', + 'route_name' => 'session.update', + 'route_match' => '/^\/api\/session\/\d+$/', + 'remark' => '更新指定的学期信息', + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now() + ]); + + DB::table('permissions') ->insert([ + 'name' => '删除指定的学期信息', + 'pid' => $id, + 'type' => 2, + 'method' => 'DELETE', + 'route_name' => 'session.destroy', + 'route_match' => '/^\/api\/session\/\d+$/', + 'remark' => '删除指定的学期信息', + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now() + ]); + + $id2 = DB::table('permissions') ->insertGetId([ + 'name' => '行政管理', + 'pid' => 0, + 'type' => 1, + 'method' => '', + 'route_name' => '', + 'route_match' => '', + 'remark' => '管理行政信息', + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now() + ]); + + } +} diff --git a/backend/database/seeds/RolesTableSeeder.php b/backend/database/seeds/RolesTableSeeder.php new file mode 100644 index 00000000..b304fe14 --- /dev/null +++ b/backend/database/seeds/RolesTableSeeder.php @@ -0,0 +1,32 @@ +insert([ + 'name' => 'admin', + 'explain' => '管理员', + 'remark' => '管理所有的一切,无法修改其功能权限', + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now() + + ]); + DB::table('roles')->insert([ + 'name' => 'user', + 'explain' => '用户', + 'remark' => '普通用户,权限可以自定义', + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now() + ]); + } +} diff --git a/backend/database/seeds/SessionsTableSeeder.php b/backend/database/seeds/SessionsTableSeeder.php new file mode 100644 index 00000000..539c4eb2 --- /dev/null +++ b/backend/database/seeds/SessionsTableSeeder.php @@ -0,0 +1,33 @@ +insert([ + 'year' => 2017, + 'team' => 1, + 'one' => 22, + 'two' => 22, + 'three' => 19, + 'remark' => '2017-2018学年上学期' + ]); + + DB::table('sessions')->insert([ + 'year' => 2017, + 'team' => 2, + 'one' => 22, + 'two' => 22, + 'three' => 19, + 'remark' => '2017-2018学年上学期' + ]); + } +} diff --git a/backend/database/seeds/UsersTableSeeder.php b/backend/database/seeds/UsersTableSeeder.php new file mode 100644 index 00000000..4df549da --- /dev/null +++ b/backend/database/seeds/UsersTableSeeder.php @@ -0,0 +1,33 @@ +insert([ + 'name' => 'wmhello', + 'email' => '871228582@qq.com', + 'password' => bcrypt('123456'), + 'role' => 'admin', + 'avatar' => 'uploads/201711251441th5a19812148058.jpg', + 'remember_token' => str_random(10), + ]); + + DB::table('users')->insert([ + 'name' => 'dongdong', + 'email' => '786270744@qq.com', + 'password' => bcrypt('123456'), + 'role' => 'user', + 'avatar' => 'uploads/201711251509th5a19879c71868.jpg', + 'remember_token' => str_random(10), + ]); + } +} diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 00000000..dedcbef7 --- /dev/null +++ b/backend/package.json @@ -0,0 +1,21 @@ +{ + "private": true, + "scripts": { + "dev": "npm run development", + "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", + "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", + "watch-poll": "npm run watch -- --watch-poll", + "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", + "prod": "npm run production", + "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" + }, + "devDependencies": { + "axios": "^0.16.2", + "bootstrap-sass": "^3.3.7", + "cross-env": "^5.0.1", + "jquery": "^3.1.1", + "laravel-mix": "^1.0", + "lodash": "^4.17.4", + "vue": "^2.1.10" + } +} diff --git a/backend/phpunit.xml b/backend/phpunit.xml new file mode 100644 index 00000000..bb9c4a7e --- /dev/null +++ b/backend/phpunit.xml @@ -0,0 +1,31 @@ + + + + + ./tests/Feature + + + + ./tests/Unit + + + + + ./app + + + + + + + + + diff --git a/backend/public/.htaccess b/backend/public/.htaccess new file mode 100644 index 00000000..09683488 --- /dev/null +++ b/backend/public/.htaccess @@ -0,0 +1,21 @@ + + + Options -MultiViews + + + RewriteEngine On + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Handle Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + diff --git a/backend/public/apidoc/api_data.js b/backend/public/apidoc/api_data.js new file mode 100644 index 00000000..240e9f8a --- /dev/null +++ b/backend/public/apidoc/api_data.js @@ -0,0 +1,1010 @@ +define({ "api": [ + { + "success": { + "fields": { + "Success 200": [ + { + "group": "Success 200", + "optional": false, + "field": "varname1", + "description": "

No type.

" + }, + { + "group": "Success 200", + "type": "String", + "optional": false, + "field": "varname2", + "description": "

With type.

" + } + ] + } + }, + "type": "", + "url": "", + "version": "0.0.0", + "filename": "./public/apidoc/main.js", + "group": "D__laravel_template_with_vue_backend_public_apidoc_main_js", + "groupTitle": "D__laravel_template_with_vue_backend_public_apidoc_main_js", + "name": "" + }, + { + "type": "delete", + "url": "/api/admin/:id", + "title": "删除指定的管理员", + "group": "admin", + "success": { + "examples": [ + { + "title": "用户删除成功", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "用户删除失败", + "content": "HTTP/1.1 404 ERROR\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "DeleteApiAdminId" + }, + { + "type": "get", + "url": "/api/admin", + "title": "显示管理员列表", + "group": "admin", + "success": { + "examples": [ + { + "title": "返回管理员信息列表", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 2 // 整数型 用户标识\n \"name\": \"test\" //字符型 用户昵称\n \"email\": \"test@qq.com\" // 字符型 用户email,管理员登录时的email\n \"role\": \"admin\" // 字符型 角色 可以取得值为admin或editor\n \"avatar\": \"\" // 字符型 用户的头像图片\n }\n ],\n\"status\": \"success\",\n\"status_code\": 200,\n\"links\": {\n\"first\": \"http://manger.test/api/admin?page=1\",\n\"last\": \"http://manger.test/api/admin?page=19\",\n\"prev\": null,\n\"next\": \"http://manger.test/api/admin?page=2\"\n},\n\"meta\": {\n\"current_page\": 1, // 当前页\n\"from\": 1, //当前页开始的记录\n\"last_page\": 19, //总页数\n\"path\": \"http://manger.test/api/admin\",\n\"per_page\": 15,\n\"to\": 15, //当前页结束的记录\n\"total\": 271 // 总条数\n}\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "GetApiAdmin" + }, + { + "type": "get", + "url": "/api/admin/:id", + "title": "显示指定的管理员", + "group": "admin", + "success": { + "examples": [ + { + "title": "返回管理员信息", + "content": "HTTP/1.1 200 OK\n{\n\"data\": {\n \"id\": 1,\n \"name\": \"wmhello\",\n \"email\": \"871228582@qq.com\",\n \"role\": \"admin\",\n \"avatar\": \"\"\n},\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "GetApiAdminId" + }, + { + "type": "post", + "url": "/api/admin", + "title": "建立新的管理员", + "group": "admin", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "name", + "description": "

用户昵称

" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "email", + "description": "

用户登陆名 email格式 必须唯一

" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "password", + "description": "

用户登陆密码

" + }, + { + "group": "Parameter", + "type": "string", + "allowedValues": [ + "\"admin\"", + "\"editor\"" + ], + "optional": true, + "field": "role", + "defaultValue": "editor", + "description": "

角色 内容为空或者其他的都设置为editor

" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "avatar", + "description": "

用户头像地址

" + } + ] + }, + "examples": [ + { + "title": "请求的参数例子:", + "content": "{\n name: 'test',\n email: '1111@qq.com',\n password: '123456',\n role: 'editor',\n avatar: 'uploads/20178989.png'\n}", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "新建用户成功", + "content": "HTTP/1.1 201 OK\n{\n\"status\": \"success\",\n\"status_code\": 201\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404,\n\"message\": \"信息提交不完全或者不规范,校验不通过,请重新提交\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "PostApiAdmin" + }, + { + "type": "post", + "url": "/api/admin/:id/reset", + "title": "重置指定管理员的密码", + "group": "admin", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "password", + "description": "

用户密码

" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "返回密码设置成功的结果", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "PostApiAdminIdReset" + }, + { + "type": "post", + "url": "/api/admin/upload", + "title": "头像图片上传", + "group": "admin", + "header": { + "examples": [ + { + "title": "http头部请求:", + "content": "{\n \"content-type\": \"application/form-data\"\n}", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "上传成功", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200,\n\"data\": {\n \"url\" : 'uploads/3201278123689.png'\n }\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "上传失败", + "content": "HTTP/1.1 400 ERROR\n{\n\"status\": \"error\",\n\"status_code\": 400\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "PostApiAdminUpload" + }, + { + "type": "put", + "url": "/api/admin/:id", + "title": "更新指定的管理员", + "group": "admin", + "header": { + "examples": [ + { + "title": "http头部请求:", + "content": "{\n \"content-type\": \"application/x-www-form-urlencoded\"\n}", + "type": "json" + } + ] + }, + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "name", + "description": "

用户昵称

" + }, + { + "group": "Parameter", + "type": "string", + "allowedValues": [ + "\"admin\"", + "\"editor\"" + ], + "optional": true, + "field": "role", + "defaultValue": "editor", + "description": "

角色 内容为空或者其他的都设置为editor

" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "avatar", + "description": "

用户头像地址

" + } + ] + }, + "examples": [ + { + "title": "请求参数例子", + "content": "{\n name: 'test',\n role: 'editor',\n avatar: 'uploads/20174356.png'\n}", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "返回密码设置成功的结果", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404,\n\"message\": \"信息提交不完全或者不规范,校验不通过,请重新提交\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "PutApiAdminId" + }, + { + "type": "get", + "url": "/api/user", + "title": "获取当前登陆的用户信息", + "group": "login", + "success": { + "examples": [ + { + "title": "信息获取成功", + "content": "HTTP/1.1 200 OK\n{\n\"data\": {\n \"id\": 1,\n \"name\": \"xxx\",\n \"email\": \"xxx@qq.com\",\n \"roles\": \"xxx\", //角色: admin或者editor\n \"avatar\": \"\"\n },\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "login", + "name": "GetApiUser" + }, + { + "type": "post", + "url": "/api/login", + "title": "用户登陆", + "group": "login", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "email", + "description": "

用户email

" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "password", + "description": "

用户密码

" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "登陆成功", + "content": "HTTP/1.1 200 OK\n{\n\"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJS\",\n\"expires_in\": 900 // 过期时间\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "用户身份验证失败", + "content": "HTTP/1.1 421 用户名或者密码输入错误\n{\n\"status\": \"login error\",\n\"status_code\": 421,\n\"message\": \"Credentials not match\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/Auth/LoginController.php", + "groupTitle": "login", + "name": "PostApiLogin" + }, + { + "type": "post", + "url": "/api/logout", + "title": "注销用户登陆", + "group": "login", + "success": { + "examples": [ + { + "title": "注销成功", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200,\n\"message\": \"logout success\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/Auth/LoginController.php", + "groupTitle": "login", + "name": "PostApiLogout" + }, + { + "type": "post", + "url": "/api/token/refresh", + "title": "Token刷新", + "group": "login", + "success": { + "examples": [ + { + "title": "刷新成功", + "content": "HTTP/1.1 200 OK\n{\n\"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJS\",\n\"expires_in\": 900 // 过期时间\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "刷新失败", + "content": "HTTP/1.1 401 未认证\n{\n\"status\": \"login error\",\n\"status_code\": 401,\n\"message\": \"Credentials not match\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/Auth/LoginController.php", + "groupTitle": "login", + "name": "PostApiTokenRefresh" + }, + { + "type": "get", + "url": "/api/getSession", + "title": "获取学期信息", + "group": "other", + "success": { + "examples": [ + { + "title": "返回学期信息列表,", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 2 // 整数型 学期标识\n \"year\": 2016 //数字型 学年\n \"team\": 2 // 数字型 学期\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "other", + "name": "GetApiGetsession" + }, + { + "type": "delete", + "url": "/api/role/:id", + "title": "删除指定的角色信息", + "group": "role", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "

角色标识

" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "信息获取成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "删除失败,没有指定的角色:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404,\n\"message\": \"删除失败\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/RoleController.php", + "groupTitle": "role", + "name": "DeleteApiRoleId" + }, + { + "type": "get", + "url": "/api/role", + "title": "显示学期列表", + "group": "role", + "success": { + "examples": [ + { + "title": "返回所有的角色", + "content": "HTTP/1.1 200 OK\n {\n \"data\": [\n {\n \"id\": 2,\n \"name\": \"admin\",\n \"explain\": \"管理员\",\n \"remark\": null\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200,\n \"links\": {\n \"first\": \"http://manger.test/api/role?page=1\",\n \"last\": \"http://manger.test/api/role?page=1\",\n \"prev\": null,\n \"next\": null\n },\n \"meta\": {\n \"current_page\": 1,\n \"from\": 1,\n \"last_page\": 1,\n \"path\": \"http://manger.test/api/role\",\n \"per_page\": 15,\n \"to\": 30,\n \"total\": 5\n }\n }", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/RoleController.php", + "groupTitle": "role", + "name": "GetApiRole" + }, + { + "type": "get", + "url": "/api/role/:id", + "title": "获取一条角色", + "group": "role", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "

角色标识

" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "信息获取成功:", + "content": "HTTP/1.1 200 OK\n{\n\"data\": [\n {\n \"id\": 2,\n \"name\": \"admin\",\n \"explain\": \"管理员\",\n \"remark\": null\n }\n],\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "指定的角色不存在:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/RoleController.php", + "groupTitle": "role", + "name": "GetApiRoleId" + }, + { + "type": "patch", + "url": "/api/role/:id", + "title": "更新角色信息", + "group": "role", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "

角色标识 路由上使用

" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "name", + "description": "

角色名称

" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "explain", + "description": "

角色描述

" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "

备注 可选

" + } + ] + }, + "examples": [ + { + "title": "请求事例 建立学期 2017-2018上学期:", + "content": "{\nname: 'admin',\nexplain: '管理员',\nremark: '管理员'\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "请求头:", + "content": "{ \"Content-Type\": \"application/x-www-form-urlencoded\" }", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/RoleController.php", + "groupTitle": "role", + "name": "PatchApiRoleId" + }, + { + "type": "post", + "url": "/api/role", + "title": "新建一条角色信息", + "group": "role", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "name", + "description": "

角色名称

" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "explain", + "description": "

角色说明

" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "

角色备注 可选

" + } + ] + }, + "examples": [ + { + "title": "请求事例 建", + "content": "{\nname: 'app',\nexplain: '应用管理者'\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "请求头:", + "content": "{ \"Content-Type\": \"application/x-www-form-urlencoded\" }", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404,\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/RoleController.php", + "groupTitle": "role", + "name": "PostApiRole" + }, + { + "type": "delete", + "url": "/api/session/:id", + "title": "删除指定的学期信息", + "group": "session", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "

学期标识

" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "信息获取成功:", + "content": "HTTP/1.1 200 OK\n{\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "删除失败,没有指定的学期:", + "content": "HTTP/1.1 404 Not Found\n{\n \"status\": \"error\",\n \"status_code\": 404,\n \"message\": \"删除失败\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "session", + "name": "DeleteApiSessionId" + }, + { + "type": "get", + "url": "/api/session", + "title": "显示学期列表", + "group": "session", + "success": { + "examples": [ + { + "title": "返回学期信息列表,分页显示,每页15条记录,", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 2 // 整数型 学期标识\n \"year\": 2016 //数字型 学年\n \"team\": 2 // 数字型 学期\n \"remark\": \"2016-2017下学期\" // 备注说明\n \"one\": 20, // 高一年级班级数\n \"two\": 20, // 高二年级班级数\n \"three\": 20 // 高三年级班级数\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200,\n \"links\": {\n \"first\": \"http://manger.test/api/session?page=1\",\n \"last\": \"http://manger.test/api/session?page=1\",\n \"prev\": null,\n \"next\": null\n },\n \"meta\": {\n \"current_page\": 1, //当前页\n \"from\": 1, // 当前记录\n \"last_page\": 1, //最后一页\n \"path\": \"http://manger.test/api/session\",\n \"per_page\": 15, //\n \"to\": 4, //当前页最后一条记录\n \"total\": 4 // 总记录\n }\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "session", + "name": "GetApiSession" + }, + { + "type": "get", + "url": "/api/session/:id", + "title": "获取指定学期信息", + "group": "session", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "

学期标识

" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "信息获取成功:", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 2 // 整数型 学期标识\n \"year\": 2016 //数字型 学年\n \"team\": 2 // 数字型 学期\n \"remark\": \"2016-2017下学期\" // 备注说明\n \"one\": 20, // 高一年级班级数\n \"two\": 20, // 高二年级班级数\n \"three\": 20 // 高三年级班级数\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "指定的学期不能存在:", + "content": "HTTP/1.1 404 Not Found\n{\n \"status\": \"error\",\n \"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "session", + "name": "GetApiSessionId" + }, + { + "type": "patch", + "url": "/api/session/:id", + "title": "更新学期信息", + "group": "session", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "

学期标识 路由上使用

" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "year", + "description": "

学年

" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "1", + "2" + ], + "optional": false, + "field": "team", + "description": "

学期(1=>上学期 2=>下学期)

" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "one", + "description": "

高一班级数

" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "two", + "description": "

高二班级数

" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "three", + "description": "

高三班级数

" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "

备注 可选

" + } + ] + }, + "examples": [ + { + "title": "请求事例 建立学期 2017-2018上学期:", + "content": " {\n year: 2017,\n team: 1,\n remark: '2017-2018上学期',\n one: 20,\n two: 20,\n three: 20\n\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "请求头:", + "content": "{ \"Content-Type\": \"application/x-www-form-urlencoded\" }", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 404 Not Found\n{\n \"status\": \"error\",\n \"status_code\": 404,\n \"message\": \"验证出错,请按要求填写\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "session", + "name": "PatchApiSessionId" + }, + { + "type": "post", + "url": "/api/session", + "title": "新建一个学期信息", + "group": "session", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "year", + "description": "

学年

" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "1", + "2" + ], + "optional": false, + "field": "team", + "description": "

学期(1=>上学期 2=>下学期)

" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "one", + "description": "

高一班级数

" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "two", + "description": "

高二班级数

" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "three", + "description": "

高三班级数

" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "

备注 可选

" + } + ] + }, + "examples": [ + { + "title": "请求事例 建立学期 2017-2018上学期:", + "content": " {\n year: 2017,\n team: 1,\n one: 20,\n two: 20,\n three: 20\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "请求头:", + "content": "{ \"Content-Type\": \"application/x-www-form-urlencoded\" }", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 404 Not Found\n{\n \"status\": \"error\",\n \"status_code\": 404,\n \"message\": \"验证出错,请按要求填写\"\n}", + "type": "json" + }, + { + "title": "重复提交:", + "content": "HTTP/1.1 404 Not Found\n{\n \"status\": \"error\",\n \"status_code\": 400,\n \"message\": \"你提交的学期信息已经存在,无法新建\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "session", + "name": "PostApiSession" + } +] }); diff --git a/backend/public/apidoc/api_data.json b/backend/public/apidoc/api_data.json new file mode 100644 index 00000000..89052416 --- /dev/null +++ b/backend/public/apidoc/api_data.json @@ -0,0 +1,1010 @@ +[ + { + "success": { + "fields": { + "Success 200": [ + { + "group": "Success 200", + "optional": false, + "field": "varname1", + "description": "

No type.

" + }, + { + "group": "Success 200", + "type": "String", + "optional": false, + "field": "varname2", + "description": "

With type.

" + } + ] + } + }, + "type": "", + "url": "", + "version": "0.0.0", + "filename": "./public/apidoc/main.js", + "group": "D__laravel_template_with_vue_backend_public_apidoc_main_js", + "groupTitle": "D__laravel_template_with_vue_backend_public_apidoc_main_js", + "name": "" + }, + { + "type": "delete", + "url": "/api/admin/:id", + "title": "删除指定的管理员", + "group": "admin", + "success": { + "examples": [ + { + "title": "用户删除成功", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "用户删除失败", + "content": "HTTP/1.1 404 ERROR\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "DeleteApiAdminId" + }, + { + "type": "get", + "url": "/api/admin", + "title": "显示管理员列表", + "group": "admin", + "success": { + "examples": [ + { + "title": "返回管理员信息列表", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 2 // 整数型 用户标识\n \"name\": \"test\" //字符型 用户昵称\n \"email\": \"test@qq.com\" // 字符型 用户email,管理员登录时的email\n \"role\": \"admin\" // 字符型 角色 可以取得值为admin或editor\n \"avatar\": \"\" // 字符型 用户的头像图片\n }\n ],\n\"status\": \"success\",\n\"status_code\": 200,\n\"links\": {\n\"first\": \"http://manger.test/api/admin?page=1\",\n\"last\": \"http://manger.test/api/admin?page=19\",\n\"prev\": null,\n\"next\": \"http://manger.test/api/admin?page=2\"\n},\n\"meta\": {\n\"current_page\": 1, // 当前页\n\"from\": 1, //当前页开始的记录\n\"last_page\": 19, //总页数\n\"path\": \"http://manger.test/api/admin\",\n\"per_page\": 15,\n\"to\": 15, //当前页结束的记录\n\"total\": 271 // 总条数\n}\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "GetApiAdmin" + }, + { + "type": "get", + "url": "/api/admin/:id", + "title": "显示指定的管理员", + "group": "admin", + "success": { + "examples": [ + { + "title": "返回管理员信息", + "content": "HTTP/1.1 200 OK\n{\n\"data\": {\n \"id\": 1,\n \"name\": \"wmhello\",\n \"email\": \"871228582@qq.com\",\n \"role\": \"admin\",\n \"avatar\": \"\"\n},\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "GetApiAdminId" + }, + { + "type": "post", + "url": "/api/admin", + "title": "建立新的管理员", + "group": "admin", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "name", + "description": "

用户昵称

" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "email", + "description": "

用户登陆名 email格式 必须唯一

" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "password", + "description": "

用户登陆密码

" + }, + { + "group": "Parameter", + "type": "string", + "allowedValues": [ + "\"admin\"", + "\"editor\"" + ], + "optional": true, + "field": "role", + "defaultValue": "editor", + "description": "

角色 内容为空或者其他的都设置为editor

" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "avatar", + "description": "

用户头像地址

" + } + ] + }, + "examples": [ + { + "title": "请求的参数例子:", + "content": "{\n name: 'test',\n email: '1111@qq.com',\n password: '123456',\n role: 'editor',\n avatar: 'uploads/20178989.png'\n}", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "新建用户成功", + "content": "HTTP/1.1 201 OK\n{\n\"status\": \"success\",\n\"status_code\": 201\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404,\n\"message\": \"信息提交不完全或者不规范,校验不通过,请重新提交\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "PostApiAdmin" + }, + { + "type": "post", + "url": "/api/admin/:id/reset", + "title": "重置指定管理员的密码", + "group": "admin", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "password", + "description": "

用户密码

" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "返回密码设置成功的结果", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "PostApiAdminIdReset" + }, + { + "type": "post", + "url": "/api/admin/upload", + "title": "头像图片上传", + "group": "admin", + "header": { + "examples": [ + { + "title": "http头部请求:", + "content": "{\n \"content-type\": \"application/form-data\"\n}", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "上传成功", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200,\n\"data\": {\n \"url\" : 'uploads/3201278123689.png'\n }\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "上传失败", + "content": "HTTP/1.1 400 ERROR\n{\n\"status\": \"error\",\n\"status_code\": 400\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "PostApiAdminUpload" + }, + { + "type": "put", + "url": "/api/admin/:id", + "title": "更新指定的管理员", + "group": "admin", + "header": { + "examples": [ + { + "title": "http头部请求:", + "content": "{\n \"content-type\": \"application/x-www-form-urlencoded\"\n}", + "type": "json" + } + ] + }, + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "name", + "description": "

用户昵称

" + }, + { + "group": "Parameter", + "type": "string", + "allowedValues": [ + "\"admin\"", + "\"editor\"" + ], + "optional": true, + "field": "role", + "defaultValue": "editor", + "description": "

角色 内容为空或者其他的都设置为editor

" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "avatar", + "description": "

用户头像地址

" + } + ] + }, + "examples": [ + { + "title": "请求参数例子", + "content": "{\n name: 'test',\n role: 'editor',\n avatar: 'uploads/20174356.png'\n}", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "返回密码设置成功的结果", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404,\n\"message\": \"信息提交不完全或者不规范,校验不通过,请重新提交\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "PutApiAdminId" + }, + { + "type": "get", + "url": "/api/user", + "title": "获取当前登陆的用户信息", + "group": "login", + "success": { + "examples": [ + { + "title": "信息获取成功", + "content": "HTTP/1.1 200 OK\n{\n\"data\": {\n \"id\": 1,\n \"name\": \"xxx\",\n \"email\": \"xxx@qq.com\",\n \"roles\": \"xxx\", //角色: admin或者editor\n \"avatar\": \"\"\n },\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "login", + "name": "GetApiUser" + }, + { + "type": "post", + "url": "/api/login", + "title": "用户登陆", + "group": "login", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "email", + "description": "

用户email

" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "password", + "description": "

用户密码

" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "登陆成功", + "content": "HTTP/1.1 200 OK\n{\n\"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJS\",\n\"expires_in\": 900 // 过期时间\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "用户身份验证失败", + "content": "HTTP/1.1 421 用户名或者密码输入错误\n{\n\"status\": \"login error\",\n\"status_code\": 421,\n\"message\": \"Credentials not match\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/Auth/LoginController.php", + "groupTitle": "login", + "name": "PostApiLogin" + }, + { + "type": "post", + "url": "/api/logout", + "title": "注销用户登陆", + "group": "login", + "success": { + "examples": [ + { + "title": "注销成功", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200,\n\"message\": \"logout success\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/Auth/LoginController.php", + "groupTitle": "login", + "name": "PostApiLogout" + }, + { + "type": "post", + "url": "/api/token/refresh", + "title": "Token刷新", + "group": "login", + "success": { + "examples": [ + { + "title": "刷新成功", + "content": "HTTP/1.1 200 OK\n{\n\"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJS\",\n\"expires_in\": 900 // 过期时间\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "刷新失败", + "content": "HTTP/1.1 401 未认证\n{\n\"status\": \"login error\",\n\"status_code\": 401,\n\"message\": \"Credentials not match\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/Auth/LoginController.php", + "groupTitle": "login", + "name": "PostApiTokenRefresh" + }, + { + "type": "get", + "url": "/api/getSession", + "title": "获取学期信息", + "group": "other", + "success": { + "examples": [ + { + "title": "返回学期信息列表,", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 2 // 整数型 学期标识\n \"year\": 2016 //数字型 学年\n \"team\": 2 // 数字型 学期\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "other", + "name": "GetApiGetsession" + }, + { + "type": "delete", + "url": "/api/role/:id", + "title": "删除指定的角色信息", + "group": "role", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "

角色标识

" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "信息获取成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "删除失败,没有指定的角色:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404,\n\"message\": \"删除失败\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/RoleController.php", + "groupTitle": "role", + "name": "DeleteApiRoleId" + }, + { + "type": "get", + "url": "/api/role", + "title": "显示学期列表", + "group": "role", + "success": { + "examples": [ + { + "title": "返回所有的角色", + "content": "HTTP/1.1 200 OK\n {\n \"data\": [\n {\n \"id\": 2,\n \"name\": \"admin\",\n \"explain\": \"管理员\",\n \"remark\": null\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200,\n \"links\": {\n \"first\": \"http://manger.test/api/role?page=1\",\n \"last\": \"http://manger.test/api/role?page=1\",\n \"prev\": null,\n \"next\": null\n },\n \"meta\": {\n \"current_page\": 1,\n \"from\": 1,\n \"last_page\": 1,\n \"path\": \"http://manger.test/api/role\",\n \"per_page\": 15,\n \"to\": 30,\n \"total\": 5\n }\n }", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/RoleController.php", + "groupTitle": "role", + "name": "GetApiRole" + }, + { + "type": "get", + "url": "/api/role/:id", + "title": "获取一条角色", + "group": "role", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "

角色标识

" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "信息获取成功:", + "content": "HTTP/1.1 200 OK\n{\n\"data\": [\n {\n \"id\": 2,\n \"name\": \"admin\",\n \"explain\": \"管理员\",\n \"remark\": null\n }\n],\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "指定的角色不存在:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/RoleController.php", + "groupTitle": "role", + "name": "GetApiRoleId" + }, + { + "type": "patch", + "url": "/api/role/:id", + "title": "更新角色信息", + "group": "role", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "

角色标识 路由上使用

" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "name", + "description": "

角色名称

" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "explain", + "description": "

角色描述

" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "

备注 可选

" + } + ] + }, + "examples": [ + { + "title": "请求事例 建立学期 2017-2018上学期:", + "content": "{\nname: 'admin',\nexplain: '管理员',\nremark: '管理员'\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "请求头:", + "content": "{ \"Content-Type\": \"application/x-www-form-urlencoded\" }", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/RoleController.php", + "groupTitle": "role", + "name": "PatchApiRoleId" + }, + { + "type": "post", + "url": "/api/role", + "title": "新建一条角色信息", + "group": "role", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "name", + "description": "

角色名称

" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "explain", + "description": "

角色说明

" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "

角色备注 可选

" + } + ] + }, + "examples": [ + { + "title": "请求事例 建", + "content": "{\nname: 'app',\nexplain: '应用管理者'\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "请求头:", + "content": "{ \"Content-Type\": \"application/x-www-form-urlencoded\" }", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404,\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/RoleController.php", + "groupTitle": "role", + "name": "PostApiRole" + }, + { + "type": "delete", + "url": "/api/session/:id", + "title": "删除指定的学期信息", + "group": "session", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "

学期标识

" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "信息获取成功:", + "content": "HTTP/1.1 200 OK\n{\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "删除失败,没有指定的学期:", + "content": "HTTP/1.1 404 Not Found\n{\n \"status\": \"error\",\n \"status_code\": 404,\n \"message\": \"删除失败\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "session", + "name": "DeleteApiSessionId" + }, + { + "type": "get", + "url": "/api/session", + "title": "显示学期列表", + "group": "session", + "success": { + "examples": [ + { + "title": "返回学期信息列表,分页显示,每页15条记录,", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 2 // 整数型 学期标识\n \"year\": 2016 //数字型 学年\n \"team\": 2 // 数字型 学期\n \"remark\": \"2016-2017下学期\" // 备注说明\n \"one\": 20, // 高一年级班级数\n \"two\": 20, // 高二年级班级数\n \"three\": 20 // 高三年级班级数\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200,\n \"links\": {\n \"first\": \"http://manger.test/api/session?page=1\",\n \"last\": \"http://manger.test/api/session?page=1\",\n \"prev\": null,\n \"next\": null\n },\n \"meta\": {\n \"current_page\": 1, //当前页\n \"from\": 1, // 当前记录\n \"last_page\": 1, //最后一页\n \"path\": \"http://manger.test/api/session\",\n \"per_page\": 15, //\n \"to\": 4, //当前页最后一条记录\n \"total\": 4 // 总记录\n }\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "session", + "name": "GetApiSession" + }, + { + "type": "get", + "url": "/api/session/:id", + "title": "获取指定学期信息", + "group": "session", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "

学期标识

" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "信息获取成功:", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 2 // 整数型 学期标识\n \"year\": 2016 //数字型 学年\n \"team\": 2 // 数字型 学期\n \"remark\": \"2016-2017下学期\" // 备注说明\n \"one\": 20, // 高一年级班级数\n \"two\": 20, // 高二年级班级数\n \"three\": 20 // 高三年级班级数\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "指定的学期不能存在:", + "content": "HTTP/1.1 404 Not Found\n{\n \"status\": \"error\",\n \"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "session", + "name": "GetApiSessionId" + }, + { + "type": "patch", + "url": "/api/session/:id", + "title": "更新学期信息", + "group": "session", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "

学期标识 路由上使用

" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "year", + "description": "

学年

" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "1", + "2" + ], + "optional": false, + "field": "team", + "description": "

学期(1=>上学期 2=>下学期)

" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "one", + "description": "

高一班级数

" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "two", + "description": "

高二班级数

" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "three", + "description": "

高三班级数

" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "

备注 可选

" + } + ] + }, + "examples": [ + { + "title": "请求事例 建立学期 2017-2018上学期:", + "content": " {\n year: 2017,\n team: 1,\n remark: '2017-2018上学期',\n one: 20,\n two: 20,\n three: 20\n\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "请求头:", + "content": "{ \"Content-Type\": \"application/x-www-form-urlencoded\" }", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 404 Not Found\n{\n \"status\": \"error\",\n \"status_code\": 404,\n \"message\": \"验证出错,请按要求填写\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "session", + "name": "PatchApiSessionId" + }, + { + "type": "post", + "url": "/api/session", + "title": "新建一个学期信息", + "group": "session", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "year", + "description": "

学年

" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "1", + "2" + ], + "optional": false, + "field": "team", + "description": "

学期(1=>上学期 2=>下学期)

" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "one", + "description": "

高一班级数

" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "two", + "description": "

高二班级数

" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "three", + "description": "

高三班级数

" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "

备注 可选

" + } + ] + }, + "examples": [ + { + "title": "请求事例 建立学期 2017-2018上学期:", + "content": " {\n year: 2017,\n team: 1,\n one: 20,\n two: 20,\n three: 20\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "请求头:", + "content": "{ \"Content-Type\": \"application/x-www-form-urlencoded\" }", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 404 Not Found\n{\n \"status\": \"error\",\n \"status_code\": 404,\n \"message\": \"验证出错,请按要求填写\"\n}", + "type": "json" + }, + { + "title": "重复提交:", + "content": "HTTP/1.1 404 Not Found\n{\n \"status\": \"error\",\n \"status_code\": 400,\n \"message\": \"你提交的学期信息已经存在,无法新建\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "session", + "name": "PostApiSession" + } +] diff --git a/backend/public/apidoc/api_project.js b/backend/public/apidoc/api_project.js new file mode 100644 index 00000000..c3729c00 --- /dev/null +++ b/backend/public/apidoc/api_project.js @@ -0,0 +1,16 @@ +define({ + "name": "后台管理系统", + "version": "1.0.0", + "description": "通用管理后台 带权限设置", + "title": "通用后台管理系统", + "url": "", + "sampleUrl": false, + "defaultVersion": "0.0.0", + "apidoc": "0.3.0", + "generator": { + "name": "apidoc", + "time": "2018-02-19T14:05:55.277Z", + "url": "http://apidocjs.com", + "version": "0.17.6" + } +}); diff --git a/backend/public/apidoc/api_project.json b/backend/public/apidoc/api_project.json new file mode 100644 index 00000000..4616bbf2 --- /dev/null +++ b/backend/public/apidoc/api_project.json @@ -0,0 +1,16 @@ +{ + "name": "后台管理系统", + "version": "1.0.0", + "description": "通用管理后台 带权限设置", + "title": "通用后台管理系统", + "url": "", + "sampleUrl": false, + "defaultVersion": "0.0.0", + "apidoc": "0.3.0", + "generator": { + "name": "apidoc", + "time": "2018-02-19T14:05:55.277Z", + "url": "http://apidocjs.com", + "version": "0.17.6" + } +} diff --git a/backend/public/apidoc/css/style.css b/backend/public/apidoc/css/style.css new file mode 100644 index 00000000..6468b2b2 --- /dev/null +++ b/backend/public/apidoc/css/style.css @@ -0,0 +1,569 @@ +/* ------------------------------------------------------------------------------------------ + * Content + * ------------------------------------------------------------------------------------------ */ +body { + min-width: 980px; + max-width: 1280px; +} + +body, p, a, div, th, td { + font-family: "Source Sans Pro", sans-serif; + font-weight: 400; + font-size: 16px; +} + +td.code { + font-size: 14px; + font-family: "Source Code Pro", monospace; + font-style: normal; + font-weight: 400; +} + +#content { + padding-top: 16px; + z-Index: -1; + margin-left: 270px; +} + +p { + color: #808080; +} + +h1 { + font-family: "Source Sans Pro Semibold", sans-serif; + font-weight: normal; + font-size: 44px; + line-height: 50px; + margin: 0 0 10px 0; + padding: 0; +} + +h2 { + font-family: "Source Sans Pro", sans-serif; + font-weight: normal; + font-size: 24px; + line-height: 40px; + margin: 0 0 20px 0; + padding: 0; +} + +section { + border-top: 1px solid #ebebeb; + padding: 30px 0; +} + +section h1 { + font-family: "Source Sans Pro", sans-serif; + font-weight: 700; + font-size: 32px; + line-height: 40px; + padding-bottom: 14px; + margin: 0 0 20px 0; + padding: 0; +} + +article { + padding: 14px 0 30px 0; +} + +article h1 { + font-family: "Source Sans Pro Bold", sans-serif; + font-weight: 600; + font-size: 24px; + line-height: 26px; +} + +article h2 { + font-family: "Source Sans Pro", sans-serif; + font-weight: 600; + font-size: 18px; + line-height: 24px; + margin: 0 0 10px 0; +} + +article h3 { + font-family: "Source Sans Pro", sans-serif; + font-weight: 600; + font-size: 16px; + line-height: 18px; + margin: 0 0 10px 0; +} + +article h4 { + font-family: "Source Sans Pro", sans-serif; + font-weight: 600; + font-size: 14px; + line-height: 16px; + margin: 0 0 8px 0; +} + +table { + border-collapse: collapse; + width: 100%; + margin: 0 0 20px 0; +} + +th { + background-color: #f5f5f5; + text-align: left; + font-family: "Source Sans Pro", sans-serif; + font-weight: 700; + padding: 4px 8px; + border: #e0e0e0 1px solid; +} + +td { + vertical-align: top; + padding: 10px 8px 0 8px; + border: #e0e0e0 1px solid; +} + +#generator .content { + color: #b0b0b0; + border-top: 1px solid #ebebeb; + padding: 10px 0; +} + +.label-optional { + float: right; + background-color: grey; + margin-top: 4px; +} + +.open-left { + right: 0; + left: auto; +} + +/* ------------------------------------------------------------------------------------------ + * apidoc - intro + * ------------------------------------------------------------------------------------------ */ + +#apidoc .apidoc { + border-top: 1px solid #ebebeb; + padding: 30px 0; +} + +#apidoc h1 { + font-family: "Source Sans Pro", sans-serif; + font-weight: 700; + font-size: 32px; + line-height: 40px; + padding-bottom: 14px; + margin: 0 0 20px 0; + padding: 0; +} + +#apidoc h2 { + font-family: "Source Sans Pro Bold", sans-serif; + font-weight: 600; + font-size: 22px; + line-height: 26px; + padding-top: 14px; +} + +/* ------------------------------------------------------------------------------------------ + * pre / code + * ------------------------------------------------------------------------------------------ */ +pre { + background-color: #292b36; + color: #ffffff; + padding: 10px; + border-radius: 6px; + position: relative; + margin: 10px 0 20px 0; + overflow-x: auto; +} + +pre.prettyprint { + width: 100%; +} + +code.language-text { + word-wrap: break-word; +} + +pre.language-json { + overflow: auto; +} + +pre.language-html { + margin: 0 0 20px 0; +} + +.type { + font-family: "Source Sans Pro", sans-serif; + font-weight: 600; + font-size: 15px; + display: inline-block; + margin: 0 0 5px 0; + padding: 4px 5px; + border-radius: 6px; + text-transform: uppercase; + background-color: #3387CC; + color: #ffffff; +} + +.type__get { + background-color: green; +} + +.type__put { + background-color: #e5c500; +} + +.type__post { + background-color: #4070ec; +} + +.type__delete { + background-color: #ed0039; +} + +pre.language-api .str { + color: #ffffff; +} + +pre.language-api .pln, +pre.language-api .pun { + color: #65B042; +} + +pre code { + display: block; + font-size: 14px; + font-family: "Source Code Pro", monospace; + font-style: normal; + font-weight: 400; + word-wrap: normal; + white-space: pre; +} + +pre code.sample-request-response-json { + white-space: pre-wrap; + max-height: 500px; + overflow: auto; +} + +/* ------------------------------------------------------------------------------------------ + * Sidenav + * ------------------------------------------------------------------------------------------ */ +.sidenav { + width: 228px; + margin: 0; + padding: 0 20px 20px 20px; + position: fixed; + top: 50px; + left: 0; + bottom: 0; + overflow-x: hidden; + overflow-y: auto; + background-color: #f5f5f5; + z-index: 10; +} + +.sidenav > li > a { + display: block; + width: 192px; + margin: 0; + padding: 2px 11px; + border: 0; + border-left: transparent 4px solid; + border-right: transparent 4px solid; + font-family: "Source Sans Pro", sans-serif; + font-weight: 400; + font-size: 14px; +} + +.sidenav > li.nav-header { + margin-top: 8px; + margin-bottom: 8px; +} + +.sidenav > li.nav-header > a { + padding: 5px 15px; + border: 1px solid #e5e5e5; + width: 190px; + font-family: "Source Sans Pro", sans-serif; + font-weight: 700; + font-size: 16px; + background-color: #ffffff; +} + +.sidenav > li.active > a { + position: relative; + z-index: 2; + background-color: #0088cc; + color: #ffffff; +} + +.sidenav > li.has-modifications a { + border-right: #60d060 4px solid; +} + +.sidenav > li.is-new a { + border-left: #e5e5e5 4px solid; +} + +/* ------------------------------------------------------------------------------------------ + * Side nav search + * ------------------------------------------------------------------------------------------ */ +.sidenav-search { + width: 228px; + left: 0px; + position: fixed; + padding: 16px 20px 10px 20px; + background-color: #F5F5F5; + z-index: 11; +} + +.sidenav-search .search { + height: 26px; +} + +.search-reset { + position: absolute; + display: block; + cursor: pointer; + width: 20px; + height: 20px; + text-align: center; + right: 28px; + top: 17px; + background-color: #fff; +} + +/* ------------------------------------------------------------------------------------------ + * Compare + * ------------------------------------------------------------------------------------------ */ + +ins { + background: #60d060; + text-decoration: none; + color: #000000; +} + +del { + background: #f05050; + color: #000000; +} + +.label-ins { + background-color: #60d060; +} + +.label-del { + background-color: #f05050; + text-decoration: line-through; +} + +pre.ins { + background-color: #60d060; +} + +pre.del { + background-color: #f05050; + text-decoration: line-through; +} + +table.ins th, +table.ins td { + background-color: #60d060; +} + +table.del th, +table.del td { + background-color: #f05050; + text-decoration: line-through; +} + +tr.ins td { + background-color: #60d060; +} + +tr.del td { + background-color: #f05050; + text-decoration: line-through; +} + +/* ------------------------------------------------------------------------------------------ + * Spinner + * ------------------------------------------------------------------------------------------ */ + +#loader { + position: absolute; + width: 100%; +} + +#loader p { + padding-top: 80px; + margin-left: -4px; +} + +.spinner { + margin: 200px auto; + width: 60px; + height: 60px; + position: relative; +} + +.container1 > div, .container2 > div, .container3 > div { + width: 14px; + height: 14px; + background-color: #0088cc; + + border-radius: 100%; + position: absolute; + -webkit-animation: bouncedelay 1.2s infinite ease-in-out; + animation: bouncedelay 1.2s infinite ease-in-out; + /* Prevent first frame from flickering when animation starts */ + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.spinner .spinner-container { + position: absolute; + width: 100%; + height: 100%; +} + +.container2 { + -webkit-transform: rotateZ(45deg); + transform: rotateZ(45deg); +} + +.container3 { + -webkit-transform: rotateZ(90deg); + transform: rotateZ(90deg); +} + +.circle1 { top: 0; left: 0; } +.circle2 { top: 0; right: 0; } +.circle3 { right: 0; bottom: 0; } +.circle4 { left: 0; bottom: 0; } + +.container2 .circle1 { + -webkit-animation-delay: -1.1s; + animation-delay: -1.1s; +} + +.container3 .circle1 { + -webkit-animation-delay: -1.0s; + animation-delay: -1.0s; +} + +.container1 .circle2 { + -webkit-animation-delay: -0.9s; + animation-delay: -0.9s; +} + +.container2 .circle2 { + -webkit-animation-delay: -0.8s; + animation-delay: -0.8s; +} + +.container3 .circle2 { + -webkit-animation-delay: -0.7s; + animation-delay: -0.7s; +} + +.container1 .circle3 { + -webkit-animation-delay: -0.6s; + animation-delay: -0.6s; +} + +.container2 .circle3 { + -webkit-animation-delay: -0.5s; + animation-delay: -0.5s; +} + +.container3 .circle3 { + -webkit-animation-delay: -0.4s; + animation-delay: -0.4s; +} + +.container1 .circle4 { + -webkit-animation-delay: -0.3s; + animation-delay: -0.3s; +} + +.container2 .circle4 { + -webkit-animation-delay: -0.2s; + animation-delay: -0.2s; +} + +.container3 .circle4 { + -webkit-animation-delay: -0.1s; + animation-delay: -0.1s; +} + +@-webkit-keyframes bouncedelay { + 0%, 80%, 100% { -webkit-transform: scale(0.0) } + 40% { -webkit-transform: scale(1.0) } +} + +@keyframes bouncedelay { + 0%, 80%, 100% { + transform: scale(0.0); + -webkit-transform: scale(0.0); + } 40% { + transform: scale(1.0); + -webkit-transform: scale(1.0); + } +} + +/* ------------------------------------------------------------------------------------------ + * Tabs + * ------------------------------------------------------------------------------------------ */ +ul.nav-tabs { + margin: 0; +} + +p.deprecated span{ + color: #ff0000; + font-weight: bold; + text-decoration: underline; +} + +/* ------------------------------------------------------------------------------------------ + * Print + * ------------------------------------------------------------------------------------------ */ + +@media print { + + #sidenav, + #version, + #versions, + section .version, + section .versions { + display: none; + } + + #content { + margin-left: 0; + } + + a { + text-decoration: none; + color: inherit; + } + + a:after { + content: " [" attr(href) "] "; + } + + p { + color: #000000 + } + + pre { + background-color: #ffffff; + color: #000000; + padding: 10px; + border: #808080 1px solid; + border-radius: 6px; + position: relative; + margin: 10px 0 20px 0; + } + +} /* /@media print */ diff --git a/backend/public/apidoc/fonts/glyphicons-halflings-regular.eot b/backend/public/apidoc/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 00000000..b93a4953 Binary files /dev/null and b/backend/public/apidoc/fonts/glyphicons-halflings-regular.eot differ diff --git a/backend/public/apidoc/fonts/glyphicons-halflings-regular.svg b/backend/public/apidoc/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 00000000..94fb5490 --- /dev/null +++ b/backend/public/apidoc/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/public/apidoc/fonts/glyphicons-halflings-regular.ttf b/backend/public/apidoc/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 00000000..1413fc60 Binary files /dev/null and b/backend/public/apidoc/fonts/glyphicons-halflings-regular.ttf differ diff --git a/backend/public/apidoc/fonts/glyphicons-halflings-regular.woff b/backend/public/apidoc/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 00000000..9e612858 Binary files /dev/null and b/backend/public/apidoc/fonts/glyphicons-halflings-regular.woff differ diff --git a/backend/public/apidoc/fonts/glyphicons-halflings-regular.woff2 b/backend/public/apidoc/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 00000000..64539b54 Binary files /dev/null and b/backend/public/apidoc/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/backend/public/apidoc/img/favicon.ico b/backend/public/apidoc/img/favicon.ico new file mode 100644 index 00000000..c307a043 Binary files /dev/null and b/backend/public/apidoc/img/favicon.ico differ diff --git a/backend/public/apidoc/index.html b/backend/public/apidoc/index.html new file mode 100644 index 00000000..5f04deda --- /dev/null +++ b/backend/public/apidoc/index.html @@ -0,0 +1,669 @@ + + + + + Loading... + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+

Loading...

+
+
+ + + + diff --git a/backend/public/apidoc/locales/ca.js b/backend/public/apidoc/locales/ca.js new file mode 100644 index 00000000..65af5df2 --- /dev/null +++ b/backend/public/apidoc/locales/ca.js @@ -0,0 +1,25 @@ +define({ + ca: { + 'Allowed values:' : 'Valors permesos:', + 'Compare all with predecessor': 'Comparar tot amb versió anterior', + 'compare changes to:' : 'comparar canvis amb:', + 'compared to' : 'comparat amb', + 'Default value:' : 'Valor per defecte:', + 'Description' : 'Descripció', + 'Field' : 'Camp', + 'General' : 'General', + 'Generated with' : 'Generat amb', + 'Name' : 'Nom', + 'No response values.' : 'Sense valors en la resposta.', + 'optional' : 'opcional', + 'Parameter' : 'Paràmetre', + 'Permission:' : 'Permisos:', + 'Response' : 'Resposta', + 'Send' : 'Enviar', + 'Send a Sample Request' : 'Enviar una petició d\'exemple', + 'show up to version:' : 'mostrar versió:', + 'Size range:' : 'Tamany de rang:', + 'Type' : 'Tipus', + 'url' : 'url' + } +}); diff --git a/backend/public/apidoc/locales/de.js b/backend/public/apidoc/locales/de.js new file mode 100644 index 00000000..f66420d0 --- /dev/null +++ b/backend/public/apidoc/locales/de.js @@ -0,0 +1,25 @@ +define({ + de: { + 'Allowed values:' : 'Erlaubte Werte:', + 'Compare all with predecessor': 'Vergleiche alle mit ihren Vorgängern', + 'compare changes to:' : 'vergleiche Änderungen mit:', + 'compared to' : 'verglichen mit', + 'Default value:' : 'Standardwert:', + 'Description' : 'Beschreibung', + 'Field' : 'Feld', + 'General' : 'Allgemein', + 'Generated with' : 'Erstellt mit', + 'Name' : 'Name', + 'No response values.' : 'Keine Rückgabewerte.', + 'optional' : 'optional', + 'Parameter' : 'Parameter', + 'Permission:' : 'Berechtigung:', + 'Response' : 'Antwort', + 'Send' : 'Senden', + 'Send a Sample Request' : 'Eine Beispielanfrage senden', + 'show up to version:' : 'zeige bis zur Version:', + 'Size range:' : 'Größenbereich:', + 'Type' : 'Typ', + 'url' : 'url' + } +}); diff --git a/backend/public/apidoc/locales/es.js b/backend/public/apidoc/locales/es.js new file mode 100644 index 00000000..3d47e800 --- /dev/null +++ b/backend/public/apidoc/locales/es.js @@ -0,0 +1,25 @@ +define({ + es: { + 'Allowed values:' : 'Valores permitidos:', + 'Compare all with predecessor': 'Comparar todo con versión anterior', + 'compare changes to:' : 'comparar cambios con:', + 'compared to' : 'comparado con', + 'Default value:' : 'Valor por defecto:', + 'Description' : 'Descripción', + 'Field' : 'Campo', + 'General' : 'General', + 'Generated with' : 'Generado con', + 'Name' : 'Nombre', + 'No response values.' : 'Sin valores en la respuesta.', + 'optional' : 'opcional', + 'Parameter' : 'Parámetro', + 'Permission:' : 'Permisos:', + 'Response' : 'Respuesta', + 'Send' : 'Enviar', + 'Send a Sample Request' : 'Enviar una petición de ejemplo', + 'show up to version:' : 'mostrar a versión:', + 'Size range:' : 'Tamaño de rango:', + 'Type' : 'Tipo', + 'url' : 'url' + } +}); diff --git a/backend/public/apidoc/locales/fr.js b/backend/public/apidoc/locales/fr.js new file mode 100644 index 00000000..100a6429 --- /dev/null +++ b/backend/public/apidoc/locales/fr.js @@ -0,0 +1,25 @@ +define({ + fr: { + 'Allowed values:' : 'Valeurs autorisées :', + 'Compare all with predecessor': 'Tout comparer avec ...', + 'compare changes to:' : 'comparer les changements à :', + 'compared to' : 'comparer à', + 'Default value:' : 'Valeur par défaut :', + 'Description' : 'Description', + 'Field' : 'Champ', + 'General' : 'Général', + 'Generated with' : 'Généré avec', + 'Name' : 'Nom', + 'No response values.' : 'Aucune valeur de réponse.', + 'optional' : 'optionnel', + 'Parameter' : 'Paramètre', + 'Permission:' : 'Permission :', + 'Response' : 'Réponse', + 'Send' : 'Envoyer', + 'Send a Sample Request' : 'Envoyer une requête représentative', + 'show up to version:' : 'Montrer à partir de la version :', + 'Size range:' : 'Ordre de grandeur :', + 'Type' : 'Type', + 'url' : 'url' + } +}); diff --git a/backend/public/apidoc/locales/it.js b/backend/public/apidoc/locales/it.js new file mode 100644 index 00000000..8117108c --- /dev/null +++ b/backend/public/apidoc/locales/it.js @@ -0,0 +1,25 @@ +define({ + it: { + 'Allowed values:' : 'Valori permessi:', + 'Compare all with predecessor': 'Confronta tutto con versioni precedenti', + 'compare changes to:' : 'confronta modifiche con:', + 'compared to' : 'confrontato con', + 'Default value:' : 'Valore predefinito:', + 'Description' : 'Descrizione', + 'Field' : 'Campo', + 'General' : 'Generale', + 'Generated with' : 'Creato con', + 'Name' : 'Nome', + 'No response values.' : 'Nessun valore di risposta.', + 'optional' : 'opzionale', + 'Parameter' : 'Parametro', + 'Permission:' : 'Permessi:', + 'Response' : 'Risposta', + 'Send' : 'Invia', + 'Send a Sample Request' : 'Invia una richiesta di esempio', + 'show up to version:' : 'mostra alla versione:', + 'Size range:' : 'Intervallo dimensione:', + 'Type' : 'Tipo', + 'url' : 'url' + } +}); diff --git a/backend/public/apidoc/locales/locale.js b/backend/public/apidoc/locales/locale.js new file mode 100644 index 00000000..ba82385a --- /dev/null +++ b/backend/public/apidoc/locales/locale.js @@ -0,0 +1,50 @@ +define([ + './locales/ca.js', + './locales/de.js', + './locales/es.js', + './locales/fr.js', + './locales/it.js', + './locales/nl.js', + './locales/pl.js', + './locales/pt_br.js', + './locales/ro.js', + './locales/ru.js', + './locales/tr.js', + './locales/vi.js', + './locales/zh.js', + './locales/zh_cn.js' +], function() { + var langId = (navigator.language || navigator.userLanguage).toLowerCase().replace('-', '_'); + var language = langId.substr(0, 2); + var locales = {}; + + for (index in arguments) { + for (property in arguments[index]) + locales[property] = arguments[index][property]; + } + if ( ! locales['en']) + locales['en'] = {}; + + if ( ! locales[langId] && ! locales[language]) + language = 'en'; + + var locale = (locales[langId] ? locales[langId] : locales[language]); + + function __(text) { + var index = locale[text]; + if (index === undefined) + return text; + return index; + }; + + function setLanguage(language) { + locale = locales[language]; + } + + return { + __ : __, + locales : locales, + locale : locale, + setLanguage: setLanguage + }; +}); diff --git a/backend/public/apidoc/locales/nl.js b/backend/public/apidoc/locales/nl.js new file mode 100644 index 00000000..bddfeeb1 --- /dev/null +++ b/backend/public/apidoc/locales/nl.js @@ -0,0 +1,25 @@ +define({ + nl: { + 'Allowed values:' : 'Toegestane waarden:', + 'Compare all with predecessor': 'Vergelijk alle met voorgaande versie', + 'compare changes to:' : 'vergelijk veranderingen met:', + 'compared to' : 'vergelijk met', + 'Default value:' : 'Standaard waarde:', + 'Description' : 'Omschrijving', + 'Field' : 'Veld', + 'General' : 'Algemeen', + 'Generated with' : 'Gegenereerd met', + 'Name' : 'Naam', + 'No response values.' : 'Geen response waardes.', + 'optional' : 'optioneel', + 'Parameter' : 'Parameter', + 'Permission:' : 'Permissie:', + 'Response' : 'Antwoorden', + 'Send' : 'Sturen', + 'Send a Sample Request' : 'Stuur een sample aanvragen', + 'show up to version:' : 'toon tot en met versie:', + 'Size range:' : 'Maatbereik:', + 'Type' : 'Type', + 'url' : 'url' + } +}); diff --git a/backend/public/apidoc/locales/pl.js b/backend/public/apidoc/locales/pl.js new file mode 100644 index 00000000..db645ee1 --- /dev/null +++ b/backend/public/apidoc/locales/pl.js @@ -0,0 +1,25 @@ +define({ + pl: { + 'Allowed values:' : 'Dozwolone wartości:', + 'Compare all with predecessor': 'Porównaj z poprzednimi wersjami', + 'compare changes to:' : 'porównaj zmiany do:', + 'compared to' : 'porównaj do:', + 'Default value:' : 'Wartość domyślna:', + 'Description' : 'Opis', + 'Field' : 'Pole', + 'General' : 'Generalnie', + 'Generated with' : 'Wygenerowano z', + 'Name' : 'Nazwa', + 'No response values.' : 'Brak odpowiedzi.', + 'optional' : 'opcjonalny', + 'Parameter' : 'Parametr', + 'Permission:' : 'Uprawnienia:', + 'Response' : 'Odpowiedź', + 'Send' : 'Wyślij', + 'Send a Sample Request' : 'Wyślij przykładowe żądanie', + 'show up to version:' : 'pokaż do wersji:', + 'Size range:' : 'Zakres rozmiaru:', + 'Type' : 'Typ', + 'url' : 'url' + } +}); diff --git a/backend/public/apidoc/locales/pt_br.js b/backend/public/apidoc/locales/pt_br.js new file mode 100644 index 00000000..2bd78b0d --- /dev/null +++ b/backend/public/apidoc/locales/pt_br.js @@ -0,0 +1,25 @@ +define({ + 'pt_br': { + 'Allowed values:' : 'Valores permitidos:', + 'Compare all with predecessor': 'Compare todos com antecessores', + 'compare changes to:' : 'comparar alterações com:', + 'compared to' : 'comparado com', + 'Default value:' : 'Valor padrão:', + 'Description' : 'Descrição', + 'Field' : 'Campo', + 'General' : 'Geral', + 'Generated with' : 'Gerado com', + 'Name' : 'Nome', + 'No response values.' : 'Sem valores de resposta.', + 'optional' : 'opcional', + 'Parameter' : 'Parâmetro', + 'Permission:' : 'Permissão:', + 'Response' : 'Resposta', + 'Send' : 'Enviar', + 'Send a Sample Request' : 'Enviar um Exemplo de Pedido', + 'show up to version:' : 'aparecer para a versão:', + 'Size range:' : 'Faixa de tamanho:', + 'Type' : 'Tipo', + 'url' : 'url' + } +}); diff --git a/backend/public/apidoc/locales/ro.js b/backend/public/apidoc/locales/ro.js new file mode 100644 index 00000000..8d4e4ed8 --- /dev/null +++ b/backend/public/apidoc/locales/ro.js @@ -0,0 +1,25 @@ +define({ + ro: { + 'Allowed values:' : 'Valori permise:', + 'Compare all with predecessor': 'Compară toate cu versiunea precedentă', + 'compare changes to:' : 'compară cu versiunea:', + 'compared to' : 'comparat cu', + 'Default value:' : 'Valoare implicită:', + 'Description' : 'Descriere', + 'Field' : 'Câmp', + 'General' : 'General', + 'Generated with' : 'Generat cu', + 'Name' : 'Nume', + 'No response values.' : 'Nici o valoare returnată.', + 'optional' : 'opțional', + 'Parameter' : 'Parametru', + 'Permission:' : 'Permisiune:', + 'Response' : 'Răspuns', + 'Send' : 'Trimite', + 'Send a Sample Request' : 'Trimite o cerere de probă', + 'show up to version:' : 'arată până la versiunea:', + 'Size range:' : 'Interval permis:', + 'Type' : 'Tip', + 'url' : 'url' + } +}); diff --git a/backend/public/apidoc/locales/ru.js b/backend/public/apidoc/locales/ru.js new file mode 100644 index 00000000..c5f33821 --- /dev/null +++ b/backend/public/apidoc/locales/ru.js @@ -0,0 +1,25 @@ +define({ + ru: { + 'Allowed values:' : 'Допустимые значения:', + 'Compare all with predecessor': 'Сравнить с предыдущей версией', + 'compare changes to:' : 'сравнить с:', + 'compared to' : 'в сравнении с', + 'Default value:' : 'По умолчанию:', + 'Description' : 'Описание', + 'Field' : 'Название', + 'General' : 'Общая информация', + 'Generated with' : 'Сгенерировано с помощью', + 'Name' : 'Название', + 'No response values.' : 'Нет значений для ответа.', + 'optional' : 'необязательный', + 'Parameter' : 'Параметр', + 'Permission:' : 'Разрешено:', + 'Response' : 'Ответ', + 'Send' : 'Отправить', + 'Send a Sample Request' : 'Отправить тестовый запрос', + 'show up to version:' : 'показать версию:', + 'Size range:' : 'Ограничения:', + 'Type' : 'Тип', + 'url' : 'URL' + } +}); diff --git a/backend/public/apidoc/locales/tr.js b/backend/public/apidoc/locales/tr.js new file mode 100644 index 00000000..5c64e52d --- /dev/null +++ b/backend/public/apidoc/locales/tr.js @@ -0,0 +1,25 @@ +define({ + tr: { + 'Allowed values:' : 'İzin verilen değerler:', + 'Compare all with predecessor': 'Tümünü öncekiler ile karşılaştır', + 'compare changes to:' : 'değişiklikleri karşılaştır:', + 'compared to' : 'karşılaştır', + 'Default value:' : 'Varsayılan değer:', + 'Description' : 'Açıklama', + 'Field' : 'Alan', + 'General' : 'Genel', + 'Generated with' : 'Oluşturan', + 'Name' : 'İsim', + 'No response values.' : 'Dönüş verisi yok.', + 'optional' : 'opsiyonel', + 'Parameter' : 'Parametre', + 'Permission:' : 'İzin:', + 'Response' : 'Dönüş', + 'Send' : 'Gönder', + 'Send a Sample Request' : 'Örnek istek gönder', + 'show up to version:' : 'bu versiyona kadar göster:', + 'Size range:' : 'Boyut aralığı:', + 'Type' : 'Tip', + 'url' : 'url' + } +}); diff --git a/backend/public/apidoc/locales/vi.js b/backend/public/apidoc/locales/vi.js new file mode 100644 index 00000000..7ce77050 --- /dev/null +++ b/backend/public/apidoc/locales/vi.js @@ -0,0 +1,25 @@ +define({ + vi: { + 'Allowed values:' : 'Giá trị chấp nhận:', + 'Compare all with predecessor': 'So sánh với tất cả phiên bản trước', + 'compare changes to:' : 'so sánh sự thay đổi với:', + 'compared to' : 'so sánh với', + 'Default value:' : 'Giá trị mặc định:', + 'Description' : 'Chú thích', + 'Field' : 'Trường dữ liệu', + 'General' : 'Tổng quan', + 'Generated with' : 'Được tạo bởi', + 'Name' : 'Tên', + 'No response values.' : 'Không có kết quả trả về.', + 'optional' : 'Tùy chọn', + 'Parameter' : 'Tham số', + 'Permission:' : 'Quyền hạn:', + 'Response' : 'Kết quả', + 'Send' : 'Gửi', + 'Send a Sample Request' : 'Gửi một yêu cầu mẫu', + 'show up to version:' : 'hiển thị phiên bản:', + 'Size range:' : 'Kích cỡ:', + 'Type' : 'Kiểu', + 'url' : 'liên kết' + } +}); diff --git a/backend/public/apidoc/locales/zh.js b/backend/public/apidoc/locales/zh.js new file mode 100644 index 00000000..66522067 --- /dev/null +++ b/backend/public/apidoc/locales/zh.js @@ -0,0 +1,25 @@ +define({ + zh: { + 'Allowed values​​:' : '允許值:', + 'Compare all with predecessor': '預先比較所有', + 'compare changes to:' : '比較變更:', + 'compared to' : '對比', + 'Default value:' : '默認值:', + 'Description' : '描述', + 'Field' : '字段', + 'General' : '概括', + 'Generated with' : '生成工具', + 'Name' : '名稱', + 'No response values​​.' : '無對應資料.', + 'optional' : '選項', + 'Parameter' : '參數', + 'Permission:' : '允許:', + 'Response' : '回應', + 'Send' : '發送', + 'Send a Sample Request' : '發送試用需求', + 'show up to version:' : '顯示到版本:', + 'Size range:' : '尺寸範圍:', + 'Type' : '類型', + 'url' : '網址' + } +}); diff --git a/backend/public/apidoc/locales/zh_cn.js b/backend/public/apidoc/locales/zh_cn.js new file mode 100644 index 00000000..1938ca18 --- /dev/null +++ b/backend/public/apidoc/locales/zh_cn.js @@ -0,0 +1,25 @@ +define({ + 'zh_cn': { + 'Allowed values:' : '允许值:', + 'Compare all with predecessor': '与所有较早的比较', + 'compare changes to:' : '将当前版本与指定版本比较:', + 'compared to' : '相比于', + 'Default value:' : '默认值:', + 'Description' : '描述', + 'Field' : '字段', + 'General' : '概要', + 'Generated with' : '基于', + 'Name' : '名称', + 'No response values.' : '无返回值.', + 'optional' : '可选', + 'Parameter' : '参数', + 'Permission:' : '权限:', + 'Response' : '返回', + 'Send' : '发送', + 'Send a Sample Request' : '发送示例请求', + 'show up to version:' : '显示到指定版本:', + 'Size range:' : '取值范围:', + 'Type' : '类型', + 'url' : '网址' + } +}); diff --git a/backend/public/apidoc/main.js b/backend/public/apidoc/main.js new file mode 100644 index 00000000..9d31fa5f --- /dev/null +++ b/backend/public/apidoc/main.js @@ -0,0 +1,827 @@ +require.config({ + paths: { + bootstrap: './vendor/bootstrap.min', + diffMatchPatch: './vendor/diff_match_patch.min', + handlebars: './vendor/handlebars.min', + handlebarsExtended: './utils/handlebars_helper', + jquery: './vendor/jquery.min', + locales: './locales/locale', + lodash: './vendor/lodash.custom.min', + pathToRegexp: './vendor/path-to-regexp/index', + prettify: './vendor/prettify/prettify', + semver: './vendor/semver.min', + utilsSampleRequest: './utils/send_sample_request', + webfontloader: './vendor/webfontloader', + list: './vendor/list.min' + }, + shim: { + bootstrap: { + deps: ['jquery'] + }, + diffMatchPatch: { + exports: 'diff_match_patch' + }, + handlebars: { + exports: 'Handlebars' + }, + handlebarsExtended: { + deps: ['jquery', 'handlebars'], + exports: 'Handlebars' + }, + prettify: { + exports: 'prettyPrint' + } + }, + urlArgs: 'v=' + (new Date()).getTime(), + waitSeconds: 15 +}); + +require([ + 'jquery', + 'lodash', + 'locales', + 'handlebarsExtended', + './api_project.js', + './api_data.js', + 'prettify', + 'utilsSampleRequest', + 'semver', + 'webfontloader', + 'bootstrap', + 'pathToRegexp', + 'list' +], function($, _, locale, Handlebars, apiProject, apiData, prettyPrint, sampleRequest, semver, WebFont) { + + // load google web fonts + loadGoogleFontCss(); + + var api = apiData.api; + + // + // Templates + // + var templateHeader = Handlebars.compile( $('#template-header').html() ); + var templateFooter = Handlebars.compile( $('#template-footer').html() ); + var templateArticle = Handlebars.compile( $('#template-article').html() ); + var templateCompareArticle = Handlebars.compile( $('#template-compare-article').html() ); + var templateGenerator = Handlebars.compile( $('#template-generator').html() ); + var templateProject = Handlebars.compile( $('#template-project').html() ); + var templateSections = Handlebars.compile( $('#template-sections').html() ); + var templateSidenav = Handlebars.compile( $('#template-sidenav').html() ); + + // + // apiProject defaults + // + if ( ! apiProject.template) + apiProject.template = {}; + + if (apiProject.template.withCompare == null) + apiProject.template.withCompare = true; + + if (apiProject.template.withGenerator == null) + apiProject.template.withGenerator = true; + + if (apiProject.template.forceLanguage) + locale.setLanguage(apiProject.template.forceLanguage); + + // Setup jQuery Ajax + $.ajaxSetup(apiProject.template.jQueryAjaxSetup); + + // + // Data transform + // + // grouped by group + var apiByGroup = _.groupBy(api, function(entry) { + return entry.group; + }); + + // grouped by group and name + var apiByGroupAndName = {}; + $.each(apiByGroup, function(index, entries) { + apiByGroupAndName[index] = _.groupBy(entries, function(entry) { + return entry.name; + }); + }); + + // + // sort api within a group by title ASC and custom order + // + var newList = []; + var umlauts = { 'ä': 'ae', 'ü': 'ue', 'ö': 'oe', 'ß': 'ss' }; // TODO: remove in version 1.0 + $.each (apiByGroupAndName, function(index, groupEntries) { + // get titles from the first entry of group[].name[] (name has versioning) + var titles = []; + $.each (groupEntries, function(titleName, entries) { + var title = entries[0].title; + if(title !== undefined) { + title.toLowerCase().replace(/[äöüß]/g, function($0) { return umlauts[$0]; }); + titles.push(title + '#~#' + titleName); // '#~#' keep reference to titleName after sorting + } + }); + // sort by name ASC + titles.sort(); + + // custom order + if (apiProject.order) + titles = sortByOrder(titles, apiProject.order, '#~#'); + + // add single elements to the new list + titles.forEach(function(name) { + var values = name.split('#~#'); + var key = values[1]; + groupEntries[key].forEach(function(entry) { + newList.push(entry); + }); + }); + }); + // api overwrite with ordered list + api = newList; + + // + // Group- and Versionlists + // + var apiGroups = {}; + var apiGroupTitles = {}; + var apiVersions = {}; + apiVersions[apiProject.version] = 1; + + $.each(api, function(index, entry) { + apiGroups[entry.group] = 1; + apiGroupTitles[entry.group] = entry.groupTitle || entry.group; + apiVersions[entry.version] = 1; + }); + + // sort groups + apiGroups = Object.keys(apiGroups); + apiGroups.sort(); + + // custom order + if (apiProject.order) + apiGroups = sortByOrder(apiGroups, apiProject.order); + + // sort versions DESC + apiVersions = Object.keys(apiVersions); + apiVersions.sort(semver.compare); + apiVersions.reverse(); + + // + // create Navigationlist + // + var nav = []; + apiGroups.forEach(function(group) { + // Mainmenu entry + nav.push({ + group: group, + isHeader: true, + title: apiGroupTitles[group] + }); + + // Submenu + var oldName = ''; + api.forEach(function(entry) { + if (entry.group === group) { + if (oldName !== entry.name) { + nav.push({ + title: entry.title, + group: group, + name: entry.name, + type: entry.type, + version: entry.version + }); + } else { + nav.push({ + title: entry.title, + group: group, + hidden: true, + name: entry.name, + type: entry.type, + version: entry.version + }); + } + oldName = entry.name; + } + }); + }); + + /** + * Add navigation items by analyzing the HTML content and searching for h1 and h2 tags + * @param nav Object the navigation array + * @param content string the compiled HTML content + * @param index where to insert items + * @return boolean true if any good-looking (i.e. with a group identifier)

tag was found + */ + function add_nav(nav, content, index) { + var found_level1 = false; + if ( ! content) { + return found_level1; + } + var topics = content.match(/(.+?)<\/h(1|2)>/gi); + if ( topics ) { + topics.forEach(function(entry) { + var level = entry.substring(2,3); + var title = entry.replace(/<.+?>/g, ''); // Remove all HTML tags for the title + var entry_tags = entry.match(/id="api-([^\-]+)(?:-(.+))?"/); // Find the group and name in the id property + var group = (entry_tags ? entry_tags[1] : null); + var name = (entry_tags ? entry_tags[2] : null); + if (level==1 && title && group) { + nav.splice(index, 0, { + group: group, + isHeader: true, + title: title, + isFixed: true + }); + index++; + found_level1 = true; + } + if (level==2 && title && group && name) { + nav.splice(index, 0, { + group: group, + name: name, + isHeader: false, + title: title, + isFixed: false, + version: '1.0' + }); + index++; + } + }); + } + return found_level1; + } + + // Mainmenu Header entry + if (apiProject.header) { + var found_level1 = add_nav(nav, apiProject.header.content, 0); // Add level 1 and 2 titles + if (!found_level1) { // If no Level 1 tags were found, make a title + nav.unshift({ + group: '_', + isHeader: true, + title: (apiProject.header.title == null) ? locale.__('General') : apiProject.header.title, + isFixed: true + }); + } + } + + // Mainmenu Footer entry + if (apiProject.footer) { + var last_nav_index = nav.length; + var found_level1 = add_nav(nav, apiProject.footer.content, nav.length); // Add level 1 and 2 titles + if (!found_level1 && apiProject.footer.title != null) { // If no Level 1 tags were found, make a title + nav.splice(last_nav_index, 0, { + group: '_footer', + isHeader: true, + title: apiProject.footer.title, + isFixed: true + }); + } + } + + // render pagetitle + var title = apiProject.title ? apiProject.title : 'apiDoc: ' + apiProject.name + ' - ' + apiProject.version; + $(document).attr('title', title); + + // remove loader + $('#loader').remove(); + + // render sidenav + var fields = { + nav: nav + }; + $('#sidenav').append( templateSidenav(fields) ); + + // render Generator + $('#generator').append( templateGenerator(apiProject) ); + + // render Project + _.extend(apiProject, { versions: apiVersions}); + $('#project').append( templateProject(apiProject) ); + + // render apiDoc, header/footer documentation + if (apiProject.header) + $('#header').append( templateHeader(apiProject.header) ); + + if (apiProject.footer) + $('#footer').append( templateFooter(apiProject.footer) ); + + // + // Render Sections and Articles + // + var articleVersions = {}; + var content = ''; + apiGroups.forEach(function(groupEntry) { + var articles = []; + var oldName = ''; + var fields = {}; + var title = groupEntry; + var description = ''; + articleVersions[groupEntry] = {}; + + // render all articles of a group + api.forEach(function(entry) { + if(groupEntry === entry.group) { + if (oldName !== entry.name) { + // determine versions + api.forEach(function(versionEntry) { + if (groupEntry === versionEntry.group && entry.name === versionEntry.name) { + if ( ! articleVersions[entry.group].hasOwnProperty(entry.name) ) { + articleVersions[entry.group][entry.name] = []; + } + articleVersions[entry.group][entry.name].push(versionEntry.version); + } + }); + fields = { + article: entry, + versions: articleVersions[entry.group][entry.name] + }; + } else { + fields = { + article: entry, + hidden: true, + versions: articleVersions[entry.group][entry.name] + }; + } + + // add prefix URL for endpoint + if (apiProject.url) + fields.article.url = apiProject.url + fields.article.url; + + addArticleSettings(fields, entry); + + if (entry.groupTitle) + title = entry.groupTitle; + + // TODO: make groupDescription compareable with older versions (not important for the moment) + if (entry.groupDescription) + description = entry.groupDescription; + + articles.push({ + article: templateArticle(fields), + group: entry.group, + name: entry.name + }); + oldName = entry.name; + } + }); + + // render Section with Articles + var fields = { + group: groupEntry, + title: title, + description: description, + articles: articles + }; + content += templateSections(fields); + }); + $('#sections').append( content ); + + // Bootstrap Scrollspy + $(this).scrollspy({ target: '#scrollingNav', offset: 18 }); + + // Content-Scroll on Navigation click. + $('.sidenav').find('a').on('click', function(e) { + e.preventDefault(); + var id = $(this).attr('href'); + if ($(id).length > 0) + $('html,body').animate({ scrollTop: parseInt($(id).offset().top) }, 400); + window.location.hash = $(this).attr('href'); + }); + + // Quickjump on Pageload to hash position. + if(window.location.hash) { + var id = window.location.hash; + if ($(id).length > 0) + $('html,body').animate({ scrollTop: parseInt($(id).offset().top) }, 0); + } + + /** + * Check if Parameter (sub) List has a type Field. + * Example: @apiSuccess varname1 No type. + * @apiSuccess {String} varname2 With type. + * + * @param {Object} fields + */ + function _hasTypeInFields(fields) { + var result = false; + $.each(fields, function(name) { + result = result || _.some(fields[name], function(item) { return item.type; }); + }); + return result; + } + + /** + * On Template changes, recall plugins. + */ + function initDynamic() { + // Bootstrap popover + $('button[data-toggle="popover"]').popover().click(function(e) { + e.preventDefault(); + }); + + var version = $('#version strong').html(); + $('#sidenav li').removeClass('is-new'); + if (apiProject.template.withCompare) { + $('#sidenav li[data-version=\'' + version + '\']').each(function(){ + var group = $(this).data('group'); + var name = $(this).data('name'); + var length = $('#sidenav li[data-group=\'' + group + '\'][data-name=\'' + name + '\']').length; + var index = $('#sidenav li[data-group=\'' + group + '\'][data-name=\'' + name + '\']').index($(this)); + if (length === 1 || index === (length - 1)) + $(this).addClass('is-new'); + }); + } + + // tabs + $('.nav-tabs-examples a').click(function (e) { + e.preventDefault(); + $(this).tab('show'); + }); + $('.nav-tabs-examples').find('a:first').tab('show'); + + // sample request switch + $('.sample-request-switch').click(function (e) { + var name = '.' + $(this).attr('name') + '-fields'; + $(name).addClass('hide'); + $(this).parent().next(name).removeClass('hide'); + }); + + // call scrollspy refresh method + $(window).scrollspy('refresh'); + + // init modules + sampleRequest.initDynamic(); + } + initDynamic(); + + // Pre- / Code-Format + prettyPrint(); + + // + // HTML-Template specific jQuery-Functions + // + // Change Main Version + $('#versions li.version a').on('click', function(e) { + e.preventDefault(); + + var selectedVersion = $(this).html(); + $('#version strong').html(selectedVersion); + + // hide all + $('article').addClass('hide'); + $('#sidenav li:not(.nav-fixed)').addClass('hide'); + + // show 1st equal or lower Version of each entry + $('article[data-version]').each(function(index) { + var group = $(this).data('group'); + var name = $(this).data('name'); + var version = $(this).data('version'); + + if (semver.lte(version, selectedVersion)) { + if ($('article[data-group=\'' + group + '\'][data-name=\'' + name + '\']:visible').length === 0) { + // enable Article + $('article[data-group=\'' + group + '\'][data-name=\'' + name + '\'][data-version=\'' + version + '\']').removeClass('hide'); + // enable Navigation + $('#sidenav li[data-group=\'' + group + '\'][data-name=\'' + name + '\'][data-version=\'' + version + '\']').removeClass('hide'); + $('#sidenav li.nav-header[data-group=\'' + group + '\']').removeClass('hide'); + } + } + }); + + // show 1st equal or lower Version of each entry + $('article[data-version]').each(function(index) { + var group = $(this).data('group'); + $('section#api-' + group).removeClass('hide'); + if ($('section#api-' + group + ' article:visible').length === 0) { + $('section#api-' + group).addClass('hide'); + } else { + $('section#api-' + group).removeClass('hide'); + } + }); + + initDynamic(); + return; + }); + + // compare all article with their predecessor + $('#compareAllWithPredecessor').on('click', changeAllVersionCompareTo); + + // change version of an article + $('article .versions li.version a').on('click', changeVersionCompareTo); + + // compare url-parameter + $.urlParam = function(name) { + var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href); + return (results && results[1]) ? results[1] : null; + }; + + if ($.urlParam('compare')) { + // URL Paramter ?compare=1 is set + $('#compareAllWithPredecessor').trigger('click'); + + if (window.location.hash) { + var id = window.location.hash; + $('html,body').animate({ scrollTop: parseInt($(id).offset().top) - 18 }, 0); + } + } + + /** + * Initialize search + */ + var options = { + valueNames: [ 'nav-list-item' ] + }; + var endpointsList = new List('scrollingNav', options); + + /** + * Set initial focus to search input + */ + $('#scrollingNav .sidenav-search input.search').focus(); + + /** + * Detect ESC key to reset search + */ + $(document).keyup(function(e) { + if (e.keyCode === 27) $('span.search-reset').click(); + }); + + /** + * Search reset + */ + $('span.search-reset').on('click', function() { + $('#scrollingNav .sidenav-search input.search') + .val("") + .focus() + ; + endpointsList.search(); + }); + + /** + * Change version of an article to compare it to an other version. + */ + function changeVersionCompareTo(e) { + e.preventDefault(); + + var $root = $(this).parents('article'); + var selectedVersion = $(this).html(); + var $button = $root.find('.version'); + var currentVersion = $button.find('strong').html(); + $button.find('strong').html(selectedVersion); + + var group = $root.data('group'); + var name = $root.data('name'); + var version = $root.data('version'); + + var compareVersion = $root.data('compare-version'); + + if (compareVersion === selectedVersion) + return; + + if ( ! compareVersion && version == selectedVersion) + return; + + if (compareVersion && articleVersions[group][name][0] === selectedVersion || version === selectedVersion) { + // the version of the entry is set to the highest version (reset) + resetArticle(group, name, version); + } else { + var $compareToArticle = $('article[data-group=\'' + group + '\'][data-name=\'' + name + '\'][data-version=\'' + selectedVersion + '\']'); + + var sourceEntry = {}; + var compareEntry = {}; + $.each(apiByGroupAndName[group][name], function(index, entry) { + if (entry.version === version) + sourceEntry = entry; + if (entry.version === selectedVersion) + compareEntry = entry; + }); + + var fields = { + article: sourceEntry, + compare: compareEntry, + versions: articleVersions[group][name] + }; + + // add unique id + // TODO: replace all group-name-version in template with id. + fields.article.id = fields.article.group + '-' + fields.article.name + '-' + fields.article.version; + fields.article.id = fields.article.id.replace(/\./g, '_'); + + fields.compare.id = fields.compare.group + '-' + fields.compare.name + '-' + fields.compare.version; + fields.compare.id = fields.compare.id.replace(/\./g, '_'); + + var entry = sourceEntry; + if (entry.parameter && entry.parameter.fields) + fields._hasTypeInParameterFields = _hasTypeInFields(entry.parameter.fields); + + if (entry.error && entry.error.fields) + fields._hasTypeInErrorFields = _hasTypeInFields(entry.error.fields); + + if (entry.success && entry.success.fields) + fields._hasTypeInSuccessFields = _hasTypeInFields(entry.success.fields); + + if (entry.info && entry.info.fields) + fields._hasTypeInInfoFields = _hasTypeInFields(entry.info.fields); + + var entry = compareEntry; + if (fields._hasTypeInParameterFields !== true && entry.parameter && entry.parameter.fields) + fields._hasTypeInParameterFields = _hasTypeInFields(entry.parameter.fields); + + if (fields._hasTypeInErrorFields !== true && entry.error && entry.error.fields) + fields._hasTypeInErrorFields = _hasTypeInFields(entry.error.fields); + + if (fields._hasTypeInSuccessFields !== true && entry.success && entry.success.fields) + fields._hasTypeInSuccessFields = _hasTypeInFields(entry.success.fields); + + if (fields._hasTypeInInfoFields !== true && entry.info && entry.info.fields) + fields._hasTypeInInfoFields = _hasTypeInFields(entry.info.fields); + + var content = templateCompareArticle(fields); + $root.after(content); + var $content = $root.next(); + + // Event on.click re-assign + $content.find('.versions li.version a').on('click', changeVersionCompareTo); + + // select navigation + $('#sidenav li[data-group=\'' + group + '\'][data-name=\'' + name + '\'][data-version=\'' + currentVersion + '\']').addClass('has-modifications'); + + $root.remove(); + // TODO: on change main version or select the highest version re-render + } + + initDynamic(); + } + + /** + * Compare all currently selected Versions with their predecessor. + */ + function changeAllVersionCompareTo(e) { + e.preventDefault(); + $('article:visible .versions').each(function(){ + var $root = $(this).parents('article'); + var currentVersion = $root.data('version'); + var $foundElement = null; + $(this).find('li.version a').each(function() { + var selectVersion = $(this).html(); + if (selectVersion < currentVersion && ! $foundElement) + $foundElement = $(this); + }); + + if($foundElement) + $foundElement.trigger('click'); + }); + initDynamic(); + } + + /** + * Sort the fields. + */ + function sortFields(fields_object) { + $.each(fields_object, function (key, fields) { + + var reversed = fields.slice().reverse() + + var max_dot_count = Math.max.apply(null, reversed.map(function (item) { + return item.field.split(".").length - 1; + })) + + for (var dot_count = 1; dot_count <= max_dot_count; dot_count++) { + reversed.forEach(function (item, index) { + var parts = item.field.split("."); + if (parts.length - 1 == dot_count) { + var fields_names = fields.map(function (item) { return item.field; }); + if (parts.slice(1).length >= 1) { + var prefix = parts.slice(0, parts.length - 1).join("."); + var prefix_index = fields_names.indexOf(prefix); + if (prefix_index > -1) { + fields.splice(fields_names.indexOf(item.field), 1); + fields.splice(prefix_index + 1, 0, item); + } + } + } + }); + } + }); + } + + /** + * Add article settings. + */ + function addArticleSettings(fields, entry) { + // add unique id + // TODO: replace all group-name-version in template with id. + fields.id = fields.article.group + '-' + fields.article.name + '-' + fields.article.version; + fields.id = fields.id.replace(/\./g, '_'); + + if (entry.header && entry.header.fields) { + sortFields(entry.header.fields); + fields._hasTypeInHeaderFields = _hasTypeInFields(entry.header.fields); + } + + if (entry.parameter && entry.parameter.fields) { + sortFields(entry.parameter.fields); + fields._hasTypeInParameterFields = _hasTypeInFields(entry.parameter.fields); + } + + if (entry.error && entry.error.fields) { + sortFields(entry.error.fields); + fields._hasTypeInErrorFields = _hasTypeInFields(entry.error.fields); + } + + if (entry.success && entry.success.fields) { + sortFields(entry.success.fields); + fields._hasTypeInSuccessFields = _hasTypeInFields(entry.success.fields); + } + + if (entry.info && entry.info.fields) { + sortFields(entry.info.fields); + fields._hasTypeInInfoFields = _hasTypeInFields(entry.info.fields); + } + + // add template settings + fields.template = apiProject.template; + } + + /** + * Render Article. + */ + function renderArticle(group, name, version) { + var entry = {}; + $.each(apiByGroupAndName[group][name], function(index, currentEntry) { + if (currentEntry.version === version) + entry = currentEntry; + }); + var fields = { + article: entry, + versions: articleVersions[group][name] + }; + + addArticleSettings(fields, entry); + + return templateArticle(fields); + } + + /** + * Render original Article and remove the current visible Article. + */ + function resetArticle(group, name, version) { + var $root = $('article[data-group=\'' + group + '\'][data-name=\'' + name + '\']:visible'); + var content = renderArticle(group, name, version); + + $root.after(content); + var $content = $root.next(); + + // Event on.click muss neu zugewiesen werden (sollte eigentlich mit on automatisch funktionieren... sollte) + $content.find('.versions li.version a').on('click', changeVersionCompareTo); + + $('#sidenav li[data-group=\'' + group + '\'][data-name=\'' + name + '\'][data-version=\'' + version + '\']').removeClass('has-modifications'); + + $root.remove(); + return; + } + + /** + * Load google fonts. + */ + function loadGoogleFontCss() { + WebFont.load({ + active: function() { + // Update scrollspy + $(window).scrollspy('refresh') + }, + google: { + families: ['Source Code Pro', 'Source Sans Pro:n4,n6,n7'] + } + }); + } + + /** + * Return ordered entries by custom order and append not defined entries to the end. + * @param {String[]} elements + * @param {String[]} order + * @param {String} splitBy + * @return {String[]} Custom ordered list. + */ + function sortByOrder(elements, order, splitBy) { + var results = []; + order.forEach (function(name) { + if (splitBy) + elements.forEach (function(element) { + var parts = element.split(splitBy); + var key = parts[1]; // reference keep for sorting + if (key == name) + results.push(element); + }); + else + elements.forEach (function(key) { + if (key == name) + results.push(name); + }); + }); + // Append all other entries that ar not defined in order + elements.forEach(function(element) { + if (results.indexOf(element) === -1) + results.push(element); + }); + return results; + } + +}); diff --git a/backend/public/apidoc/utils/handlebars_helper.js b/backend/public/apidoc/utils/handlebars_helper.js new file mode 100644 index 00000000..a5d5c4fd --- /dev/null +++ b/backend/public/apidoc/utils/handlebars_helper.js @@ -0,0 +1,357 @@ +define([ + 'locales', + 'handlebars', + 'diffMatchPatch' +], function(locale, Handlebars, DiffMatchPatch) { + + /** + * Return a text as markdown. + * Currently only a little helper to replace apidoc-inline Links (#Group:Name). + * Should be replaced with a full markdown lib. + * @param string text + */ + Handlebars.registerHelper('markdown', function(text) { + if ( ! text ) { + return text; + } + text = text.replace(/((\[(.*?)\])?\(#)((.+?):(.+?))(\))/mg, function(match, p1, p2, p3, p4, p5, p6) { + var link = p3 || p5 + '/' + p6; + return '' + link + ''; + }); + return text; + }); + + /** + * start/stop timer for simple performance check. + */ + var timer; + Handlebars.registerHelper('startTimer', function(text) { + timer = new Date(); + return ''; + }); + + Handlebars.registerHelper('stopTimer', function(text) { + console.log(new Date() - timer); + return ''; + }); + + /** + * Return localized Text. + * @param string text + */ + Handlebars.registerHelper('__', function(text) { + return locale.__(text); + }); + + /** + * Console log. + * @param mixed obj + */ + Handlebars.registerHelper('cl', function(obj) { + console.log(obj); + return ''; + }); + + /** + * Replace underscore with space. + * @param string text + */ + Handlebars.registerHelper('underscoreToSpace', function(text) { + return text.replace(/(_+)/g, ' '); + }); + + /** + * + */ + Handlebars.registerHelper('assign', function(name) { + if(arguments.length > 0) { + var type = typeof(arguments[1]); + var arg = null; + if(type === 'string' || type === 'number' || type === 'boolean') arg = arguments[1]; + Handlebars.registerHelper(name, function() { return arg; }); + } + return ''; + }); + + /** + * + */ + Handlebars.registerHelper('nl2br', function(text) { + return _handlebarsNewlineToBreak(text); + }); + + /** + * + */ + Handlebars.registerHelper('if_eq', function(context, options) { + var compare = context; + // Get length if context is an object + if (context instanceof Object && ! (options.hash.compare instanceof Object)) + compare = Object.keys(context).length; + + if (compare === options.hash.compare) + return options.fn(this); + + return options.inverse(this); + }); + + /** + * + */ + Handlebars.registerHelper('if_gt', function(context, options) { + var compare = context; + // Get length if context is an object + if (context instanceof Object && ! (options.hash.compare instanceof Object)) + compare = Object.keys(context).length; + + if(compare > options.hash.compare) + return options.fn(this); + + return options.inverse(this); + }); + + /** + * + */ + var templateCache = {}; + Handlebars.registerHelper('subTemplate', function(name, sourceContext) { + if ( ! templateCache[name]) + templateCache[name] = Handlebars.compile($('#template-' + name).html()); + + var template = templateCache[name]; + var templateContext = $.extend({}, this, sourceContext.hash); + return new Handlebars.SafeString( template(templateContext) ); + }); + + /** + * + */ + Handlebars.registerHelper('toLowerCase', function(value) { + return (value && typeof value === 'string') ? value.toLowerCase() : ''; + }); + + /** + * + */ + Handlebars.registerHelper('splitFill', function(value, splitChar, fillChar) { + var splits = value.split(splitChar); + return new Array(splits.length).join(fillChar) + splits[splits.length - 1]; + }); + + /** + * Convert Newline to HTML-Break (nl2br). + * + * @param {String} text + * @returns {String} + */ + function _handlebarsNewlineToBreak(text) { + return ('' + text).replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + '
' + '$2'); + } + + /** + * + */ + Handlebars.registerHelper('each_compare_list_field', function(source, compare, options) { + var fieldName = options.hash.field; + var newSource = []; + if (source) { + source.forEach(function(entry) { + var values = entry; + values['key'] = entry[fieldName]; + newSource.push(values); + }); + } + + var newCompare = []; + if (compare) { + compare.forEach(function(entry) { + var values = entry; + values['key'] = entry[fieldName]; + newCompare.push(values); + }); + } + return _handlebarsEachCompared('key', newSource, newCompare, options); + }); + + /** + * + */ + Handlebars.registerHelper('each_compare_keys', function(source, compare, options) { + var newSource = []; + if (source) { + var sourceFields = Object.keys(source); + sourceFields.forEach(function(name) { + var values = {}; + values['value'] = source[name]; + values['key'] = name; + newSource.push(values); + }); + } + + var newCompare = []; + if (compare) { + var compareFields = Object.keys(compare); + compareFields.forEach(function(name) { + var values = {}; + values['value'] = compare[name]; + values['key'] = name; + newCompare.push(values); + }); + } + return _handlebarsEachCompared('key', newSource, newCompare, options); + }); + + /** + * + */ + Handlebars.registerHelper('each_compare_field', function(source, compare, options) { + return _handlebarsEachCompared('field', source, compare, options); + }); + + /** + * + */ + Handlebars.registerHelper('each_compare_title', function(source, compare, options) { + return _handlebarsEachCompared('title', source, compare, options); + }); + + /** + * + */ + Handlebars.registerHelper('reformat', function(source, type){ + if (type == 'json') + try { + return JSON.stringify(JSON.parse(source.trim()),null, " "); + } catch(e) { + + } + return source + }); + + /** + * + */ + Handlebars.registerHelper('showDiff', function(source, compare, options) { + var ds = ''; + if(source === compare) { + ds = source; + } else { + if( ! source) + return compare; + + if( ! compare) + return source; + + var d = diffMatchPatch.diff_main(compare, source); + diffMatchPatch.diff_cleanupSemantic(d); + ds = diffMatchPatch.diff_prettyHtml(d); + ds = ds.replace(/¶/gm, ''); + } + if(options === 'nl2br') + ds = _handlebarsNewlineToBreak(ds); + + return ds; + }); + + /** + * + */ + function _handlebarsEachCompared(fieldname, source, compare, options) + { + var dataList = []; + var index = 0; + if(source) { + source.forEach(function(sourceEntry) { + var found = false; + if (compare) { + compare.forEach(function(compareEntry) { + if(sourceEntry[fieldname] === compareEntry[fieldname]) { + var data = { + typeSame: true, + source: sourceEntry, + compare: compareEntry, + index: index + }; + dataList.push(data); + found = true; + index++; + } + }); + } + if ( ! found) { + var data = { + typeIns: true, + source: sourceEntry, + index: index + }; + dataList.push(data); + index++; + } + }); + } + + if (compare) { + compare.forEach(function(compareEntry) { + var found = false; + if (source) { + source.forEach(function(sourceEntry) { + if(sourceEntry[fieldname] === compareEntry[fieldname]) + found = true; + }); + } + if ( ! found) { + var data = { + typeDel: true, + compare: compareEntry, + index: index + }; + dataList.push(data); + index++; + } + }); + } + + var ret = ''; + var length = dataList.length; + for (var index in dataList) { + if(index == (length - 1)) + dataList[index]['_last'] = true; + ret = ret + options.fn(dataList[index]); + } + return ret; + } + + var diffMatchPatch = new DiffMatchPatch(); + + /** + * Overwrite Colors + */ + DiffMatchPatch.prototype.diff_prettyHtml = function(diffs) { + var html = []; + var pattern_amp = /&/g; + var pattern_lt = //g; + var pattern_para = /\n/g; + for (var x = 0; x < diffs.length; x++) { + var op = diffs[x][0]; // Operation (insert, delete, equal) + var data = diffs[x][1]; // Text of change. + var text = data.replace(pattern_amp, '&').replace(pattern_lt, '<') + .replace(pattern_gt, '>').replace(pattern_para, '¶
'); + switch (op) { + case DIFF_INSERT: + html[x] = '' + text + ''; + break; + case DIFF_DELETE: + html[x] = '' + text + ''; + break; + case DIFF_EQUAL: + html[x] = '' + text + ''; + break; + } + } + return html.join(''); + }; + + // Exports + return Handlebars; +}); diff --git a/backend/public/apidoc/utils/send_sample_request.js b/backend/public/apidoc/utils/send_sample_request.js new file mode 100644 index 00000000..b549bf68 --- /dev/null +++ b/backend/public/apidoc/utils/send_sample_request.js @@ -0,0 +1,184 @@ +define([ + 'jquery', + 'lodash' +], function($, _) { + + var initDynamic = function() { + // Button send + $(".sample-request-send").off("click"); + $(".sample-request-send").on("click", function(e) { + e.preventDefault(); + var $root = $(this).parents("article"); + var group = $root.data("group"); + var name = $root.data("name"); + var version = $root.data("version"); + sendSampleRequest(group, name, version, $(this).data("sample-request-type")); + }); + + // Button clear + $(".sample-request-clear").off("click"); + $(".sample-request-clear").on("click", function(e) { + e.preventDefault(); + var $root = $(this).parents("article"); + var group = $root.data("group"); + var name = $root.data("name"); + var version = $root.data("version"); + clearSampleRequest(group, name, version); + }); + }; // initDynamic + + function sendSampleRequest(group, name, version, type) + { + var $root = $('article[data-group="' + group + '"][data-name="' + name + '"][data-version="' + version + '"]'); + + // Optional header + var header = {}; + $root.find(".sample-request-header:checked").each(function(i, element) { + var group = $(element).data("sample-request-header-group-id"); + $root.find("[data-sample-request-header-group=\"" + group + "\"]").each(function(i, element) { + var key = $(element).data("sample-request-header-name"); + var value = element.value; + if ( ! element.optional && element.defaultValue !== '') { + value = element.defaultValue; + } + header[key] = value; + }); + }); + + // create JSON dictionary of parameters + var param = {}; + var paramType = {}; + $root.find(".sample-request-param:checked").each(function(i, element) { + var group = $(element).data("sample-request-param-group-id"); + $root.find("[data-sample-request-param-group=\"" + group + "\"]").not(function(){ + return $(this).val() == "" && $(this).is("[data-sample-request-param-optional='true']"); + }).each(function(i, element) { + var key = $(element).data("sample-request-param-name"); + var value = element.value; + if ( ! element.optional && element.defaultValue !== '') { + value = element.defaultValue; + } + param[key] = value; + paramType[key] = $(element).next().text(); + }); + }); + + // grab user-inputted URL + var url = $root.find(".sample-request-url").val(); + + // Insert url parameter + var pattern = pathToRegexp(url, null); + var matches = pattern.exec(url); + for (var i = 1; i < matches.length; i++) { + var key = matches[i].substr(1); + if (param[key] !== undefined) { + url = url.replace(matches[i], encodeURIComponent(param[key])); + + // remove URL parameters from list + delete param[key]; + } + } // for + + $root.find(".sample-request-response").fadeTo(250, 1); + $root.find(".sample-request-response-json").html("Loading..."); + refreshScrollSpy(); + + _.each( param, function( val, key ) { + var t = paramType[ key ].toLowerCase(); + if ( t === 'object' || t === 'array' ) { + try { + param[ key ] = JSON.parse( val ); + } catch (e) { + } + } + }); + + // send AJAX request, catch success or error callback + var ajaxRequest = { + url : url, + headers : header, + data : param, + type : type.toUpperCase(), + success : displaySuccess, + error : displayError + }; + + $.ajax(ajaxRequest); + + + function displaySuccess(data, status, jqXHR) { + var jsonResponse; + try { + jsonResponse = JSON.parse(jqXHR.responseText); + jsonResponse = JSON.stringify(jsonResponse, null, 4); + } catch (e) { + jsonResponse = data; + } + $root.find(".sample-request-response-json").html(jsonResponse); + refreshScrollSpy(); + }; + + function displayError(jqXHR, textStatus, error) { + var message = "Error " + jqXHR.status + ": " + error; + var jsonResponse; + try { + jsonResponse = JSON.parse(jqXHR.responseText); + jsonResponse = JSON.stringify(jsonResponse, null, 4); + } catch (e) { + jsonResponse = escape(jqXHR.responseText); + } + + if (jsonResponse) + message += "
" + jsonResponse; + + // flicker on previous error to make clear that there is a new response + if($root.find(".sample-request-response").is(":visible")) + $root.find(".sample-request-response").fadeTo(1, 0.1); + + $root.find(".sample-request-response").fadeTo(250, 1); + $root.find(".sample-request-response-json").html(message); + refreshScrollSpy(); + }; + } + + function clearSampleRequest(group, name, version) + { + var $root = $('article[data-group="' + group + '"][data-name="' + name + '"][data-version="' + version + '"]'); + + // hide sample response + $root.find(".sample-request-response-json").html(""); + $root.find(".sample-request-response").hide(); + + // reset value of parameters + $root.find(".sample-request-param").each(function(i, element) { + element.value = ""; + }); + + // restore default URL + var $urlElement = $root.find(".sample-request-url"); + $urlElement.val($urlElement.prop("defaultValue")); + + refreshScrollSpy(); + } + + function refreshScrollSpy() + { + $('[data-spy="scroll"]').each(function () { + $(this).scrollspy("refresh"); + }); + } + + function escapeHtml(str) { + var div = document.createElement("div"); + div.appendChild(document.createTextNode(str)); + return div.innerHTML; + } + + /** + * Exports. + */ + return { + initDynamic: initDynamic + }; + +}); diff --git a/backend/public/apidoc/vendor/bootstrap.min.css b/backend/public/apidoc/vendor/bootstrap.min.css new file mode 100644 index 00000000..ed3905e0 --- /dev/null +++ b/backend/public/apidoc/vendor/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/backend/public/apidoc/vendor/bootstrap.min.js b/backend/public/apidoc/vendor/bootstrap.min.js new file mode 100644 index 00000000..9bcd2fcc --- /dev/null +++ b/backend/public/apidoc/vendor/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/backend/public/apidoc/vendor/diff_match_patch.min.js b/backend/public/apidoc/vendor/diff_match_patch.min.js new file mode 100644 index 00000000..c41b5132 --- /dev/null +++ b/backend/public/apidoc/vendor/diff_match_patch.min.js @@ -0,0 +1,49 @@ +(function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=0.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=0.5;this.Patch_Margin=4;this.Match_MaxBits=32} +diff_match_patch.prototype.diff_main=function(a,b,c,d){"undefined"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error("Null input. (diff_main)");if(a==b)return a?[[0,a]]:[];"undefined"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);var f=this.diff_commonSuffix(a,b),g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a, +b,e,d);c&&a.unshift([0,c]);g&&a.push([0,g]);this.diff_cleanupMerge(a);return a}; +diff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[1,b]];if(!b)return[[-1,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[1,e.substring(0,g)],[0,f],[1,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=-1),c):1==f.length?[[-1,a],[1,b]]:(e=this.diff_halfMatch_(a,b))?(f=e[0],a=e[1],g=e[2],b=e[3],e=e[4],f=this.diff_main(f,g,c,d),c=this.diff_main(a,b,c,d),f.concat([[0,e]],c)):c&&100c);v++){for(var n=-v+r;n<=v-t;n+=2){var l=g+n,m;m=n==-v||n!=v&&j[l-1]d)t+=2;else if(s>e)r+=2;else if(q&&(l=g+k-n,0<=l&&l= +u)return this.diff_bisectSplit_(a,b,m,s,c)}}for(n=-v+p;n<=v-w;n+=2){l=g+n;u=n==-v||n!=v&&i[l-1]d)w+=2;else if(m>e)p+=2;else if(!q&&(l=g+k-n,0<=l&&(l=u)))return this.diff_bisectSplit_(a,b,m,s,c)}}return[[-1,a],[1,b]]}; +diff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)}; +diff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b="",c=0,f=-1,g=d.length;fd?a=a.substring(c-d):c=a.length?[h,j,n,l,g]:null}if(0>=this.Diff_Timeout)return null; +var d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.lengthd[4].length?g:d:d:g;var j;a.length>b.length?(g=h[0],d=h[1],e=h[2],j=h[3]):(e=h[0],j=h[1],g=h[2],d=h[3]);h=h[4];return[g,d,e,j,h]}; +diff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,j=0,i=0;f=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[0,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[0,b.substring(0,e)]),a[f-1][0]=1,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=-1,a[f+1][1]=b.substring(e),f++;f++}f++}}; +diff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_),c=g&&c.match(diff_match_patch.linebreakRegex_),d=h&&d.match(diff_match_patch.linebreakRegex_),i=c&&a.match(diff_match_patch.blanklineEndRegex_),j=d&&b.match(diff_match_patch.blanklineStartRegex_); +return i||j?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c=i&&(i=k,g=d,h=e,j=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-1,1),c--),a[c][1]= +h,j?a[c+1][1]=j:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\s/;diff_match_patch.linebreakRegex_=/[\r\n]/;diff_match_patch.blanklineEndRegex_=/\n\r?\n$/;diff_match_patch.blanklineStartRegex_=/^\r?\n\r?\n/; +diff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,j=!1,i=!1;fb)break;e=c;f=d}return a.length!=g&&-1===a[g][0]?f:f+(b-e)}; +diff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=//g,f=/\n/g,g=0;g");switch(h){case 1:b[g]=''+j+"";break;case -1:b[g]=''+j+"";break;case 0:b[g]=""+j+""}}return b.join("")}; +diff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;cthis.Match_MaxBits)throw Error("Pattern too long for this browser.");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));for(var j=1<=i;p--){var w=e[a.charAt(p-1)];k[p]=0===t?(k[p+1]<<1|1)&w:(k[p+1]<<1|1)&w|((r[p+1]|r[p])<<1|1)|r[p+1];if(k[p]&j&&(w=d(t,p-1),w<=g))if(g=w,h=p-1,h>c)i=Math.max(1,2*c-h);else break}if(d(t+1,c)>g)break;r=k}return h}; +diff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c=2*this.Patch_Margin&& +e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}1!==i&&(f+=k.length);-1!==i&&(g+=k.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};diff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;cthis.Match_MaxBits){if(j=this.match_main(b,h.substring(0,this.Match_MaxBits),g),-1!=j&&(i=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==i||j>=i))j=-1}else j=this.match_main(b,h,g); +if(-1==j)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=j-g,g=-1==i?b.substring(j,j+h.length):b.substring(j,i+this.Match_MaxBits),h==g)b=b.substring(0,j)+this.diff_text2(a[f].diffs)+b.substring(j+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);for(var h=0,k,i=0;ie[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||0!=e[e.length-1][0]?(e.push([0, +c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c}; +diff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c2*b?(h.length1+=i.length,e+=i.length,j=!1,h.diffs.push([g,i]),d.diffs.shift()):(i=i.substring(0,b-h.length1-this.Patch_Margin),h.length1+=i.length,e+=i.length,0===g?(h.length2+=i.length,f+=i.length):j=!1,h.diffs.push([g,i]),i==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(i.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);i=this.diff_text1(d.diffs).substring(0,this.Patch_Margin);""!==i&& +(h.length1+=i.length,h.length2+=i.length,0!==h.diffs.length&&0===h.diffs[h.diffs.length-1][0]?h.diffs[h.diffs.length-1][1]+=i:h.diffs.push([0,i]));j||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c= 2.0.0-beta.1",7:">= 4.0.0"};b.REVISION_CHANGES=o;var p="[object Object]";d.prototype={constructor:d,logger:l["default"],log:l["default"].log,registerHelper:function(a,b){if(f.toString.call(a)===p){if(b)throw new h["default"]("Arg not supported with multiple helpers");f.extend(this.helpers,a)}else this.helpers[a]=b},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,b){if(f.toString.call(a)===p)f.extend(this.partials,a);else{if("undefined"==typeof b)throw new h["default"]('Attempting to register a partial called "'+a+'" as undefined');this.partials[a]=b}},unregisterPartial:function(a){delete this.partials[a]},registerDecorator:function(a,b){if(f.toString.call(a)===p){if(b)throw new h["default"]("Arg not supported with multiple decorators");f.extend(this.decorators,a)}else this.decorators[a]=b},unregisterDecorator:function(a){delete this.decorators[a]}};var q=l["default"].log;b.log=q,b.createFrame=f.createFrame,b.logger=l["default"]},function(a,b){"use strict";function c(a){return k[a]}function d(a){for(var b=1;bc;c++)if(a[c]===b)return c;return-1}function f(a){if("string"!=typeof a){if(a&&a.toHTML)return a.toHTML();if(null==a)return"";if(!a)return a+"";a=""+a}return m.test(a)?a.replace(l,c):a}function g(a){return a||0===a?p(a)&&0===a.length?!0:!1:!0}function h(a){var b=d({},a);return b._parent=a,b}function i(a,b){return a.path=b,a}function j(a,b){return(a?a+".":"")+b}b.__esModule=!0,b.extend=d,b.indexOf=e,b.escapeExpression=f,b.isEmpty=g,b.createFrame=h,b.blockParams=i,b.appendContextPath=j;var k={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`","=":"="},l=/[&<>"'`=]/g,m=/[&<>"'`=]/,n=Object.prototype.toString;b.toString=n;var o=function(a){return"function"==typeof a};o(/x/)&&(b.isFunction=o=function(a){return"function"==typeof a&&"[object Function]"===n.call(a)}),b.isFunction=o;var p=Array.isArray||function(a){return a&&"object"==typeof a?"[object Array]"===n.call(a):!1};b.isArray=p},function(a,b){"use strict";function c(a,b){var e=b&&b.loc,f=void 0,g=void 0;e&&(f=e.start.line,g=e.start.column,a+=" - "+f+":"+g);for(var h=Error.prototype.constructor.call(this,a),i=0;i0?(c.ids&&(c.ids=[c.name]),a.helpers.each(b,c)):e(this);if(c.data&&c.ids){var g=d.createFrame(c.data);g.contextPath=d.appendContextPath(c.data.contextPath,c.name),c={data:g}}return f(b,c)})},a.exports=b["default"]},function(a,b,c){"use strict";var d=c(1)["default"];b.__esModule=!0;var e=c(5),f=c(6),g=d(f);b["default"]=function(a){a.registerHelper("each",function(a,b){function c(b,c,f){j&&(j.key=b,j.index=c,j.first=0===c,j.last=!!f,k&&(j.contextPath=k+b)),i+=d(a[b],{data:j,blockParams:e.blockParams([a[b],b],[k+b,null])})}if(!b)throw new g["default"]("Must pass iterator to #each");var d=b.fn,f=b.inverse,h=0,i="",j=void 0,k=void 0;if(b.data&&b.ids&&(k=e.appendContextPath(b.data.contextPath,b.ids[0])+"."),e.isFunction(a)&&(a=a.call(this)),b.data&&(j=e.createFrame(b.data)),a&&"object"==typeof a)if(e.isArray(a))for(var l=a.length;l>h;h++)h in a&&c(h,h,h===a.length-1);else{var m=void 0;for(var n in a)a.hasOwnProperty(n)&&(void 0!==m&&c(m,h-1),m=n,h++);void 0!==m&&c(m,h-1,!0)}return 0===h&&(i=f(this)),i})},a.exports=b["default"]},function(a,b,c){"use strict";var d=c(1)["default"];b.__esModule=!0;var e=c(6),f=d(e);b["default"]=function(a){a.registerHelper("helperMissing",function(){if(1!==arguments.length)throw new f["default"]('Missing helper: "'+arguments[arguments.length-1].name+'"')})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerHelper("if",function(a,b){return d.isFunction(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||d.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})})},a.exports=b["default"]},function(a,b){"use strict";b.__esModule=!0,b["default"]=function(a){a.registerHelper("log",function(){for(var b=[void 0],c=arguments[arguments.length-1],d=0;d=0?b:parseInt(a,10)}return a},log:function(a){if(a=e.lookupLevel(a),"undefined"!=typeof console&&e.lookupLevel(e.level)<=a){var b=e.methodMap[a];console[b]||(b="log");for(var c=arguments.length,d=Array(c>1?c-1:0),f=1;c>f;f++)d[f-1]=arguments[f];console[b].apply(console,d)}}};b["default"]=e,a.exports=b["default"]},function(a,b){"use strict";function c(a){this.string=a}b.__esModule=!0,c.prototype.toString=c.prototype.toHTML=function(){return""+this.string},b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(a){var b=a&&a[0]||1,c=r.COMPILER_REVISION;if(b!==c){if(c>b){var d=r.REVISION_CHANGES[c],e=r.REVISION_CHANGES[b];throw new q["default"]("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+d+") or downgrade your runtime to an older version ("+e+").")}throw new q["default"]("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function e(a,b){function c(c,d,e){e.hash&&(d=o.extend({},d,e.hash),e.ids&&(e.ids[0]=!0)),c=b.VM.resolvePartial.call(this,c,d,e);var f=b.VM.invokePartial.call(this,c,d,e);if(null==f&&b.compile&&(e.partials[e.name]=b.compile(c,a.compilerOptions,b),f=e.partials[e.name](d,e)),null!=f){if(e.indent){for(var g=f.split("\n"),h=0,i=g.length;i>h&&(g[h]||h+1!==i);h++)g[h]=e.indent+g[h];f=g.join("\n")}return f}throw new q["default"]("The partial "+e.name+" could not be compiled when running in runtime-only mode")}function d(b){function c(b){return""+a.main(e,b,e.helpers,e.partials,g,i,h)}var f=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],g=f.data;d._setup(f),!f.partial&&a.useData&&(g=j(b,g));var h=void 0,i=a.useBlockParams?[]:void 0;return a.useDepths&&(h=f.depths?b!==f.depths[0]?[b].concat(f.depths):f.depths:[b]),(c=k(a.main,c,e,f.depths||[],g,i))(b,f)}if(!b)throw new q["default"]("No environment passed to template");if(!a||!a.main)throw new q["default"]("Unknown template object: "+typeof a);a.main.decorator=a.main_d,b.VM.checkRevision(a.compiler);var e={strict:function(a,b){if(!(b in a))throw new q["default"]('"'+b+'" not defined in '+a);return a[b]},lookup:function(a,b){for(var c=a.length,d=0;c>d;d++)if(a[d]&&null!=a[d][b])return a[d][b]},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:o.escapeExpression,invokePartial:c,fn:function(b){var c=a[b];return c.decorator=a[b+"_d"],c},programs:[],program:function(a,b,c,d,e){var g=this.programs[a],h=this.fn(a);return b||e||d||c?g=f(this,a,h,b,c,d,e):g||(g=this.programs[a]=f(this,a,h)),g},data:function(a,b){for(;a&&b--;)a=a._parent;return a},merge:function(a,b){var c=a||b;return a&&b&&a!==b&&(c=o.extend({},b,a)),c},noop:b.VM.noop,compilerInfo:a.compiler};return d.isTop=!0,d._setup=function(c){c.partial?(e.helpers=c.helpers,e.partials=c.partials,e.decorators=c.decorators):(e.helpers=e.merge(c.helpers,b.helpers),a.usePartial&&(e.partials=e.merge(c.partials,b.partials)),(a.usePartial||a.useDecorators)&&(e.decorators=e.merge(c.decorators,b.decorators)))},d._child=function(b,c,d,g){if(a.useBlockParams&&!d)throw new q["default"]("must pass block params");if(a.useDepths&&!g)throw new q["default"]("must pass parent depths");return f(e,b,a[b],c,0,d,g)},d}function f(a,b,c,d,e,f,g){function h(b){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],h=g;return g&&b!==g[0]&&(h=[b].concat(g)),c(a,b,a.helpers,a.partials,e.data||d,f&&[e.blockParams].concat(f),h)}return h=k(c,h,a,g,d,f),h.program=b,h.depth=g?g.length:0,h.blockParams=e||0,h}function g(a,b,c){return a?a.call||c.name||(c.name=a,a=c.partials[a]):a="@partial-block"===c.name?c.data["partial-block"]:c.partials[c.name],a}function h(a,b,c){c.partial=!0,c.ids&&(c.data.contextPath=c.ids[0]||c.data.contextPath);var d=void 0;if(c.fn&&c.fn!==i&&(c.data=r.createFrame(c.data),d=c.data["partial-block"]=c.fn,d.partials&&(c.partials=o.extend({},c.partials,d.partials))),void 0===a&&d&&(a=d),void 0===a)throw new q["default"]("The partial "+c.name+" could not be found");return a instanceof Function?a(b,c):void 0}function i(){return""}function j(a,b){return b&&"root"in b||(b=b?r.createFrame(b):{},b.root=a),b}function k(a,b,c,d,e,f){if(a.decorator){var g={};b=a.decorator(b,g,c,d&&d[0],e,f,d),o.extend(b,g)}return b}var l=c(3)["default"],m=c(1)["default"];b.__esModule=!0,b.checkRevision=d,b.template=e,b.wrapProgram=f,b.resolvePartial=g,b.invokePartial=h,b.noop=i;var n=c(5),o=l(n),p=c(6),q=m(p),r=c(4)},function(a,b){(function(c){"use strict";b.__esModule=!0,b["default"]=function(a){var b="undefined"!=typeof c?c:window,d=b.Handlebars;a.noConflict=function(){return b.Handlebars===a&&(b.Handlebars=d),a}},a.exports=b["default"]}).call(b,function(){return this}())},function(a,b){"use strict";b.__esModule=!0;var c={helpers:{helperExpression:function(a){return"SubExpression"===a.type||("MustacheStatement"===a.type||"BlockStatement"===a.type)&&!!(a.params&&a.params.length||a.hash)},scopedId:function(a){return/^\.|this\b/.test(a.original)},simpleId:function(a){return 1===a.parts.length&&!c.helpers.scopedId(a)&&!a.depth}}};b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b){if("Program"===a.type)return a;h["default"].yy=n,n.locInfo=function(a){return new n.SourceLocation(b&&b.srcName,a)};var c=new j["default"](b);return c.accept(h["default"].parse(a))}var e=c(1)["default"],f=c(3)["default"];b.__esModule=!0,b.parse=d;var g=c(23),h=e(g),i=c(24),j=e(i),k=c(26),l=f(k),m=c(5);b.parser=h["default"];var n={};m.extend(n,l)},function(a,b){"use strict";var c=function(){function a(){this.yy={}}var b={trace:function(){},yy:{},symbols_:{error:2,root:3,program:4,EOF:5,program_repetition0:6,statement:7,mustache:8,block:9,rawBlock:10,partial:11,partialBlock:12,content:13,COMMENT:14,CONTENT:15,openRawBlock:16,rawBlock_repetition_plus0:17,END_RAW_BLOCK:18,OPEN_RAW_BLOCK:19,helperName:20,openRawBlock_repetition0:21,openRawBlock_option0:22,CLOSE_RAW_BLOCK:23,openBlock:24,block_option0:25,closeBlock:26,openInverse:27,block_option1:28,OPEN_BLOCK:29,openBlock_repetition0:30,openBlock_option0:31,openBlock_option1:32,CLOSE:33,OPEN_INVERSE:34,openInverse_repetition0:35,openInverse_option0:36,openInverse_option1:37,openInverseChain:38,OPEN_INVERSE_CHAIN:39,openInverseChain_repetition0:40,openInverseChain_option0:41,openInverseChain_option1:42,inverseAndProgram:43,INVERSE:44,inverseChain:45,inverseChain_option0:46,OPEN_ENDBLOCK:47,OPEN:48,mustache_repetition0:49,mustache_option0:50,OPEN_UNESCAPED:51,mustache_repetition1:52,mustache_option1:53,CLOSE_UNESCAPED:54,OPEN_PARTIAL:55,partialName:56,partial_repetition0:57,partial_option0:58,openPartialBlock:59,OPEN_PARTIAL_BLOCK:60,openPartialBlock_repetition0:61,openPartialBlock_option0:62,param:63,sexpr:64,OPEN_SEXPR:65,sexpr_repetition0:66,sexpr_option0:67,CLOSE_SEXPR:68,hash:69,hash_repetition_plus0:70,hashSegment:71,ID:72,EQUALS:73,blockParams:74,OPEN_BLOCK_PARAMS:75,blockParams_repetition_plus0:76,CLOSE_BLOCK_PARAMS:77,path:78,dataName:79,STRING:80,NUMBER:81,BOOLEAN:82,UNDEFINED:83,NULL:84,DATA:85,pathSegments:86,SEP:87,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",14:"COMMENT",15:"CONTENT",18:"END_RAW_BLOCK",19:"OPEN_RAW_BLOCK",23:"CLOSE_RAW_BLOCK",29:"OPEN_BLOCK",33:"CLOSE",34:"OPEN_INVERSE",39:"OPEN_INVERSE_CHAIN",44:"INVERSE",47:"OPEN_ENDBLOCK",48:"OPEN",51:"OPEN_UNESCAPED",54:"CLOSE_UNESCAPED",55:"OPEN_PARTIAL",60:"OPEN_PARTIAL_BLOCK",65:"OPEN_SEXPR",68:"CLOSE_SEXPR",72:"ID",73:"EQUALS",75:"OPEN_BLOCK_PARAMS",77:"CLOSE_BLOCK_PARAMS",80:"STRING",81:"NUMBER",82:"BOOLEAN",83:"UNDEFINED",84:"NULL",85:"DATA",87:"SEP"},productions_:[0,[3,2],[4,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[13,1],[10,3],[16,5],[9,4],[9,4],[24,6],[27,6],[38,6],[43,2],[45,3],[45,1],[26,3],[8,5],[8,5],[11,5],[12,3],[59,5],[63,1],[63,1],[64,5],[69,1],[71,3],[74,3],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[56,1],[56,1],[79,2],[78,1],[86,3],[86,1],[6,0],[6,2],[17,1],[17,2],[21,0],[21,2],[22,0],[22,1],[25,0],[25,1],[28,0],[28,1],[30,0],[30,2],[31,0],[31,1],[32,0],[32,1],[35,0],[35,2],[36,0],[36,1],[37,0],[37,1],[40,0],[40,2],[41,0],[41,1],[42,0],[42,1],[46,0],[46,1],[49,0],[49,2],[50,0],[50,1],[52,0],[52,2],[53,0],[53,1],[57,0],[57,2],[58,0],[58,1],[61,0],[61,2],[62,0],[62,1],[66,0],[66,2],[67,0],[67,1],[70,1],[70,2],[76,1],[76,2]],performAction:function(a,b,c,d,e,f,g){var h=f.length-1;switch(e){case 1:return f[h-1];case 2:this.$=d.prepareProgram(f[h]);break;case 3:this.$=f[h];break;case 4:this.$=f[h];break;case 5:this.$=f[h];break;case 6:this.$=f[h];break;case 7:this.$=f[h];break;case 8:this.$=f[h];break;case 9:this.$={type:"CommentStatement",value:d.stripComment(f[h]),strip:d.stripFlags(f[h],f[h]),loc:d.locInfo(this._$)};break;case 10:this.$={type:"ContentStatement",original:f[h],value:f[h],loc:d.locInfo(this._$)};break;case 11:this.$=d.prepareRawBlock(f[h-2],f[h-1],f[h],this._$);break;case 12:this.$={path:f[h-3],params:f[h-2],hash:f[h-1]};break;case 13:this.$=d.prepareBlock(f[h-3],f[h-2],f[h-1],f[h],!1,this._$);break;case 14:this.$=d.prepareBlock(f[h-3],f[h-2],f[h-1],f[h],!0,this._$);break;case 15:this.$={open:f[h-5],path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 16:this.$={path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 17:this.$={path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 18:this.$={strip:d.stripFlags(f[h-1],f[h-1]),program:f[h]};break;case 19:var i=d.prepareBlock(f[h-2],f[h-1],f[h],f[h],!1,this._$),j=d.prepareProgram([i],f[h-1].loc);j.chained=!0,this.$={strip:f[h-2].strip,program:j,chain:!0};break;case 20:this.$=f[h];break;case 21:this.$={path:f[h-1],strip:d.stripFlags(f[h-2],f[h])};break;case 22:this.$=d.prepareMustache(f[h-3],f[h-2],f[h-1],f[h-4],d.stripFlags(f[h-4],f[h]),this._$);break;case 23:this.$=d.prepareMustache(f[h-3],f[h-2],f[h-1],f[h-4],d.stripFlags(f[h-4],f[h]),this._$);break;case 24:this.$={type:"PartialStatement",name:f[h-3],params:f[h-2],hash:f[h-1],indent:"",strip:d.stripFlags(f[h-4],f[h]),loc:d.locInfo(this._$)};break;case 25:this.$=d.preparePartialBlock(f[h-2],f[h-1],f[h],this._$);break;case 26:this.$={path:f[h-3],params:f[h-2],hash:f[h-1],strip:d.stripFlags(f[h-4],f[h])};break;case 27:this.$=f[h];break;case 28:this.$=f[h];break;case 29:this.$={type:"SubExpression",path:f[h-3],params:f[h-2],hash:f[h-1],loc:d.locInfo(this._$)};break;case 30:this.$={type:"Hash",pairs:f[h],loc:d.locInfo(this._$)};break;case 31:this.$={type:"HashPair",key:d.id(f[h-2]),value:f[h],loc:d.locInfo(this._$)};break;case 32:this.$=d.id(f[h-1]);break;case 33:this.$=f[h];break;case 34:this.$=f[h];break;case 35:this.$={type:"StringLiteral",value:f[h],original:f[h],loc:d.locInfo(this._$)};break;case 36:this.$={type:"NumberLiteral",value:Number(f[h]),original:Number(f[h]),loc:d.locInfo(this._$)};break;case 37:this.$={type:"BooleanLiteral",value:"true"===f[h],original:"true"===f[h],loc:d.locInfo(this._$)};break;case 38:this.$={type:"UndefinedLiteral",original:void 0,value:void 0,loc:d.locInfo(this._$)};break;case 39:this.$={type:"NullLiteral",original:null,value:null,loc:d.locInfo(this._$)};break;case 40:this.$=f[h];break;case 41:this.$=f[h];break;case 42:this.$=d.preparePath(!0,f[h],this._$);break;case 43:this.$=d.preparePath(!1,f[h],this._$);break;case 44:f[h-2].push({part:d.id(f[h]),original:f[h],separator:f[h-1]}),this.$=f[h-2];break;case 45:this.$=[{part:d.id(f[h]),original:f[h]}];break;case 46:this.$=[];break;case 47:f[h-1].push(f[h]);break;case 48:this.$=[f[h]];break;case 49:f[h-1].push(f[h]);break;case 50:this.$=[];break;case 51:f[h-1].push(f[h]);break;case 58:this.$=[];break;case 59:f[h-1].push(f[h]);break;case 64:this.$=[];break;case 65:f[h-1].push(f[h]);break;case 70:this.$=[];break;case 71:f[h-1].push(f[h]);break;case 78:this.$=[];break;case 79:f[h-1].push(f[h]);break;case 82:this.$=[];break;case 83:f[h-1].push(f[h]);break;case 86:this.$=[];break;case 87:f[h-1].push(f[h]);break;case 90:this.$=[];break;case 91:f[h-1].push(f[h]);break;case 94:this.$=[];break;case 95:f[h-1].push(f[h]);break;case 98:this.$=[f[h]];break;case 99:f[h-1].push(f[h]);break;case 100:this.$=[f[h]];break;case 101:f[h-1].push(f[h])}},table:[{3:1,4:2,5:[2,46],6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{1:[3]},{5:[1,4]},{5:[2,2],7:5,8:6,9:7,10:8,11:9,12:10,13:11,14:[1,12],15:[1,20],16:17,19:[1,23],24:15,27:16,29:[1,21],34:[1,22],39:[2,2],44:[2,2],47:[2,2],48:[1,13],51:[1,14],55:[1,18],59:19,60:[1,24]},{1:[2,1]},{5:[2,47],14:[2,47],15:[2,47],19:[2,47],29:[2,47],34:[2,47],39:[2,47],44:[2,47],47:[2,47],48:[2,47],51:[2,47],55:[2,47],60:[2,47]},{5:[2,3],14:[2,3],15:[2,3],19:[2,3],29:[2,3],34:[2,3],39:[2,3],44:[2,3],47:[2,3],48:[2,3],51:[2,3],55:[2,3],60:[2,3]},{5:[2,4],14:[2,4],15:[2,4],19:[2,4],29:[2,4],34:[2,4],39:[2,4],44:[2,4],47:[2,4],48:[2,4],51:[2,4],55:[2,4],60:[2,4]},{5:[2,5],14:[2,5],15:[2,5],19:[2,5],29:[2,5],34:[2,5],39:[2,5],44:[2,5],47:[2,5],48:[2,5],51:[2,5],55:[2,5],60:[2,5]},{5:[2,6],14:[2,6],15:[2,6],19:[2,6],29:[2,6],34:[2,6],39:[2,6],44:[2,6],47:[2,6],48:[2,6],51:[2,6],55:[2,6],60:[2,6]},{5:[2,7],14:[2,7],15:[2,7],19:[2,7],29:[2,7],34:[2,7],39:[2,7],44:[2,7],47:[2,7],48:[2,7],51:[2,7],55:[2,7],60:[2,7]},{5:[2,8],14:[2,8],15:[2,8],19:[2,8],29:[2,8],34:[2,8],39:[2,8],44:[2,8],47:[2,8],48:[2,8],51:[2,8],55:[2,8],60:[2,8]},{5:[2,9],14:[2,9],15:[2,9],19:[2,9],29:[2,9],34:[2,9],39:[2,9],44:[2,9],47:[2,9],48:[2,9],51:[2,9],55:[2,9],60:[2,9]},{20:25,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:36,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:37,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],39:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{4:38,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{13:40,15:[1,20],17:39},{20:42,56:41,64:43,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:45,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{5:[2,10],14:[2,10],15:[2,10],18:[2,10],19:[2,10],29:[2,10],34:[2,10],39:[2,10],44:[2,10],47:[2,10],48:[2,10],51:[2,10],55:[2,10],60:[2,10]},{20:46,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:47,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:48,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:42,56:49,64:43,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[2,78],49:50,65:[2,78],72:[2,78],80:[2,78],81:[2,78],82:[2,78],83:[2,78],84:[2,78],85:[2,78]},{23:[2,33],33:[2,33],54:[2,33],65:[2,33],68:[2,33],72:[2,33],75:[2,33],80:[2,33],81:[2,33],82:[2,33],83:[2,33],84:[2,33],85:[2,33]},{23:[2,34],33:[2,34],54:[2,34],65:[2,34],68:[2,34],72:[2,34],75:[2,34],80:[2,34],81:[2,34],82:[2,34],83:[2,34],84:[2,34],85:[2,34]},{23:[2,35],33:[2,35],54:[2,35],65:[2,35],68:[2,35],72:[2,35],75:[2,35],80:[2,35],81:[2,35],82:[2,35],83:[2,35],84:[2,35],85:[2,35]},{23:[2,36],33:[2,36],54:[2,36],65:[2,36],68:[2,36],72:[2,36],75:[2,36],80:[2,36],81:[2,36],82:[2,36],83:[2,36],84:[2,36],85:[2,36]},{23:[2,37],33:[2,37],54:[2,37],65:[2,37],68:[2,37],72:[2,37],75:[2,37],80:[2,37],81:[2,37],82:[2,37],83:[2,37],84:[2,37],85:[2,37]},{23:[2,38],33:[2,38],54:[2,38],65:[2,38],68:[2,38],72:[2,38],75:[2,38],80:[2,38],81:[2,38],82:[2,38],83:[2,38],84:[2,38],85:[2,38]},{23:[2,39],33:[2,39],54:[2,39],65:[2,39],68:[2,39],72:[2,39],75:[2,39],80:[2,39],81:[2,39],82:[2,39],83:[2,39],84:[2,39],85:[2,39]},{23:[2,43],33:[2,43],54:[2,43],65:[2,43],68:[2,43],72:[2,43],75:[2,43],80:[2,43],81:[2,43],82:[2,43],83:[2,43],84:[2,43],85:[2,43],87:[1,51]},{72:[1,35],86:52},{23:[2,45],33:[2,45],54:[2,45],65:[2,45],68:[2,45],72:[2,45],75:[2,45],80:[2,45],81:[2,45],82:[2,45],83:[2,45],84:[2,45],85:[2,45],87:[2,45]},{52:53,54:[2,82],65:[2,82],72:[2,82],80:[2,82],81:[2,82],82:[2,82],83:[2,82],84:[2,82],85:[2,82]},{25:54,38:56,39:[1,58],43:57,44:[1,59],45:55,47:[2,54]},{28:60,43:61,44:[1,59],47:[2,56]},{13:63,15:[1,20],18:[1,62]},{15:[2,48],18:[2,48]},{33:[2,86],57:64,65:[2,86],72:[2,86],80:[2,86],81:[2,86],82:[2,86],83:[2,86],84:[2,86],85:[2,86]},{33:[2,40],65:[2,40],72:[2,40],80:[2,40],81:[2,40],82:[2,40],83:[2,40],84:[2,40],85:[2,40]},{33:[2,41],65:[2,41],72:[2,41],80:[2,41],81:[2,41],82:[2,41],83:[2,41],84:[2,41],85:[2,41]},{20:65,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{26:66,47:[1,67]},{30:68,33:[2,58],65:[2,58],72:[2,58],75:[2,58],80:[2,58],81:[2,58],82:[2,58],83:[2,58],84:[2,58],85:[2,58]},{33:[2,64],35:69,65:[2,64],72:[2,64],75:[2,64],80:[2,64],81:[2,64],82:[2,64],83:[2,64],84:[2,64],85:[2,64]},{21:70,23:[2,50],65:[2,50],72:[2,50],80:[2,50],81:[2,50],82:[2,50],83:[2,50],84:[2,50],85:[2,50]},{33:[2,90],61:71,65:[2,90],72:[2,90],80:[2,90],81:[2,90],82:[2,90],83:[2,90],84:[2,90],85:[2,90]},{20:75,33:[2,80],50:72,63:73,64:76,65:[1,44],69:74,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{72:[1,80]},{23:[2,42],33:[2,42],54:[2,42],65:[2,42],68:[2,42],72:[2,42],75:[2,42],80:[2,42],81:[2,42],82:[2,42],83:[2,42],84:[2,42],85:[2,42],87:[1,51]},{20:75,53:81,54:[2,84],63:82,64:76,65:[1,44],69:83,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{26:84,47:[1,67]},{47:[2,55]},{4:85,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],39:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{47:[2,20]},{20:86,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:87,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{26:88,47:[1,67]},{47:[2,57]},{5:[2,11],14:[2,11],15:[2,11],19:[2,11],29:[2,11],34:[2,11],39:[2,11],44:[2,11],47:[2,11],48:[2,11],51:[2,11],55:[2,11],60:[2,11]},{15:[2,49],18:[2,49]},{20:75,33:[2,88],58:89,63:90,64:76,65:[1,44],69:91,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{65:[2,94],66:92,68:[2,94],72:[2,94],80:[2,94],81:[2,94],82:[2,94],83:[2,94],84:[2,94],85:[2,94]},{5:[2,25],14:[2,25],15:[2,25],19:[2,25],29:[2,25],34:[2,25],39:[2,25],44:[2,25],47:[2,25],48:[2,25],51:[2,25],55:[2,25],60:[2,25]},{20:93,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,31:94,33:[2,60],63:95,64:76,65:[1,44],69:96,70:77,71:78,72:[1,79],75:[2,60],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,33:[2,66],36:97,63:98,64:76,65:[1,44],69:99,70:77,71:78,72:[1,79],75:[2,66],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,22:100,23:[2,52],63:101,64:76,65:[1,44],69:102,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,33:[2,92],62:103,63:104,64:76,65:[1,44],69:105,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[1,106]},{33:[2,79],65:[2,79],72:[2,79],80:[2,79],81:[2,79],82:[2,79],83:[2,79],84:[2,79],85:[2,79]},{33:[2,81]},{23:[2,27],33:[2,27],54:[2,27],65:[2,27],68:[2,27],72:[2,27],75:[2,27],80:[2,27],81:[2,27],82:[2,27],83:[2,27],84:[2,27],85:[2,27]},{23:[2,28],33:[2,28],54:[2,28],65:[2,28],68:[2,28],72:[2,28],75:[2,28],80:[2,28],81:[2,28],82:[2,28],83:[2,28],84:[2,28],85:[2,28]},{23:[2,30],33:[2,30],54:[2,30],68:[2,30],71:107,72:[1,108],75:[2,30]},{23:[2,98],33:[2,98],54:[2,98],68:[2,98],72:[2,98],75:[2,98]},{23:[2,45],33:[2,45],54:[2,45],65:[2,45],68:[2,45],72:[2,45],73:[1,109],75:[2,45],80:[2,45],81:[2,45],82:[2,45],83:[2,45],84:[2,45],85:[2,45],87:[2,45]},{23:[2,44],33:[2,44],54:[2,44],65:[2,44],68:[2,44],72:[2,44],75:[2,44],80:[2,44],81:[2,44],82:[2,44],83:[2,44],84:[2,44],85:[2,44],87:[2,44]},{54:[1,110]},{54:[2,83],65:[2,83],72:[2,83],80:[2,83],81:[2,83],82:[2,83],83:[2,83],84:[2,83],85:[2,83]},{54:[2,85]},{5:[2,13],14:[2,13],15:[2,13],19:[2,13],29:[2,13],34:[2,13],39:[2,13],44:[2,13],47:[2,13],48:[2,13],51:[2,13],55:[2,13],60:[2,13]},{38:56,39:[1,58],43:57,44:[1,59],45:112,46:111,47:[2,76]},{33:[2,70],40:113,65:[2,70],72:[2,70],75:[2,70],80:[2,70],81:[2,70],82:[2,70],83:[2,70],84:[2,70],85:[2,70]},{47:[2,18]},{5:[2,14],14:[2,14],15:[2,14],19:[2,14],29:[2,14],34:[2,14],39:[2,14],44:[2,14],47:[2,14],48:[2,14],51:[2,14],55:[2,14],60:[2,14]},{33:[1,114]},{33:[2,87],65:[2,87],72:[2,87],80:[2,87],81:[2,87],82:[2,87],83:[2,87],84:[2,87],85:[2,87]},{33:[2,89]},{20:75,63:116,64:76,65:[1,44],67:115,68:[2,96],69:117,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[1,118]},{32:119,33:[2,62],74:120,75:[1,121]},{33:[2,59],65:[2,59],72:[2,59],75:[2,59],80:[2,59],81:[2,59],82:[2,59],83:[2,59],84:[2,59],85:[2,59]},{33:[2,61],75:[2,61]},{33:[2,68],37:122,74:123,75:[1,121]},{33:[2,65],65:[2,65],72:[2,65],75:[2,65],80:[2,65],81:[2,65],82:[2,65],83:[2,65],84:[2,65],85:[2,65]},{33:[2,67],75:[2,67]},{23:[1,124]},{23:[2,51],65:[2,51],72:[2,51],80:[2,51],81:[2,51],82:[2,51],83:[2,51],84:[2,51],85:[2,51]},{23:[2,53]},{33:[1,125]},{33:[2,91],65:[2,91],72:[2,91],80:[2,91],81:[2,91],82:[2,91],83:[2,91],84:[2,91],85:[2,91]},{33:[2,93]},{5:[2,22],14:[2,22],15:[2,22],19:[2,22],29:[2,22],34:[2,22],39:[2,22],44:[2,22],47:[2,22],48:[2,22],51:[2,22],55:[2,22],60:[2,22]},{23:[2,99],33:[2,99],54:[2,99],68:[2,99],72:[2,99],75:[2,99]},{73:[1,109]},{20:75,63:126,64:76,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{5:[2,23],14:[2,23],15:[2,23],19:[2,23],29:[2,23],34:[2,23],39:[2,23],44:[2,23],47:[2,23],48:[2,23],51:[2,23],55:[2,23],60:[2,23]},{47:[2,19]},{47:[2,77]},{20:75,33:[2,72],41:127,63:128,64:76,65:[1,44],69:129,70:77,71:78,72:[1,79],75:[2,72],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{5:[2,24],14:[2,24],15:[2,24],19:[2,24],29:[2,24],34:[2,24],39:[2,24],44:[2,24],47:[2,24],48:[2,24],51:[2,24],55:[2,24],60:[2,24]},{68:[1,130]},{65:[2,95],68:[2,95],72:[2,95],80:[2,95],81:[2,95],82:[2,95],83:[2,95],84:[2,95],85:[2,95]},{68:[2,97]},{5:[2,21],14:[2,21],15:[2,21],19:[2,21],29:[2,21],34:[2,21],39:[2,21],44:[2,21],47:[2,21],48:[2,21],51:[2,21],55:[2,21],60:[2,21]},{33:[1,131]},{33:[2,63]},{72:[1,133],76:132},{33:[1,134]},{33:[2,69]},{15:[2,12]},{14:[2,26],15:[2,26],19:[2,26],29:[2,26],34:[2,26],47:[2,26],48:[2,26],51:[2,26],55:[2,26],60:[2,26]},{23:[2,31],33:[2,31],54:[2,31],68:[2,31],72:[2,31],75:[2,31]},{33:[2,74],42:135,74:136,75:[1,121]},{33:[2,71],65:[2,71],72:[2,71],75:[2,71],80:[2,71],81:[2,71],82:[2,71],83:[2,71],84:[2,71],85:[2,71]},{33:[2,73],75:[2,73]},{23:[2,29],33:[2,29],54:[2,29],65:[2,29],68:[2,29],72:[2,29],75:[2,29],80:[2,29],81:[2,29],82:[2,29],83:[2,29],84:[2,29],85:[2,29]},{14:[2,15],15:[2,15],19:[2,15],29:[2,15],34:[2,15],39:[2,15],44:[2,15],47:[2,15],48:[2,15],51:[2,15],55:[2,15],60:[2,15]},{72:[1,138],77:[1,137]},{72:[2,100],77:[2,100]},{14:[2,16],15:[2,16],19:[2,16],29:[2,16],34:[2,16],44:[2,16],47:[2,16], +48:[2,16],51:[2,16],55:[2,16],60:[2,16]},{33:[1,139]},{33:[2,75]},{33:[2,32]},{72:[2,101],77:[2,101]},{14:[2,17],15:[2,17],19:[2,17],29:[2,17],34:[2,17],39:[2,17],44:[2,17],47:[2,17],48:[2,17],51:[2,17],55:[2,17],60:[2,17]}],defaultActions:{4:[2,1],55:[2,55],57:[2,20],61:[2,57],74:[2,81],83:[2,85],87:[2,18],91:[2,89],102:[2,53],105:[2,93],111:[2,19],112:[2,77],117:[2,97],120:[2,63],123:[2,69],124:[2,12],136:[2,75],137:[2,32]},parseError:function(a,b){throw new Error(a)},parse:function(a){function b(){var a;return a=c.lexer.lex()||1,"number"!=typeof a&&(a=c.symbols_[a]||a),a}var c=this,d=[0],e=[null],f=[],g=this.table,h="",i=0,j=0,k=0;this.lexer.setInput(a),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,"undefined"==typeof this.lexer.yylloc&&(this.lexer.yylloc={});var l=this.lexer.yylloc;f.push(l);var m=this.lexer.options&&this.lexer.options.ranges;"function"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError);for(var n,o,p,q,r,s,t,u,v,w={};;){if(p=d[d.length-1],this.defaultActions[p]?q=this.defaultActions[p]:((null===n||"undefined"==typeof n)&&(n=b()),q=g[p]&&g[p][n]),"undefined"==typeof q||!q.length||!q[0]){var x="";if(!k){v=[];for(s in g[p])this.terminals_[s]&&s>2&&v.push("'"+this.terminals_[s]+"'");x=this.lexer.showPosition?"Parse error on line "+(i+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+v.join(", ")+", got '"+(this.terminals_[n]||n)+"'":"Parse error on line "+(i+1)+": Unexpected "+(1==n?"end of input":"'"+(this.terminals_[n]||n)+"'"),this.parseError(x,{text:this.lexer.match,token:this.terminals_[n]||n,line:this.lexer.yylineno,loc:l,expected:v})}}if(q[0]instanceof Array&&q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+p+", token: "+n);switch(q[0]){case 1:d.push(n),e.push(this.lexer.yytext),f.push(this.lexer.yylloc),d.push(q[1]),n=null,o?(n=o,o=null):(j=this.lexer.yyleng,h=this.lexer.yytext,i=this.lexer.yylineno,l=this.lexer.yylloc,k>0&&k--);break;case 2:if(t=this.productions_[q[1]][1],w.$=e[e.length-t],w._$={first_line:f[f.length-(t||1)].first_line,last_line:f[f.length-1].last_line,first_column:f[f.length-(t||1)].first_column,last_column:f[f.length-1].last_column},m&&(w._$.range=[f[f.length-(t||1)].range[0],f[f.length-1].range[1]]),r=this.performAction.call(w,h,j,i,this.yy,q[1],e,f),"undefined"!=typeof r)return r;t&&(d=d.slice(0,-1*t*2),e=e.slice(0,-1*t),f=f.slice(0,-1*t)),d.push(this.productions_[q[1]][0]),e.push(w.$),f.push(w._$),u=g[d[d.length-2]][d[d.length-1]],d.push(u);break;case 3:return!0}}return!0}},c=function(){var a={EOF:1,parseError:function(a,b){if(!this.yy.parser)throw new Error(a);this.yy.parser.parseError(a,b)},setInput:function(a){return this._input=a,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var a=this._input[0];this.yytext+=a,this.yyleng++,this.offset++,this.match+=a,this.matched+=a;var b=a.match(/(?:\r\n?|\n).*/g);return b?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),a},unput:function(a){var b=a.length,c=a.split(/(?:\r\n?|\n)/g);this._input=a+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-b-1),this.offset-=b;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var e=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===d.length?this.yylloc.first_column:0)+d[d.length-c.length].length-c[0].length:this.yylloc.first_column-b},this.options.ranges&&(this.yylloc.range=[e[0],e[0]+this.yyleng-b]),this},more:function(){return this._more=!0,this},less:function(a){this.unput(this.match.slice(a))},pastInput:function(){var a=this.matched.substr(0,this.matched.length-this.match.length);return(a.length>20?"...":"")+a.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var a=this.match;return a.length<20&&(a+=this._input.substr(0,20-a.length)),(a.substr(0,20)+(a.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var a=this.pastInput(),b=new Array(a.length+1).join("-");return a+this.upcomingInput()+"\n"+b+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var a,b,c,d,e;this._more||(this.yytext="",this.match="");for(var f=this._currentRules(),g=0;gb[0].length)||(b=c,d=g,this.options.flex));g++);return b?(e=b[0].match(/(?:\r\n?|\n).*/g),e&&(this.yylineno+=e.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:e?e[e.length-1].length-e[e.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+b[0].length},this.yytext+=b[0],this.match+=b[0],this.matches=b,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._input=this._input.slice(b[0].length),this.matched+=b[0],a=this.performAction.call(this,this.yy,this,f[d],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),a?a:void 0):""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var a=this.next();return"undefined"!=typeof a?a:this.lex()},begin:function(a){this.conditionStack.push(a)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(a){this.begin(a)}};return a.options={},a.performAction=function(a,b,c,d){function e(a,c){return b.yytext=b.yytext.substr(a,b.yyleng-c)}switch(c){case 0:if("\\\\"===b.yytext.slice(-2)?(e(0,1),this.begin("mu")):"\\"===b.yytext.slice(-1)?(e(0,1),this.begin("emu")):this.begin("mu"),b.yytext)return 15;break;case 1:return 15;case 2:return this.popState(),15;case 3:return this.begin("raw"),15;case 4:return this.popState(),"raw"===this.conditionStack[this.conditionStack.length-1]?15:(b.yytext=b.yytext.substr(5,b.yyleng-9),"END_RAW_BLOCK");case 5:return 15;case 6:return this.popState(),14;case 7:return 65;case 8:return 68;case 9:return 19;case 10:return this.popState(),this.begin("raw"),23;case 11:return 55;case 12:return 60;case 13:return 29;case 14:return 47;case 15:return this.popState(),44;case 16:return this.popState(),44;case 17:return 34;case 18:return 39;case 19:return 51;case 20:return 48;case 21:this.unput(b.yytext),this.popState(),this.begin("com");break;case 22:return this.popState(),14;case 23:return 48;case 24:return 73;case 25:return 72;case 26:return 72;case 27:return 87;case 28:break;case 29:return this.popState(),54;case 30:return this.popState(),33;case 31:return b.yytext=e(1,2).replace(/\\"/g,'"'),80;case 32:return b.yytext=e(1,2).replace(/\\'/g,"'"),80;case 33:return 85;case 34:return 82;case 35:return 82;case 36:return 83;case 37:return 84;case 38:return 81;case 39:return 75;case 40:return 77;case 41:return 72;case 42:return b.yytext=b.yytext.replace(/\\([\\\]])/g,"$1"),72;case 43:return"INVALID";case 44:return 5}},a.rules=[/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/,/^(?:\{\{\{\{(?=[^\/]))/,/^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/,/^(?:[^\x00]*?(?=(\{\{\{\{)))/,/^(?:[\s\S]*?--(~)?\}\})/,/^(?:\()/,/^(?:\))/,/^(?:\{\{\{\{)/,/^(?:\}\}\}\})/,/^(?:\{\{(~)?>)/,/^(?:\{\{(~)?#>)/,/^(?:\{\{(~)?#\*?)/,/^(?:\{\{(~)?\/)/,/^(?:\{\{(~)?\^\s*(~)?\}\})/,/^(?:\{\{(~)?\s*else\s*(~)?\}\})/,/^(?:\{\{(~)?\^)/,/^(?:\{\{(~)?\s*else\b)/,/^(?:\{\{(~)?\{)/,/^(?:\{\{(~)?&)/,/^(?:\{\{(~)?!--)/,/^(?:\{\{(~)?![\s\S]*?\}\})/,/^(?:\{\{(~)?\*?)/,/^(?:=)/,/^(?:\.\.)/,/^(?:\.(?=([=~}\s\/.)|])))/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}(~)?\}\})/,/^(?:(~)?\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\s)])))/,/^(?:false(?=([~}\s)])))/,/^(?:undefined(?=([~}\s)])))/,/^(?:null(?=([~}\s)])))/,/^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/,/^(?:as\s+\|)/,/^(?:\|)/,/^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/,/^(?:\[(\\\]|[^\]])*\])/,/^(?:.)/,/^(?:$)/],a.conditions={mu:{rules:[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44],inclusive:!1},emu:{rules:[2],inclusive:!1},com:{rules:[6],inclusive:!1},raw:{rules:[3,4,5],inclusive:!1},INITIAL:{rules:[0,1,44],inclusive:!0}},a}();return b.lexer=c,a.prototype=b,b.Parser=a,new a}();b.__esModule=!0,b["default"]=c},function(a,b,c){"use strict";function d(){var a=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.options=a}function e(a,b,c){void 0===b&&(b=a.length);var d=a[b-1],e=a[b-2];return d?"ContentStatement"===d.type?(e||!c?/\r?\n\s*?$/:/(^|\r?\n)\s*?$/).test(d.original):void 0:c}function f(a,b,c){void 0===b&&(b=-1);var d=a[b+1],e=a[b+2];return d?"ContentStatement"===d.type?(e||!c?/^\s*?\r?\n/:/^\s*?(\r?\n|$)/).test(d.original):void 0:c}function g(a,b,c){var d=a[null==b?0:b+1];if(d&&"ContentStatement"===d.type&&(c||!d.rightStripped)){var e=d.value;d.value=d.value.replace(c?/^\s+/:/^[ \t]*\r?\n?/,""),d.rightStripped=d.value!==e}}function h(a,b,c){var d=a[null==b?a.length-1:b-1];if(d&&"ContentStatement"===d.type&&(c||!d.leftStripped)){var e=d.value;return d.value=d.value.replace(c?/\s+$/:/[ \t]+$/,""),d.leftStripped=d.value!==e,d.leftStripped}}var i=c(1)["default"];b.__esModule=!0;var j=c(25),k=i(j);d.prototype=new k["default"],d.prototype.Program=function(a){var b=!this.options.ignoreStandalone,c=!this.isRootSeen;this.isRootSeen=!0;for(var d=a.body,i=0,j=d.length;j>i;i++){var k=d[i],l=this.accept(k);if(l){var m=e(d,i,c),n=f(d,i,c),o=l.openStandalone&&m,p=l.closeStandalone&&n,q=l.inlineStandalone&&m&&n;l.close&&g(d,i,!0),l.open&&h(d,i,!0),b&&q&&(g(d,i),h(d,i)&&"PartialStatement"===k.type&&(k.indent=/([ \t]+$)/.exec(d[i-1].original)[1])),b&&o&&(g((k.program||k.inverse).body),h(d,i)),b&&p&&(g(d,i),h((k.inverse||k.program).body))}}return a},d.prototype.BlockStatement=d.prototype.DecoratorBlock=d.prototype.PartialBlockStatement=function(a){this.accept(a.program),this.accept(a.inverse);var b=a.program||a.inverse,c=a.program&&a.inverse,d=c,i=c;if(c&&c.chained)for(d=c.body[0].program;i.chained;)i=i.body[i.body.length-1].program;var j={open:a.openStrip.open,close:a.closeStrip.close,openStandalone:f(b.body),closeStandalone:e((d||b).body)};if(a.openStrip.close&&g(b.body,null,!0),c){var k=a.inverseStrip;k.open&&h(b.body,null,!0),k.close&&g(d.body,null,!0),a.closeStrip.open&&h(i.body,null,!0),!this.options.ignoreStandalone&&e(b.body)&&f(d.body)&&(h(b.body),g(d.body))}else a.closeStrip.open&&h(b.body,null,!0);return j},d.prototype.Decorator=d.prototype.MustacheStatement=function(a){return a.strip},d.prototype.PartialStatement=d.prototype.CommentStatement=function(a){var b=a.strip||{};return{inlineStandalone:!0,open:b.open,close:b.close}},b["default"]=d,a.exports=b["default"]},function(a,b,c){"use strict";function d(){this.parents=[]}function e(a){this.acceptRequired(a,"path"),this.acceptArray(a.params),this.acceptKey(a,"hash")}function f(a){e.call(this,a),this.acceptKey(a,"program"),this.acceptKey(a,"inverse")}function g(a){this.acceptRequired(a,"name"),this.acceptArray(a.params),this.acceptKey(a,"hash")}var h=c(1)["default"];b.__esModule=!0;var i=c(6),j=h(i);d.prototype={constructor:d,mutating:!1,acceptKey:function(a,b){var c=this.accept(a[b]);if(this.mutating){if(c&&!d.prototype[c.type])throw new j["default"]('Unexpected node type "'+c.type+'" found when accepting '+b+" on "+a.type);a[b]=c}},acceptRequired:function(a,b){if(this.acceptKey(a,b),!a[b])throw new j["default"](a.type+" requires "+b)},acceptArray:function(a){for(var b=0,c=a.length;c>b;b++)this.acceptKey(a,b),a[b]||(a.splice(b,1),b--,c--)},accept:function(a){if(a){if(!this[a.type])throw new j["default"]("Unknown type: "+a.type,a);this.current&&this.parents.unshift(this.current),this.current=a;var b=this[a.type](a);return this.current=this.parents.shift(),!this.mutating||b?b:b!==!1?a:void 0}},Program:function(a){this.acceptArray(a.body)},MustacheStatement:e,Decorator:e,BlockStatement:f,DecoratorBlock:f,PartialStatement:g,PartialBlockStatement:function(a){g.call(this,a),this.acceptKey(a,"program")},ContentStatement:function(){},CommentStatement:function(){},SubExpression:e,PathExpression:function(){},StringLiteral:function(){},NumberLiteral:function(){},BooleanLiteral:function(){},UndefinedLiteral:function(){},NullLiteral:function(){},Hash:function(a){this.acceptArray(a.pairs)},HashPair:function(a){this.acceptRequired(a,"value")}},b["default"]=d,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b){if(b=b.path?b.path.original:b,a.path.original!==b){var c={loc:a.path.loc};throw new q["default"](a.path.original+" doesn't match "+b,c)}}function e(a,b){this.source=a,this.start={line:b.first_line,column:b.first_column},this.end={line:b.last_line,column:b.last_column}}function f(a){return/^\[.*\]$/.test(a)?a.substr(1,a.length-2):a}function g(a,b){return{open:"~"===a.charAt(2),close:"~"===b.charAt(b.length-3)}}function h(a){return a.replace(/^\{\{~?\!-?-?/,"").replace(/-?-?~?\}\}$/,"")}function i(a,b,c){c=this.locInfo(c);for(var d=a?"@":"",e=[],f=0,g="",h=0,i=b.length;i>h;h++){var j=b[h].part,k=b[h].original!==j;if(d+=(b[h].separator||"")+j,k||".."!==j&&"."!==j&&"this"!==j)e.push(j);else{if(e.length>0)throw new q["default"]("Invalid path: "+d,{loc:c});".."===j&&(f++,g+="../")}}return{type:"PathExpression",data:a,depth:f,parts:e,original:d,loc:c}}function j(a,b,c,d,e,f){var g=d.charAt(3)||d.charAt(2),h="{"!==g&&"&"!==g,i=/\*/.test(d);return{type:i?"Decorator":"MustacheStatement",path:a,params:b,hash:c,escaped:h,strip:e,loc:this.locInfo(f)}}function k(a,b,c,e){d(a,c),e=this.locInfo(e);var f={type:"Program",body:b,strip:{},loc:e};return{type:"BlockStatement",path:a.path,params:a.params,hash:a.hash,program:f,openStrip:{},inverseStrip:{},closeStrip:{},loc:e}}function l(a,b,c,e,f,g){e&&e.path&&d(a,e);var h=/\*/.test(a.open);b.blockParams=a.blockParams;var i=void 0,j=void 0;if(c){if(h)throw new q["default"]("Unexpected inverse block on decorator",c);c.chain&&(c.program.body[0].closeStrip=e.strip),j=c.strip,i=c.program}return f&&(f=i,i=b,b=f),{type:h?"DecoratorBlock":"BlockStatement",path:a.path,params:a.params,hash:a.hash,program:b,inverse:i,openStrip:a.strip,inverseStrip:j,closeStrip:e&&e.strip,loc:this.locInfo(g)}}function m(a,b){if(!b&&a.length){var c=a[0].loc,d=a[a.length-1].loc;c&&d&&(b={source:c.source,start:{line:c.start.line,column:c.start.column},end:{line:d.end.line,column:d.end.column}})}return{type:"Program",body:a,strip:{},loc:b}}function n(a,b,c,e){return d(a,c),{type:"PartialBlockStatement",name:a.path,params:a.params,hash:a.hash,program:b,openStrip:a.strip,closeStrip:c&&c.strip,loc:this.locInfo(e)}}var o=c(1)["default"];b.__esModule=!0,b.SourceLocation=e,b.id=f,b.stripFlags=g,b.stripComment=h,b.preparePath=i,b.prepareMustache=j,b.prepareRawBlock=k,b.prepareBlock=l,b.prepareProgram=m,b.preparePartialBlock=n;var p=c(6),q=o(p)},function(a,b,c){"use strict";function d(){}function e(a,b,c){if(null==a||"string"!=typeof a&&"Program"!==a.type)throw new k["default"]("You must pass a string or Handlebars AST to Handlebars.precompile. You passed "+a);b=b||{},"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var d=c.parse(a,b),e=(new c.Compiler).compile(d,b);return(new c.JavaScriptCompiler).compile(e,b)}function f(a,b,c){function d(){var d=c.parse(a,b),e=(new c.Compiler).compile(d,b),f=(new c.JavaScriptCompiler).compile(e,b,void 0,!0);return c.template(f)}function e(a,b){return f||(f=d()),f.call(this,a,b)}if(void 0===b&&(b={}),null==a||"string"!=typeof a&&"Program"!==a.type)throw new k["default"]("You must pass a string or Handlebars AST to Handlebars.compile. You passed "+a);"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var f=void 0;return e._setup=function(a){return f||(f=d()),f._setup(a)},e._child=function(a,b,c,e){return f||(f=d()),f._child(a,b,c,e)},e}function g(a,b){if(a===b)return!0;if(l.isArray(a)&&l.isArray(b)&&a.length===b.length){for(var c=0;cc;c++){var d=this.opcodes[c],e=a.opcodes[c];if(d.opcode!==e.opcode||!g(d.args,e.args))return!1}b=this.children.length;for(var c=0;b>c;c++)if(!this.children[c].equals(a.children[c]))return!1;return!0},guid:0,compile:function(a,b){this.sourceNode=[],this.opcodes=[],this.children=[],this.options=b,this.stringParams=b.stringParams,this.trackIds=b.trackIds,b.blockParams=b.blockParams||[];var c=b.knownHelpers;if(b.knownHelpers={helperMissing:!0,blockHelperMissing:!0,each:!0,"if":!0,unless:!0,"with":!0,log:!0,lookup:!0},c)for(var d in c)d in c&&(b.knownHelpers[d]=c[d]);return this.accept(a)},compileProgram:function(a){var b=new this.compiler,c=b.compile(a,this.options),d=this.guid++;return this.usePartial=this.usePartial||c.usePartial,this.children[d]=c,this.useDepths=this.useDepths||c.useDepths,d},accept:function(a){if(!this[a.type])throw new k["default"]("Unknown type: "+a.type,a);this.sourceNode.unshift(a);var b=this[a.type](a);return this.sourceNode.shift(),b},Program:function(a){this.options.blockParams.unshift(a.blockParams);for(var b=a.body,c=b.length,d=0;c>d;d++)this.accept(b[d]);return this.options.blockParams.shift(),this.isSimple=1===c,this.blockParams=a.blockParams?a.blockParams.length:0,this},BlockStatement:function(a){h(a);var b=a.program,c=a.inverse;b=b&&this.compileProgram(b),c=c&&this.compileProgram(c);var d=this.classifySexpr(a);"helper"===d?this.helperSexpr(a,b,c):"simple"===d?(this.simpleSexpr(a),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("blockValue",a.path.original)):(this.ambiguousSexpr(a,b,c),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("ambiguousBlockValue")),this.opcode("append")},DecoratorBlock:function(a){var b=a.program&&this.compileProgram(a.program),c=this.setupFullMustacheParams(a,b,void 0),d=a.path;this.useDecorators=!0,this.opcode("registerDecorator",c.length,d.original)},PartialStatement:function(a){this.usePartial=!0;var b=a.program;b&&(b=this.compileProgram(a.program));var c=a.params;if(c.length>1)throw new k["default"]("Unsupported number of partial arguments: "+c.length,a);c.length||(this.options.explicitPartialContext?this.opcode("pushLiteral","undefined"):c.push({type:"PathExpression",parts:[],depth:0}));var d=a.name.original,e="SubExpression"===a.name.type;e&&this.accept(a.name),this.setupFullMustacheParams(a,b,void 0,!0);var f=a.indent||"";this.options.preventIndent&&f&&(this.opcode("appendContent",f),f=""),this.opcode("invokePartial",e,d,f),this.opcode("append")},PartialBlockStatement:function(a){this.PartialStatement(a)},MustacheStatement:function(a){this.SubExpression(a),a.escaped&&!this.options.noEscape?this.opcode("appendEscaped"):this.opcode("append")},Decorator:function(a){this.DecoratorBlock(a)},ContentStatement:function(a){a.value&&this.opcode("appendContent",a.value)},CommentStatement:function(){},SubExpression:function(a){h(a);var b=this.classifySexpr(a);"simple"===b?this.simpleSexpr(a):"helper"===b?this.helperSexpr(a):this.ambiguousSexpr(a)},ambiguousSexpr:function(a,b,c){var d=a.path,e=d.parts[0],f=null!=b||null!=c;this.opcode("getContext",d.depth),this.opcode("pushProgram",b),this.opcode("pushProgram",c),d.strict=!0,this.accept(d),this.opcode("invokeAmbiguous",e,f)},simpleSexpr:function(a){var b=a.path;b.strict=!0,this.accept(b),this.opcode("resolvePossibleLambda")},helperSexpr:function(a,b,c){var d=this.setupFullMustacheParams(a,b,c),e=a.path,f=e.parts[0];if(this.options.knownHelpers[f])this.opcode("invokeKnownHelper",d.length,f);else{if(this.options.knownHelpersOnly)throw new k["default"]("You specified knownHelpersOnly, but used the unknown helper "+f,a);e.strict=!0,e.falsy=!0,this.accept(e),this.opcode("invokeHelper",d.length,e.original,n["default"].helpers.simpleId(e))}},PathExpression:function(a){this.addDepth(a.depth),this.opcode("getContext",a.depth);var b=a.parts[0],c=n["default"].helpers.scopedId(a),d=!a.depth&&!c&&this.blockParamIndex(b);d?this.opcode("lookupBlockParam",d,a.parts):b?a.data?(this.options.data=!0,this.opcode("lookupData",a.depth,a.parts,a.strict)):this.opcode("lookupOnContext",a.parts,a.falsy,a.strict,c):this.opcode("pushContext")},StringLiteral:function(a){this.opcode("pushString",a.value)},NumberLiteral:function(a){this.opcode("pushLiteral",a.value)},BooleanLiteral:function(a){this.opcode("pushLiteral",a.value)},UndefinedLiteral:function(){this.opcode("pushLiteral","undefined")},NullLiteral:function(){this.opcode("pushLiteral","null")},Hash:function(a){var b=a.pairs,c=0,d=b.length;for(this.opcode("pushHash");d>c;c++)this.pushParam(b[c].value);for(;c--;)this.opcode("assignToHash",b[c].key);this.opcode("popHash")},opcode:function(a){this.opcodes.push({opcode:a,args:o.call(arguments,1),loc:this.sourceNode[0].loc})},addDepth:function(a){a&&(this.useDepths=!0)},classifySexpr:function(a){var b=n["default"].helpers.simpleId(a.path),c=b&&!!this.blockParamIndex(a.path.parts[0]),d=!c&&n["default"].helpers.helperExpression(a),e=!c&&(d||b);if(e&&!d){var f=a.path.parts[0],g=this.options;g.knownHelpers[f]?d=!0:g.knownHelpersOnly&&(e=!1)}return d?"helper":e?"ambiguous":"simple"},pushParams:function(a){for(var b=0,c=a.length;c>b;b++)this.pushParam(a[b])},pushParam:function(a){var b=null!=a.value?a.value:a.original||"";if(this.stringParams)b.replace&&(b=b.replace(/^(\.?\.\/)*/g,"").replace(/\//g,".")),a.depth&&this.addDepth(a.depth),this.opcode("getContext",a.depth||0),this.opcode("pushStringParam",b,a.type),"SubExpression"===a.type&&this.accept(a);else{if(this.trackIds){var c=void 0;if(!a.parts||n["default"].helpers.scopedId(a)||a.depth||(c=this.blockParamIndex(a.parts[0])),c){var d=a.parts.slice(1).join(".");this.opcode("pushId","BlockParam",c,d)}else b=a.original||b,b.replace&&(b=b.replace(/^this(?:\.|$)/,"").replace(/^\.\//,"").replace(/^\.$/,"")),this.opcode("pushId",a.type,b)}this.accept(a)}},setupFullMustacheParams:function(a,b,c,d){var e=a.params;return this.pushParams(e),this.opcode("pushProgram",b),this.opcode("pushProgram",c),a.hash?this.accept(a.hash):this.opcode("emptyHash",d),e},blockParamIndex:function(a){for(var b=0,c=this.options.blockParams.length;c>b;b++){var d=this.options.blockParams[b],e=d&&l.indexOf(d,a);if(d&&e>=0)return[b,e]}}}},function(a,b,c){"use strict";function d(a){this.value=a}function e(){}function f(a,b,c,d){var e=b.popStack(),f=0,g=c.length;for(a&&g--;g>f;f++)e=b.nameLookup(e,c[f],d);return a?[b.aliasable("container.strict"),"(",e,", ",b.quotedString(c[f]),")"]:e}var g=c(1)["default"];b.__esModule=!0;var h=c(4),i=c(6),j=g(i),k=c(5),l=c(29),m=g(l);e.prototype={nameLookup:function(a,b){return e.isValidJavaScriptVariableName(b)?[a,".",b]:[a,"[",JSON.stringify(b),"]"]},depthedLookup:function(a){return[this.aliasable("container.lookup"),'(depths, "',a,'")']},compilerInfo:function(){var a=h.COMPILER_REVISION,b=h.REVISION_CHANGES[a];return[a,b]},appendToBuffer:function(a,b,c){return k.isArray(a)||(a=[a]),a=this.source.wrap(a,b),this.environment.isSimple?["return ",a,";"]:c?["buffer += ",a,";"]:(a.appendToBuffer=!0,a)},initializeBuffer:function(){return this.quotedString("")},compile:function(a,b,c,d){this.environment=a,this.options=b,this.stringParams=this.options.stringParams,this.trackIds=this.options.trackIds,this.precompile=!d,this.name=this.environment.name,this.isChild=!!c,this.context=c||{decorators:[],programs:[],environments:[]},this.preamble(),this.stackSlot=0,this.stackVars=[],this.aliases={},this.registers={list:[]},this.hashes=[],this.compileStack=[],this.inlineStack=[],this.blockParams=[],this.compileChildren(a,b),this.useDepths=this.useDepths||a.useDepths||a.useDecorators||this.options.compat,this.useBlockParams=this.useBlockParams||a.useBlockParams;var e=a.opcodes,f=void 0,g=void 0,h=void 0,i=void 0;for(h=0,i=e.length;i>h;h++)f=e[h],this.source.currentLocation=f.loc,g=g||f.loc,this[f.opcode].apply(this,f.args);if(this.source.currentLocation=g,this.pushSource(""),this.stackSlot||this.inlineStack.length||this.compileStack.length)throw new j["default"]("Compile completed with content left on stack");this.decorators.isEmpty()?this.decorators=void 0:(this.useDecorators=!0,this.decorators.prepend("var decorators = container.decorators;\n"),this.decorators.push("return fn;"),d?this.decorators=Function.apply(this,["fn","props","container","depth0","data","blockParams","depths",this.decorators.merge()]):(this.decorators.prepend("function(fn, props, container, depth0, data, blockParams, depths) {\n"),this.decorators.push("}\n"),this.decorators=this.decorators.merge()));var k=this.createFunctionContext(d);if(this.isChild)return k;var l={compiler:this.compilerInfo(),main:k};this.decorators&&(l.main_d=this.decorators,l.useDecorators=!0);var m=this.context,n=m.programs,o=m.decorators;for(h=0,i=n.length;i>h;h++)n[h]&&(l[h]=n[h],o[h]&&(l[h+"_d"]=o[h],l.useDecorators=!0));return this.environment.usePartial&&(l.usePartial=!0),this.options.data&&(l.useData=!0),this.useDepths&&(l.useDepths=!0),this.useBlockParams&&(l.useBlockParams=!0),this.options.compat&&(l.compat=!0),d?l.compilerOptions=this.options:(l.compiler=JSON.stringify(l.compiler),this.source.currentLocation={start:{line:1,column:0}},l=this.objectLiteral(l),b.srcName?(l=l.toStringWithSourceMap({file:b.destName}),l.map=l.map&&l.map.toString()):l=l.toString()),l},preamble:function(){this.lastContext=0,this.source=new m["default"](this.options.srcName),this.decorators=new m["default"](this.options.srcName)},createFunctionContext:function(a){var b="",c=this.stackVars.concat(this.registers.list);c.length>0&&(b+=", "+c.join(", "));var d=0;for(var e in this.aliases){var f=this.aliases[e];this.aliases.hasOwnProperty(e)&&f.children&&f.referenceCount>1&&(b+=", alias"+ ++d+"="+e,f.children[0]="alias"+d)}var g=["container","depth0","helpers","partials","data"];(this.useBlockParams||this.useDepths)&&g.push("blockParams"),this.useDepths&&g.push("depths");var h=this.mergeSource(b);return a?(g.push(h),Function.apply(this,g)):this.source.wrap(["function(",g.join(","),") {\n ",h,"}"])},mergeSource:function(a){var b=this.environment.isSimple,c=!this.forceBuffer,d=void 0,e=void 0,f=void 0,g=void 0;return this.source.each(function(a){a.appendToBuffer?(f?a.prepend(" + "):f=a,g=a):(f&&(e?f.prepend("buffer += "):d=!0,g.add(";"),f=g=void 0),e=!0,b||(c=!1))}),c?f?(f.prepend("return "),g.add(";")):e||this.source.push('return "";'):(a+=", buffer = "+(d?"":this.initializeBuffer()),f?(f.prepend("return buffer + "),g.add(";")):this.source.push("return buffer;")),a&&this.source.prepend("var "+a.substring(2)+(d?"":";\n")),this.source.merge()},blockValue:function(a){var b=this.aliasable("helpers.blockHelperMissing"),c=[this.contextName(0)];this.setupHelperArgs(a,0,c);var d=this.popStack();c.splice(1,0,d),this.push(this.source.functionCall(b,"call",c))},ambiguousBlockValue:function(){var a=this.aliasable("helpers.blockHelperMissing"),b=[this.contextName(0)];this.setupHelperArgs("",0,b,!0),this.flushInline();var c=this.topStack();b.splice(1,0,c),this.pushSource(["if (!",this.lastHelper,") { ",c," = ",this.source.functionCall(a,"call",b),"}"])},appendContent:function(a){this.pendingContent?a=this.pendingContent+a:this.pendingLocation=this.source.currentLocation,this.pendingContent=a},append:function(){if(this.isInline())this.replaceStack(function(a){return[" != null ? ",a,' : ""']}),this.pushSource(this.appendToBuffer(this.popStack()));else{var a=this.popStack();this.pushSource(["if (",a," != null) { ",this.appendToBuffer(a,void 0,!0)," }"]),this.environment.isSimple&&this.pushSource(["else { ",this.appendToBuffer("''",void 0,!0)," }"])}},appendEscaped:function(){this.pushSource(this.appendToBuffer([this.aliasable("container.escapeExpression"),"(",this.popStack(),")"]))},getContext:function(a){this.lastContext=a},pushContext:function(){this.pushStackLiteral(this.contextName(this.lastContext))},lookupOnContext:function(a,b,c,d){var e=0;d||!this.options.compat||this.lastContext?this.pushContext():this.push(this.depthedLookup(a[e++])),this.resolvePath("context",a,e,b,c)},lookupBlockParam:function(a,b){this.useBlockParams=!0,this.push(["blockParams[",a[0],"][",a[1],"]"]),this.resolvePath("context",b,1)},lookupData:function(a,b,c){a?this.pushStackLiteral("container.data(data, "+a+")"):this.pushStackLiteral("data"),this.resolvePath("data",b,0,!0,c)},resolvePath:function(a,b,c,d,e){var g=this;if(this.options.strict||this.options.assumeObjects)return void this.push(f(this.options.strict&&e,this,b,a));for(var h=b.length;h>c;c++)this.replaceStack(function(e){var f=g.nameLookup(e,b[c],a);return d?[" && ",f]:[" != null ? ",f," : ",e]})},resolvePossibleLambda:function(){this.push([this.aliasable("container.lambda"),"(",this.popStack(),", ",this.contextName(0),")"])},pushStringParam:function(a,b){this.pushContext(),this.pushString(b),"SubExpression"!==b&&("string"==typeof a?this.pushString(a):this.pushStackLiteral(a))},emptyHash:function(a){this.trackIds&&this.push("{}"),this.stringParams&&(this.push("{}"),this.push("{}")),this.pushStackLiteral(a?"undefined":"{}")},pushHash:function(){this.hash&&this.hashes.push(this.hash),this.hash={values:[],types:[],contexts:[],ids:[]}},popHash:function(){var a=this.hash;this.hash=this.hashes.pop(),this.trackIds&&this.push(this.objectLiteral(a.ids)),this.stringParams&&(this.push(this.objectLiteral(a.contexts)),this.push(this.objectLiteral(a.types))),this.push(this.objectLiteral(a.values))},pushString:function(a){this.pushStackLiteral(this.quotedString(a))},pushLiteral:function(a){this.pushStackLiteral(a)},pushProgram:function(a){null!=a?this.pushStackLiteral(this.programExpression(a)):this.pushStackLiteral(null)},registerDecorator:function(a,b){var c=this.nameLookup("decorators",b,"decorator"),d=this.setupHelperArgs(b,a);this.decorators.push(["fn = ",this.decorators.functionCall(c,"",["fn","props","container",d])," || fn;"])},invokeHelper:function(a,b,c){var d=this.popStack(),e=this.setupHelper(a,b),f=c?[e.name," || "]:"",g=["("].concat(f,d);this.options.strict||g.push(" || ",this.aliasable("helpers.helperMissing")),g.push(")"),this.push(this.source.functionCall(g,"call",e.callParams))},invokeKnownHelper:function(a,b){var c=this.setupHelper(a,b);this.push(this.source.functionCall(c.name,"call",c.callParams))},invokeAmbiguous:function(a,b){this.useRegister("helper");var c=this.popStack();this.emptyHash();var d=this.setupHelper(0,a,b),e=this.lastHelper=this.nameLookup("helpers",a,"helper"),f=["(","(helper = ",e," || ",c,")"];this.options.strict||(f[0]="(helper = ",f.push(" != null ? helper : ",this.aliasable("helpers.helperMissing"))),this.push(["(",f,d.paramsInit?["),(",d.paramsInit]:[],"),","(typeof helper === ",this.aliasable('"function"')," ? ",this.source.functionCall("helper","call",d.callParams)," : helper))"])},invokePartial:function(a,b,c){var d=[],e=this.setupParams(b,1,d);a&&(b=this.popStack(),delete e.name),c&&(e.indent=JSON.stringify(c)),e.helpers="helpers",e.partials="partials",e.decorators="container.decorators",a?d.unshift(b):d.unshift(this.nameLookup("partials",b,"partial")),this.options.compat&&(e.depths="depths"),e=this.objectLiteral(e), +d.push(e),this.push(this.source.functionCall("container.invokePartial","",d))},assignToHash:function(a){var b=this.popStack(),c=void 0,d=void 0,e=void 0;this.trackIds&&(e=this.popStack()),this.stringParams&&(d=this.popStack(),c=this.popStack());var f=this.hash;c&&(f.contexts[a]=c),d&&(f.types[a]=d),e&&(f.ids[a]=e),f.values[a]=b},pushId:function(a,b,c){"BlockParam"===a?this.pushStackLiteral("blockParams["+b[0]+"].path["+b[1]+"]"+(c?" + "+JSON.stringify("."+c):"")):"PathExpression"===a?this.pushString(b):"SubExpression"===a?this.pushStackLiteral("true"):this.pushStackLiteral("null")},compiler:e,compileChildren:function(a,b){for(var c=a.children,d=void 0,e=void 0,f=0,g=c.length;g>f;f++){d=c[f],e=new this.compiler;var h=this.matchExistingProgram(d);null==h?(this.context.programs.push(""),h=this.context.programs.length,d.index=h,d.name="program"+h,this.context.programs[h]=e.compile(d,b,this.context,!this.precompile),this.context.decorators[h]=e.decorators,this.context.environments[h]=d,this.useDepths=this.useDepths||e.useDepths,this.useBlockParams=this.useBlockParams||e.useBlockParams):(d.index=h,d.name="program"+h,this.useDepths=this.useDepths||d.useDepths,this.useBlockParams=this.useBlockParams||d.useBlockParams)}},matchExistingProgram:function(a){for(var b=0,c=this.context.environments.length;c>b;b++){var d=this.context.environments[b];if(d&&d.equals(a))return b}},programExpression:function(a){var b=this.environment.children[a],c=[b.index,"data",b.blockParams];return(this.useBlockParams||this.useDepths)&&c.push("blockParams"),this.useDepths&&c.push("depths"),"container.program("+c.join(", ")+")"},useRegister:function(a){this.registers[a]||(this.registers[a]=!0,this.registers.list.push(a))},push:function(a){return a instanceof d||(a=this.source.wrap(a)),this.inlineStack.push(a),a},pushStackLiteral:function(a){this.push(new d(a))},pushSource:function(a){this.pendingContent&&(this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent),this.pendingLocation)),this.pendingContent=void 0),a&&this.source.push(a)},replaceStack:function(a){var b=["("],c=void 0,e=void 0,f=void 0;if(!this.isInline())throw new j["default"]("replaceStack on non-inline");var g=this.popStack(!0);if(g instanceof d)c=[g.value],b=["(",c],f=!0;else{e=!0;var h=this.incrStack();b=["((",this.push(h)," = ",g,")"],c=this.topStack()}var i=a.call(this,c);f||this.popStack(),e&&this.stackSlot--,this.push(b.concat(i,")"))},incrStack:function(){return this.stackSlot++,this.stackSlot>this.stackVars.length&&this.stackVars.push("stack"+this.stackSlot),this.topStackName()},topStackName:function(){return"stack"+this.stackSlot},flushInline:function(){var a=this.inlineStack;this.inlineStack=[];for(var b=0,c=a.length;c>b;b++){var e=a[b];if(e instanceof d)this.compileStack.push(e);else{var f=this.incrStack();this.pushSource([f," = ",e,";"]),this.compileStack.push(f)}}},isInline:function(){return this.inlineStack.length},popStack:function(a){var b=this.isInline(),c=(b?this.inlineStack:this.compileStack).pop();if(!a&&c instanceof d)return c.value;if(!b){if(!this.stackSlot)throw new j["default"]("Invalid stack pop");this.stackSlot--}return c},topStack:function(){var a=this.isInline()?this.inlineStack:this.compileStack,b=a[a.length-1];return b instanceof d?b.value:b},contextName:function(a){return this.useDepths&&a?"depths["+a+"]":"depth"+a},quotedString:function(a){return this.source.quotedString(a)},objectLiteral:function(a){return this.source.objectLiteral(a)},aliasable:function(a){var b=this.aliases[a];return b?(b.referenceCount++,b):(b=this.aliases[a]=this.source.wrap(a),b.aliasable=!0,b.referenceCount=1,b)},setupHelper:function(a,b,c){var d=[],e=this.setupHelperArgs(b,a,d,c),f=this.nameLookup("helpers",b,"helper"),g=this.aliasable(this.contextName(0)+" != null ? "+this.contextName(0)+" : {}");return{params:d,paramsInit:e,name:f,callParams:[g].concat(d)}},setupParams:function(a,b,c){var d={},e=[],f=[],g=[],h=!c,i=void 0;h&&(c=[]),d.name=this.quotedString(a),d.hash=this.popStack(),this.trackIds&&(d.hashIds=this.popStack()),this.stringParams&&(d.hashTypes=this.popStack(),d.hashContexts=this.popStack());var j=this.popStack(),k=this.popStack();(k||j)&&(d.fn=k||"container.noop",d.inverse=j||"container.noop");for(var l=b;l--;)i=this.popStack(),c[l]=i,this.trackIds&&(g[l]=this.popStack()),this.stringParams&&(f[l]=this.popStack(),e[l]=this.popStack());return h&&(d.args=this.source.generateArray(c)),this.trackIds&&(d.ids=this.source.generateArray(g)),this.stringParams&&(d.types=this.source.generateArray(f),d.contexts=this.source.generateArray(e)),this.options.data&&(d.data="data"),this.useBlockParams&&(d.blockParams="blockParams"),d},setupHelperArgs:function(a,b,c,d){var e=this.setupParams(a,b,c);return e=this.objectLiteral(e),d?(this.useRegister("options"),c.push("options"),["options=",e]):c?(c.push(e),""):e}},function(){for(var a="break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public let yield await null true false".split(" "),b=e.RESERVED_WORDS={},c=0,d=a.length;d>c;c++)b[a[c]]=!0}(),e.isValidJavaScriptVariableName=function(a){return!e.RESERVED_WORDS[a]&&/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(a)},b["default"]=e,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b,c){if(f.isArray(a)){for(var d=[],e=0,g=a.length;g>e;e++)d.push(b.wrap(a[e],c));return d}return"boolean"==typeof a||"number"==typeof a?a+"":a}function e(a){this.srcFile=a,this.source=[]}b.__esModule=!0;var f=c(5),g=void 0;try{}catch(h){}g||(g=function(a,b,c,d){this.src="",d&&this.add(d)},g.prototype={add:function(a){f.isArray(a)&&(a=a.join("")),this.src+=a},prepend:function(a){f.isArray(a)&&(a=a.join("")),this.src=a+this.src},toStringWithSourceMap:function(){return{code:this.toString()}},toString:function(){return this.src}}),e.prototype={isEmpty:function(){return!this.source.length},prepend:function(a,b){this.source.unshift(this.wrap(a,b))},push:function(a,b){this.source.push(this.wrap(a,b))},merge:function(){var a=this.empty();return this.each(function(b){a.add([" ",b,"\n"])}),a},each:function(a){for(var b=0,c=this.source.length;c>b;b++)a(this.source[b])},empty:function(){var a=this.currentLocation||{start:{}};return new g(a.start.line,a.start.column,this.srcFile)},wrap:function(a){var b=arguments.length<=1||void 0===arguments[1]?this.currentLocation||{start:{}}:arguments[1];return a instanceof g?a:(a=d(a,this,b),new g(b.start.line,b.start.column,this.srcFile,a))},functionCall:function(a,b,c){return c=this.generateList(c),this.wrap([a,b?"."+b+"(":"(",c,")"])},quotedString:function(a){return'"'+(a+"").replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")+'"'},objectLiteral:function(a){var b=[];for(var c in a)if(a.hasOwnProperty(c)){var e=d(a[c],this);"undefined"!==e&&b.push([this.quotedString(c),":",e])}var f=this.generateList(b);return f.prepend("{"),f.add("}"),f},generateList:function(a){for(var b=this.empty(),c=0,e=a.length;e>c;c++)c&&b.add(","),b.add(d(a[c],this));return b},generateArray:function(a){var b=this.generateList(a);return b.prepend("["),b.add("]"),b}},b["default"]=e,a.exports=b["default"]}])}); \ No newline at end of file diff --git a/backend/public/apidoc/vendor/jquery.min.js b/backend/public/apidoc/vendor/jquery.min.js new file mode 100644 index 00000000..349030de --- /dev/null +++ b/backend/public/apidoc/vendor/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v2.2.1 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.1",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!k.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c}catch(e){}O.set(a,b,c); +}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length",""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|&#?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.rnamespace||a.rnamespace.test(g.namespace))&&(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,la=/\s*$/g;function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}O.hasData(a)&&(h=O.access(a),i=n.extend({},h),O.set(b,i))}}function ta(a,b){var c=b.nodeName.toLowerCase();"input"===c&&X.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function ua(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;o>m;m++)j=e,m!==p&&(j=n.clone(j,!0,!0),i&&n.merge(h,_(j,"script"))),c.call(a[m],j,m);if(i)for(k=h[h.length-1].ownerDocument,n.map(h,ra),m=0;i>m;m++)j=h[m],Z.test(j.type||"")&&!N.access(j,"globalEval")&&n.contains(k,j)&&(j.src?n._evalUrl&&n._evalUrl(j.src):n.globalEval(j.textContent.replace(oa,"")))}return a}function va(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(_(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&aa(_(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;e>d;d++)ta(f[d],g[d]);if(b)if(c)for(f=f||_(a),g=g||_(h),d=0,e=f.length;e>d;d++)sa(f[d],g[d]);else sa(a,h);return g=_(h,"script"),g.length>0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(_(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ua(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(_(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),n(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var wa,xa={HTML:"block",BODY:"block"};function ya(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function za(a){var b=d,c=xa[a];return c||(c=ya(a,b),"none"!==c&&c||(wa=(wa||n("