diff --git a/app/Search.php b/app/Search.php
index 2d65413c..096a99f6 100644
--- a/app/Search.php
+++ b/app/Search.php
@@ -6,6 +6,7 @@ use App\Item;
use App\Setting;
use Form;
use Cache;
+use Yaml;
abstract class Search
{
@@ -19,7 +20,7 @@ abstract class Search
{
$providers = self::standardProviders();
$providers = $providers + self::appProviders();
- return $providers;
+ return collect($providers);
}
/**
@@ -41,38 +42,16 @@ abstract class Search
*/
public static function standardProviders()
{
- return [
- 'google' => [
- 'url' => 'https://www.google.com/search',
- 'var' => 'q',
- 'method' => 'get',
- 'type' => 'standard',
- ],
- 'ddg' => [
- 'url' => 'https://duckduckgo.com/',
- 'var' => 'q',
- 'method' => 'get',
- 'type' => 'standard',
- ],
- 'bing' => [
- 'url' => 'https://www.bing.com/search',
- 'var' => 'q',
- 'method' => 'get',
- 'type' => 'standard',
- ],
- 'qwant' => [
- 'url' => 'https://www.qwant.com/',
- 'var' => 'q',
- 'method' => 'get',
- 'type' => 'standard',
- ],
- 'startpage' => [
- 'url' => 'https://www.startpage.com/do/dsearch',
- 'var' => 'query',
- 'method' => 'get',
- 'type' => 'standard',
- ],
- ];
+ // $providers = json_decode(file_get_contents(storage_path('app/searchproviders.json')));
+ // print_r($providers);
+ $providers = Yaml::parseFile(storage_path('app/searchproviders.yaml'));
+ $all = [];
+ foreach($providers as $key => $provider) {
+ $all[$key] = $provider;
+ $all[$key]['type'] = 'standard';
+ }
+
+ return $all;
}
/**
@@ -90,10 +69,11 @@ abstract class Search
if(($provider = Item::isSearchProvider($app->class)) !== false) {
$name = Item::nameFromClass($app->class);
$providers[$app->id] = [
+ 'id' => $app->id,
'type' => $provider->type,
'class' => $app->class,
'url' => $app->url,
- 'title' => $app->title,
+ 'name' => $app->title,
'colour' => $app->colour,
'icon' => $app->icon,
'description' => $app->description
@@ -133,12 +113,8 @@ abstract class Search
$output .= '
';
$output .= '
';
$output .= Form::text('q', null, ['class' => 'homesearch', 'autofocus' => 'autofocus', 'placeholder' => __('app.settings.search').'...']);
diff --git a/app/Setting.php b/app/Setting.php
index 2df15b10..7264d367 100644
--- a/app/Setting.php
+++ b/app/Setting.php
@@ -74,6 +74,9 @@ class Setting extends Model
case 'select':
if(!empty($this->value) && $this->value !== 'none') {
$options = (array)json_decode($this->options);
+ if($this->key === 'search_provider') {
+ $options = Search::providers()->pluck('name', 'id')->toArray();
+ }
$value = __($options[$this->value]);
} else {
$value = __('app.options.none');
@@ -122,6 +125,9 @@ class Setting extends Model
break;
case 'select':
$options = json_decode($this->options);
+ if($this->key === 'search_provider') {
+ $options = Search::providers()->pluck('name', 'id');
+ }
foreach($options as $key => $opt) {
$options->$key = __($opt);
}
diff --git a/composer.json b/composer.json
index eea5e492..fafd8500 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,8 @@
"laravel/framework": "^7.0",
"laravel/tinker": "^2.0",
"laravel/ui": "^2.4",
- "laravelcollective/html": "^6.0"
+ "laravelcollective/html": "^6.0",
+ "symfony/yaml": "^5.4"
},
"require-dev": {
"filp/whoops": "~2.0",
diff --git a/composer.lock b/composer.lock
index 9cf5f08f..43086ecf 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "7c2e9180811d1213f10aedcef74bf8dd",
+ "content-hash": "d613105a42b9bb713b2dbc3073bebdc8",
"packages": [
{
"name": "brick/math",
@@ -5925,6 +5925,81 @@
],
"time": "2022-03-02T12:42:23+00:00"
},
+ {
+ "name": "symfony/yaml",
+ "version": "v5.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "e80f87d2c9495966768310fc531b487ce64237a2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/e80f87d2c9495966768310fc531b487ce64237a2",
+ "reference": "e80f87d2c9495966768310fc531b487ce64237a2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "symfony/console": "<5.3"
+ },
+ "require-dev": {
+ "symfony/console": "^5.3|^6.0"
+ },
+ "suggest": {
+ "symfony/console": "For validating YAML files using the lint command"
+ },
+ "bin": [
+ "Resources/bin/yaml-lint"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Loads and dumps YAML files",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/yaml/tree/v5.4.3"
+ },
+ "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-01-26T16:32:32+00:00"
+ },
{
"name": "tijsverkoyen/css-to-inline-styles",
"version": "2.2.4",
@@ -8076,8 +8151,8 @@
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
- "php": ">=7.1.3"
+ "php": ">=7.2.5"
},
"platform-dev": [],
- "plugin-api-version": "2.2.0"
+ "plugin-api-version": "2.1.0"
}
diff --git a/config/app.php b/config/app.php
index cced8f1d..93611e0a 100644
--- a/config/app.php
+++ b/config/app.php
@@ -228,6 +228,7 @@ return [
'URL' => Illuminate\Support\Facades\URL::class,
'Validator' => Illuminate\Support\Facades\Validator::class,
'View' => Illuminate\Support\Facades\View::class,
+ 'Yaml' => Symfony\Component\Yaml\Yaml::class,
'SupportedApps' => App\SupportedApps::class,
'EnhancedApps' => App\EnhancedApps::class,
diff --git a/public/css/app.css b/public/css/app.css
index 0a5b9ccc..940060ef 100644
--- a/public/css/app.css
+++ b/public/css/app.css
@@ -1,4 +1,1891 @@
-/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-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{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}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{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{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-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}body{background:#cfd2d4}#switchuser{background:rgba(0,0,0,.5);position:absolute;padding:10px;color:#fff;text-align:center;bottom:0;left:0;display:flex;flex-direction:column;justify-content:center;align-items:center;border-top:2px solid hsla(0,0%,100%,.15);border-right:2px solid hsla(0,0%,100%,.15);box-shadow:0 0 10px 0 rgba(0,0,0,.4);border-radius:0 9px 0 0;line-height:1.5;font-size:14px}#switchuser img{width:50px;margin-bottom:5px;border-radius:50%}#switchuser .btn{font-size:13px;color:#fff;text-decoration:none;margin:8px -10px -10px;border-radius:0;width:calc(100% + 22px);background:hsla(0,0%,100%,.15);transition:all .35s ease-in-out}#switchuser .btn:hover{background:#d64d55}#app{min-height:100vh;background-image:url(../img/bg1.jpg);background-repeat:no-repeat;background-size:cover;background-position:bottom}#app,#app nav{display:flex;flex-direction:column}#app nav{height:100%;position:absolute;width:340px;left:-340px;transition:all .35s ease-in-out;background:rgba(0,0,0,.7);color:#fff;z-index:2}#app .content{flex-grow:1;display:flex;flex-direction:column}#app .content .appheader{background:rgba(0,0,0,.4);text-align:center;position:absolute;height:58px;width:100%;top:-58px;transition:all .35s ease-in-out;z-index:1}#app .content .appheader ul{display:inline-block;list-style:none;height:58px;border-left:1px solid rgba(0,0,0,.6);border-right:1px solid hsla(0,0%,100%,.1);margin:0;padding:0}#app .content .appheader li{display:inline-block;border-right:1px solid rgba(0,0,0,.6);border-left:1px solid hsla(0,0%,100%,.1)}#app .content .appheader a{display:inline-block;color:#fff;text-decoration:none;padding:20px}#app main{flex-direction:column}#app #sortable,#app main{padding:30px 10px;display:flex;justify-content:center;align-items:center;flex:1;position:relative;flex-wrap:wrap;align-content:center;list-style:none;margin:0}#config-buttons{position:fixed;bottom:0;right:0;display:flex;flex-direction:column}#config-buttons a{width:50px;height:50px;background:rgba(0,0,0,.8);text-align:center;line-height:50px;color:#fff;margin-top:1px}#config-buttons a img{width:26px;height:26px;margin-top:12px}.userlist,.userlist .user{display:flex;justify-content:center;align-items:center}.userlist .user{background:rgba(0,0,0,.5);padding:15px;flex-direction:column;margin:20px;color:#fff;text-decoration:none;border-radius:15px;border:5px solid hsla(0,0%,100%,.7);box-shadow:0 0 10px 0 rgba(0,0,0,.4)}.userlist .user-img{width:130px;height:130px;border-radius:50%;margin:10px 10px 15px}.userlist #password{color:#2f313a;width:100%;padding:5px 10px;margin:15px -5px}.userlist .btn{width:100%}.userlist .forgot{color:#fff;font-size:12px;margin-top:25px}.item-container{position:relative}.item-container .item-edit{color:#fff;position:absolute;bottom:20px;left:8px;width:30px;height:30px;background:rgba(0,0,0,.7);border-radius:50%;text-align:center;line-height:30px;display:none}.black{color:#000!important}.white{color:#fff!important}.message-container,.message-container2{width:100%;padding:10px 20px}.alert{margin:30px auto;text-align:center;max-width:800px;background:#f1f4f7;display:flex;justify-content:center;padding:5px 20px 5px 80px;box-shadow:0 0 15px 3px rgba(0,0,0,.3)}.alert.alert-danger,.alert.alert-success{position:relative}.alert.alert-danger:before,.alert.alert-success:before{content:"\F00C";font-family:Font Awesome\ 5 Pro;font-weight:900;position:absolute;top:0;left:0;bottom:0;width:60px;background:#0eb584;text-align:center;color:#fff;line-height:57px;font-size:24px;align-items:center;justify-content:center;display:flex}.alert.alert-danger:before{content:"\F00D";background:#d64d55}.alert a{color:#91a1b3}#app.header .add-item,#app.header .item{transform:scale(.9);opacity:.8;margin:20px 0}#app.sidebar nav{left:0}.add-item{width:280px;height:90px;margin:20px;flex:0 0 280px;border-radius:6px;padding:20px;border:4px dashed hsla(0,0%,100%,.7);box-shadow:0 0 20px 2px rgba(0,0,0,.3);color:#fff;overflow:hidden;position:relative;display:none;outline:1px solid transparent}.add-item.active,.add-item a{display:block}.add-item a{width:100%;text-align:center;line-height:40px;color:#fff;font-size:19px}.item{width:280px;height:90px;margin:20px;flex:0 0 280px;background-image:linear-gradient(90deg,hsla(0,0%,100%,0),hsla(0,0%,100%,.25));border-radius:6px;padding:15px 55px 15px 15px;color:#fff;overflow:hidden;position:relative;transition:all .35s ease-in-out;outline:1px solid transparent;display:flex;align-items:center;border:1px solid #4a4a4a;border:1px solid rgba(76,76,76,.4);-webkit-background-clip:padding-box;background-clip:padding-box}.item:after{content:"";width:90px;height:90px;border-radius:50%;position:absolute;right:-48px;top:0;background:hsla(0,0%,100%,.1);box-shadow:0 0 40px 0 rgba(0,0,0,.2)}.item .link{position:absolute;right:0;top:0;height:100%;width:100%;text-align:right;line-height:90px;color:#fff;font-size:24px;z-index:1;padding-right:10px}.item .title{font-size:16px}.item .details{width:100%}.text-center{text-align:center!important}.module-container{box-shadow:0 0 10px 0 rgba(0,0,0,.4);border:1px solid #cdced8;background:#f9fafd;max-width:1000px;width:100%;margin:10px 40px;border-radius:5px;overflow:hidden}.module-container footer,.module-container header{display:flex;justify-content:space-between;align-items:center;border-top:1px solid #fff;background:#f2f3f6;font-size:16px;border-bottom:1px solid #dbdce3;height:60px;position:relative}.module-container footer .section-title,.module-container header .section-title{font-size:18px;color:#5b5b5b;margin-left:25px}.module-container footer{border-top:1px solid #dbdce3}.module-container .table{width:100%;margin:0;background:#fff}.module-container .table thead th{background:#f2f3f6;color:#767d94;border-top:1px solid #fff;text-align:left;font-size:13px;text-transform:uppercase;padding:15px 25px}.module-container .table tbody tr:hover{background:#fefbf2}.module-container .table tbody tr:hover td:first-child{position:relative}.module-container .table tbody tr:hover td:first-child:before{content:"";position:absolute;top:0;left:0;bottom:0;width:5px;background:#0eb584}.module-container .table tbody td{padding:20px 25px;font-size:13px;color:#2f313a;max-width:500px;word-break:break-word}.module-container .table tbody td.form-error{background:#e69191;color:#fff;text-align:center}.module-container .table tbody a{color:#2f313a}.homesearch{height:51px}.toggleinput{display:flex;flex-direction:column-reverse;line-height:1;font-size:9px;font-weight:400;text-transform:uppercase;color:#ababab;padding:0 20px}.toggleinput label.name{margin-top:6px}.module-actions{display:flex;justify-content:space-between;align-items:center}.module-actions .button{font-size:18px;color:#515564;padding:0 10px;border:none;border-left:1px solid #cdced8;display:flex;line-height:1;position:relative;background:transparent;flex-direction:column;justify-content:center;align-items:center;min-width:65px;height:60px;text-decoration:none;box-sizing:border-box}.module-actions .button:after{position:absolute;content:"";top:0;left:0;bottom:0;border-right:1px solid #fff}.module-actions .button span{display:inline-block;line-height:1;font-size:9px;font-weight:400;text-transform:uppercase;color:#ababab;position:relative;top:4px;margin:0}div.create{padding:30px 15px;display:flex;flex-wrap:wrap}div.create .input{width:280px;margin:20px}div.create .input label:not(.switch){width:100%;font-size:13px;color:#9094a5;margin-bottom:15px;display:block;font-weight:300}div.create .input input,div.create .input select{width:100%;border:1px solid #dedfe2;padding:10px;border-radius:6px}.app-icon{max-width:60px;margin-right:15px}.sidenav{position:relative}.sidenav .close-sidenav{position:absolute;top:20px;right:20px;font-size:24px;color:#ccc}.sidenav h2{font-weight:300;padding:20px;margin:0}.sidenav ul{list-style:none;margin:0;padding:20px}.sidenav ul li{display:flex;justify-content:space-between;padding:5px}.sidenav ul li a{color:#2b3542}.sidenav ul li a.active{color:#46b0e6}.trashed{font-size:11px;color:#91a1b3;margin-left:20px}.switch{position:relative;display:inline-block;width:36px;height:20px}.switch input{display:none}.slider{cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#4a556b}.slider,.slider:before{position:absolute;transition:.4s}.slider:before{content:"";height:14px;width:14px;left:3px;bottom:3px;background-color:#fff}input:checked+.slider{background-color:#2196f3}input:focus+.slider{box-shadow:0 0 1px #2196f3}input:checked+.slider:before{transform:translateX(16px)}.slider.round{border-radius:20px}.slider.round:before{border-radius:50%}@-webkit-keyframes autofill{to{background:#f5f5f5;color:#2f313a;font-weight:700}}@keyframes autofill{to{background:#f5f5f5;color:#2f313a;font-weight:700}}input:-webkit-autofill{-webkit-animation-name:autofill;-webkit-animation-fill-mode:both}input:autofill{-webkit-animation-name:autofill;animation-name:autofill;-webkit-animation-fill-mode:both;animation-fill-mode:both}button.link{border:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent}a.settinglink{color:#2f313a;font-size:13px;margin:15px 5px;display:inline-block;font-weight:700}.setting-view-image{margin-bottom:20px;display:inline-block}.setting-view-image img{max-width:330px}.searchform{display:flex;align-self:flex-start;text-align:center;margin:50px auto;padding:14px;background:rgba(0,0,0,.2);border-radius:14px;box-shadow:inset 0 1px 6px 0 rgba(0,0,0,.3);border-top:1px solid rgba(0,0,0,.5);border-bottom:1px solid hsla(0,0%,100%,.35);position:relative;width:100%;max-width:620px}.searchform form{width:100%}.searchform .input-container{background:#fff;border-radius:5px;box-shadow:0 0 5px 0 rgba(0,0,0,.4);overflow:hidden;position:relative;display:flex}.searchform input{padding:17px 15px;font-size:15px;border:0;width:100%;background:transparent}.searchform button{position:absolute;right:0;top:0;border:none;font-size:16px;padding:7px 15px;line-height:38px;font-weight:500;border-top-right-radius:5px;border-bottom-right-radius:5px;color:#fff;text-transform:uppercase;background:#d64d55}.searchform select{padding:0 10px;background:#f5f5f5;border:none;border-right:1px solid #ddd}.ui-autocomplete{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;padding:4px 0;margin:0 0 10px 25px;list-style:none;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:5px;box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px}.ui-menu-item{display:block;padding:3px 15px;clear:both;font-weight:400;line-height:18px;color:#555;white-space:nowrap;text-decoration:none}.ui-state-active,.ui-state-hover{font-weight:700}#appimage img{max-width:95px}#sapconfig,.newblock{display:none;width:100%}#sapconfig h2,.newblock h2{background:#f2f3f6;padding:2px 25px;height:60px;margin-left:-15px;width:calc(100% + 30px);border-top:1px solid #dbdce3;border-bottom:1px solid #dbdce3;font-size:18px;color:#5b5b5b;font-weight:500;display:flex;justify-content:space-between;align-items:center}#sapconfig .items,.newblock .items{display:flex}hr{margin:23px 0 18px;height:0;border-style:none;border-width:0;border-top:1px solid #eaeaea;border-bottom:1px solid #fff}.upload-btn-wrapper{position:relative;overflow:hidden;display:inline-block}.btn{border:none;background-color:#d64d55;padding:8px 12px;border-radius:8px}.btn,.btn.test{color:#fff;font-size:16px}.btn.test{font-weight:500;border-top-right-radius:5px;border-bottom-right-radius:5px;text-transform:uppercase;padding:8px 50px;background:#207774}.upload-btn-wrapper input[type=file]{font-size:100px;position:absolute;left:0;top:0;opacity:0}.icon-container{display:flex;align-items:center}.icon-container img{margin-right:15px}.ui-helper-hidden-accessible{display:none}.livestats-container .livestats{margin:5px 0 0;padding:0;display:flex;list-style:none;justify-content:space-between;width:100%}.livestats-container .livestats span{display:block;text-transform:uppercase;font-size:11px;font-weight:500;opacity:.5;line-height:1;display:flex;text-align:left}.livestats-container .livestats strong{display:block;line-height:1;display:flex;align-items:center;color:#fff;font-size:12px;line-height:1.2}.livestats-container .livestats strong span{margin-left:4px}.livestats-container .livestats li{text-align:center;margin:0;line-height:1}.livestats-container .livestats li.right{text-align:right}.livestats-container .livestats li.right span{justify-content:flex-end}.livestats-container .livestats.flexcolumn{flex-direction:column}.livestats-container.black .livestats strong{color:#000}input:-webkit-autofill,input:-webkit-autofill:focus input:-webkit-autofill,input:-webkit-autofill:hover,select:-webkit-autofill,select:-webkit-autofill:focus,select:-webkit-autofill:hover,textarea:-webkit-autofill,textarea:-webkit-autofill:hover textarea:-webkit-autofill:focus{border:inherit;-webkit-text-fill-color:inherit;-webkit-box-shadow:inherit;transition:inherit;color:#2f313a!important}.title-marquee{width:125px;overflow:hidden;display:flex;align-items:flex-start;margin-top:2px}.title-marquee>span,.title-marquee>strong{white-space:nowrap;transform:translate(0);-webkit-animation:marquee 8s linear;animation:marquee 8s linear}.no-marquee .title,.title-marquee .title{margin-right:4px}@-webkit-keyframes marquee{0%{transform:translate(0)}20%{transform:translate(0)}95%{transform:translate(-200%)}to{transform:translate(-200%)}}@keyframes marquee{0%{transform:translate(0)}20%{transform:translate(0)}95%{transform:translate(-200%)}to{transform:translate(-200%)}}
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
+html {
+ font-family: sans-serif;
+ -ms-text-size-adjust: 100%;
+ -webkit-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: bold;
+}
+
+dfn {
+ font-style: italic;
+}
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+mark {
+ background: #ff0;
+ color: #000;
+}
+
+small {
+ font-size: 80%;
+}
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+img {
+ border: 0;
+}
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+figure {
+ margin: 1em 40px;
+}
+
+hr {
+ box-sizing: content-box;
+ height: 0;
+}
+
+pre {
+ overflow: auto;
+}
+
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ color: inherit;
+ font: inherit;
+ margin: 0;
+}
+
+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 {
+ border: 0;
+ padding: 0;
+}
+
+input {
+ line-height: normal;
+}
+
+input[type=checkbox],
+input[type=radio] {
+ 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-appearance: textfield;
+ box-sizing: content-box;
+}
+
+input[type=search]::-webkit-search-cancel-button,
+input[type=search]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+
+legend {
+ border: 0;
+ padding: 0;
+}
+
+textarea {
+ overflow: auto;
+}
+
+optgroup {
+ font-weight: bold;
+}
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+td,
+th {
+ padding: 0;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+*, *:before, *:after {
+ box-sizing: inherit;
+}
+
+body {
+ background: #cfd2d4;
+}
+
+#switchuser {
+ background: rgba(0, 0, 0, 0.5);
+ position: absolute;
+ padding: 10px;
+ color: white;
+ text-align: center;
+ bottom: 0;
+ left: 0;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ border-top: 2px solid rgba(255, 255, 255, 0.15);
+ border-right: 2px solid rgba(255, 255, 255, 0.15);
+ box-shadow: 0 0 10px 0px rgba(0, 0, 0, 0.4);
+ border-radius: 0 9px 0 0;
+ line-height: 1.5;
+ font-size: 14px;
+}
+#switchuser img {
+ width: 50px;
+ margin-bottom: 5px;
+ border-radius: 50%;
+}
+#switchuser .btn {
+ font-size: 13px;
+ color: white;
+ text-decoration: none;
+ margin-left: -10px;
+ margin-right: -10px;
+ margin-bottom: -10px;
+ margin-top: 8px;
+ border-radius: 0;
+ width: calc(100% + 22px);
+ background: rgba(255, 255, 255, 0.15);
+ transition: all 0.35s ease-in-out;
+}
+#switchuser .btn:hover {
+ background: #d64d55;
+}
+
+#app {
+ display: flex;
+ min-height: 100vh;
+ flex-direction: column;
+ background-image: url("../img/bg1.jpg");
+ background-repeat: no-repeat;
+ background-size: cover;
+ background-position: bottom center;
+}
+#app nav {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ position: absolute;
+ width: 340px;
+ left: -340px;
+ transition: all 0.35s ease-in-out;
+ background: rgba(0, 0, 0, 0.7);
+ color: white;
+ z-index: 2;
+}
+#app .content {
+ flex-grow: 1;
+ display: flex;
+ flex-direction: column;
+}
+#app .content .appheader {
+ background: rgba(0, 0, 0, 0.4);
+ text-align: center;
+ position: absolute;
+ height: 58px;
+ width: 100%;
+ top: -58px;
+ transition: all 0.35s ease-in-out;
+ z-index: 1;
+}
+#app .content .appheader ul {
+ display: inline-block;
+ list-style: none;
+ height: 58px;
+ border-left: 1px solid rgba(0, 0, 0, 0.6);
+ border-right: 1px solid rgba(255, 255, 255, 0.1);
+ margin: 0;
+ padding: 0;
+}
+#app .content .appheader li {
+ display: inline-block;
+ border-right: 1px solid rgba(0, 0, 0, 0.6);
+ border-left: 1px solid rgba(255, 255, 255, 0.1);
+}
+#app .content .appheader a {
+ display: inline-block;
+ color: white;
+ text-decoration: none;
+ padding: 20px;
+}
+#app main {
+ flex-direction: column;
+}
+#app main, #app #sortable {
+ padding: 30px 10px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex: 1;
+ position: relative;
+ flex-wrap: wrap;
+ align-content: center;
+ list-style: none;
+ margin: 0;
+}
+
+#config-buttons {
+ position: fixed;
+ bottom: 0;
+ right: 0;
+ display: flex;
+ flex-direction: column;
+}
+#config-buttons a {
+ width: 50px;
+ height: 50px;
+ background: rgba(0, 0, 0, 0.8);
+ text-align: center;
+ line-height: 50px;
+ color: white;
+ margin-top: 1px;
+}
+#config-buttons a img {
+ width: 26px;
+ height: 26px;
+ margin-top: 12px;
+}
+
+.userlist {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+.userlist .user {
+ background: rgba(0, 0, 0, 0.5);
+ display: flex;
+ padding: 15px;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ margin: 20px;
+ color: white;
+ text-decoration: none;
+ border-radius: 15px;
+ border: 5px solid rgba(255, 255, 255, 0.7);
+ box-shadow: 0 0 10px 0px rgba(0, 0, 0, 0.4);
+}
+.userlist .user-img {
+ width: 130px;
+ height: 130px;
+ margin-bottom: 20px;
+ border-radius: 50%;
+ margin: 10px 10px 15px;
+}
+.userlist #password {
+ color: #2f313a;
+ width: 100%;
+ padding: 5px 10px;
+ margin: 15px -5px;
+}
+.userlist .btn {
+ width: 100%;
+}
+.userlist .forgot {
+ color: white;
+ font-size: 12px;
+ margin-top: 25px;
+}
+
+.item-container {
+ position: relative;
+}
+.item-container .item-edit {
+ color: white;
+ position: absolute;
+ bottom: 20px;
+ left: 8px;
+ width: 30px;
+ height: 30px;
+ background: rgba(0, 0, 0, 0.7);
+ border-radius: 50%;
+ text-align: center;
+ line-height: 30px;
+ display: none;
+}
+
+.black {
+ color: #000 !important;
+}
+
+.white {
+ color: #fff !important;
+}
+
+.message-container {
+ width: 100%;
+ padding: 10px 20px;
+}
+
+.message-container2 {
+ width: 100%;
+ padding: 10px 20px;
+}
+
+.alert {
+ margin: 30px auto;
+ text-align: center;
+ max-width: 800px;
+ background: #f1f4f7;
+ padding: 5px 20px;
+ display: flex;
+ justify-content: center;
+ padding-left: 80px;
+ box-shadow: 0 0 15px 3px rgba(0, 0, 0, 0.3);
+}
+.alert.alert-success, .alert.alert-danger {
+ position: relative;
+}
+.alert.alert-success:before, .alert.alert-danger:before {
+ content: "\F00C";
+ font-family: "Font Awesome 5 Pro";
+ font-weight: 900;
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ width: 60px;
+ background: #0eb584;
+ text-align: center;
+ color: white;
+ line-height: 57px;
+ font-size: 24px;
+ align-items: center;
+ justify-content: center;
+ display: flex;
+}
+.alert.alert-danger:before {
+ content: "\F00D";
+ background: #d64d55;
+}
+.alert a {
+ color: #91a1b3;
+}
+
+#app.header .item, #app.header .add-item {
+ transform: scale(0.9);
+ opacity: 0.8;
+ margin: 20px 0;
+}
+#app.sidebar nav {
+ left: 0;
+}
+
+.add-item {
+ width: 280px;
+ height: 90px;
+ margin: 20px;
+ flex: 0 0 280px;
+ border-radius: 6px;
+ padding: 20px;
+ border: 4px dashed rgba(255, 255, 255, 0.7);
+ box-shadow: 0 0 20px 2px rgba(0, 0, 0, 0.3);
+ color: white;
+ overflow: hidden;
+ position: relative;
+ display: none;
+ outline: 1px solid transparent;
+}
+.add-item.active {
+ display: block;
+}
+.add-item a {
+ display: block;
+ width: 100%;
+ text-align: center;
+ line-height: 40px;
+ color: white;
+ font-size: 19px;
+}
+
+.item {
+ width: 280px;
+ height: 90px;
+ margin: 20px;
+ flex: 0 0 280px;
+ background-image: linear-gradient(90deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.25));
+ border-radius: 6px;
+ padding: 15px;
+ padding-right: 55px;
+ color: white;
+ overflow: hidden;
+ position: relative;
+ transition: all 0.35s ease-in-out;
+ outline: 1px solid transparent;
+ display: flex;
+ align-items: center;
+ border: 1px solid #333333;
+ border: 1px solid #4a4a4a;
+ border: 1px solid rgba(76, 76, 76, 0.4);
+ -webkit-background-clip: padding-box;
+ background-clip: padding-box;
+}
+.item:after {
+ content: "";
+ position: absolute;
+ width: 90px;
+ height: 90px;
+ border-radius: 50%;
+ position: absolute;
+ right: -48px;
+ top: 0px;
+ background: rgba(255, 255, 255, 0.1);
+ box-shadow: 0 0 40px 0px rgba(0, 0, 0, 0.2);
+}
+.item .link {
+ position: absolute;
+ right: 0;
+ top: 0;
+ height: 100%;
+ width: 100%;
+ text-align: right;
+ line-height: 90px;
+ color: white;
+ font-size: 24px;
+ z-index: 1;
+ padding-right: 10px;
+}
+.item .title {
+ font-size: 16px;
+}
+.item .details {
+ width: 100%;
+}
+
+.text-center {
+ text-align: center !important;
+}
+
+.module-container {
+ box-shadow: 0 0 10px 0px rgba(0, 0, 0, 0.4);
+ border: 1px solid #cdced8;
+ background: #f9fafd;
+ max-width: 1000px;
+ width: 100%;
+ margin: 10px 40px;
+ border-radius: 5px;
+ overflow: hidden;
+}
+.module-container header, .module-container footer {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ border-top: 1px solid #fff;
+ background: #f2f3f6;
+ font-size: 16px;
+ border-bottom: 1px solid #dbdce3;
+ height: 60px;
+ position: relative;
+}
+.module-container header .section-title, .module-container footer .section-title {
+ font-size: 18px;
+ color: #5b5b5b;
+ margin-left: 25px;
+}
+.module-container footer {
+ border-top: 1px solid #dbdce3;
+}
+.module-container .table {
+ width: 100%;
+ margin: 0;
+ background: #fff;
+}
+.module-container .table thead th {
+ background: #f2f3f6;
+ color: #767d94;
+ border-top: 1px solid #fff;
+ text-align: left;
+ font-size: 13px;
+ text-transform: uppercase;
+ padding: 15px 25px;
+}
+.module-container .table tbody tr:hover {
+ background: #fefbf2;
+}
+.module-container .table tbody tr:hover td:first-child {
+ position: relative;
+}
+.module-container .table tbody tr:hover td:first-child:before {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ width: 5px;
+ background: #0eb584;
+}
+.module-container .table tbody td {
+ padding: 20px 25px;
+ font-size: 13px;
+ color: #2f313a;
+ max-width: 500px;
+ word-break: break-word;
+}
+.module-container .table tbody td.form-error {
+ background: #e69191;
+ color: white;
+ text-align: center;
+}
+.module-container .table tbody a {
+ color: #2f313a;
+}
+
+.homesearch {
+ height: 51px;
+}
+
+.toggleinput {
+ display: flex;
+ flex-direction: column-reverse;
+ line-height: 1;
+ font-size: 9px;
+ font-weight: 400;
+ text-transform: uppercase;
+ color: #ababab;
+ padding: 0 20px;
+}
+.toggleinput label.name {
+ margin-top: 6px;
+}
+
+.module-actions {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+.module-actions .button {
+ font-size: 18px;
+ color: #515564;
+ padding: 0 10px;
+ border: none;
+ border-left: 1px solid #cdced8;
+ display: flex;
+ line-height: 1;
+ position: relative;
+ background: transparent;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ min-width: 65px;
+ height: 60px;
+ text-decoration: none;
+ box-sizing: border-box;
+}
+.module-actions .button:after {
+ position: absolute;
+ content: "";
+ top: 0;
+ left: 0;
+ bottom: 0;
+ border-right: 1px solid #fff;
+}
+.module-actions .button span {
+ display: inline-block;
+ line-height: 1;
+ font-size: 9px;
+ font-weight: 400;
+ text-transform: uppercase;
+ color: #ababab;
+ position: relative;
+ top: 4px;
+ margin: 0;
+}
+
+div.create {
+ padding: 30px 15px;
+ display: flex;
+ flex-wrap: wrap;
+}
+div.create .input {
+ width: 280px;
+ margin: 20px;
+}
+div.create .input label:not(.switch) {
+ width: 100%;
+ font-size: 13px;
+ color: #9094a5;
+ margin-bottom: 15px;
+ display: block;
+ font-weight: 300;
+}
+div.create .input input, div.create .input select {
+ width: 100%;
+ border: 1px solid #dedfe2;
+ padding: 10px;
+ border-radius: 6px;
+}
+
+.app-icon {
+ max-width: 60px;
+ margin-right: 15px;
+}
+
+.sidenav {
+ position: relative;
+}
+.sidenav .close-sidenav {
+ position: absolute;
+ top: 20px;
+ right: 20px;
+ font-size: 24px;
+ color: #ccc;
+}
+.sidenav h2 {
+ font-weight: 300;
+ padding: 20px;
+ margin: 0;
+}
+.sidenav ul {
+ list-style: none;
+ margin: 0;
+ padding: 20px;
+}
+.sidenav ul li {
+ display: flex;
+ justify-content: space-between;
+ padding: 5px;
+}
+.sidenav ul li a {
+ color: #2b3542;
+}
+.sidenav ul li a.active {
+ color: #46b0e6;
+}
+
+.trashed {
+ font-size: 11px;
+ color: #91a1b3;
+ margin-left: 20px;
+}
+
+.switch {
+ position: relative;
+ display: inline-block;
+ width: 36px;
+ height: 20px;
+}
+
+/* Hide default HTML checkbox */
+.switch input {
+ display: none;
+}
+
+/* The slider */
+.slider {
+ position: absolute;
+ cursor: pointer;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background-color: #4a556b;
+ transition: 0.4s;
+}
+
+.slider:before {
+ position: absolute;
+ content: "";
+ height: 14px;
+ width: 14px;
+ left: 3px;
+ bottom: 3px;
+ background-color: white;
+ transition: 0.4s;
+}
+
+input:checked + .slider {
+ background-color: #2196F3;
+}
+
+input:focus + .slider {
+ box-shadow: 0 0 1px #2196F3;
+}
+
+input:checked + .slider:before {
+ transform: translateX(16px);
+}
+
+/* Rounded sliders */
+.slider.round {
+ border-radius: 20px;
+}
+
+.slider.round:before {
+ border-radius: 50%;
+}
+
+@-webkit-keyframes autofill {
+ to {
+ background: #f5f5f5;
+ color: #2f313a;
+ font-weight: bold;
+ }
+}
+@keyframes autofill {
+ to {
+ background: #f5f5f5;
+ color: #2f313a;
+ font-weight: bold;
+ }
+}
+input:-webkit-autofill {
+ -webkit-animation-name: autofill;
+ -webkit-animation-fill-mode: both;
+}
+
+input:autofill {
+ -webkit-animation-name: autofill;
+ animation-name: autofill;
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
+}
+
+button.link {
+ border: none;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background: transparent;
+}
+
+a.settinglink {
+ color: #2f313a;
+ font-size: 13px;
+ margin: 15px 5px;
+ display: inline-block;
+ font-weight: 700;
+}
+
+.setting-view-image {
+ margin-bottom: 20px;
+ display: inline-block;
+}
+.setting-view-image img {
+ max-width: 330px;
+}
+
+.searchform {
+ display: flex;
+ align-self: flex-start;
+ text-align: center;
+ margin: 50px auto;
+ padding: 14px;
+ background: rgba(0, 0, 0, 0.2);
+ border-radius: 14px;
+ box-shadow: inset 0px 1px 6px 0 rgba(0, 0, 0, 0.3);
+ border-top: 1px solid rgba(0, 0, 0, 0.5);
+ border-bottom: 1px solid rgba(255, 255, 255, 0.35);
+ position: relative;
+ width: 100%;
+ max-width: 620px;
+}
+.searchform form {
+ width: 100%;
+}
+.searchform .input-container {
+ background: white;
+ border-radius: 5px;
+ box-shadow: 0px 0px 5px 0 rgba(0, 0, 0, 0.4);
+ overflow: hidden;
+ position: relative;
+ display: flex;
+}
+.searchform input {
+ padding: 17px 15px;
+ font-size: 15px;
+ border: 0 none;
+ width: 100%;
+ background: transparent;
+}
+.searchform button {
+ position: absolute;
+ right: 0px;
+ top: 0px;
+ border: none;
+ font-size: 16px;
+ padding: 7px 15px;
+ line-height: 38px;
+ font-weight: 500;
+ border-top-right-radius: 5px;
+ border-bottom-right-radius: 5px;
+ color: white;
+ text-transform: uppercase;
+ background: #d64d55;
+}
+.searchform select {
+ padding: 0 10px;
+ background: #f5f5f5;
+ border: none;
+ border-right: 1px solid #ddd;
+}
+
+.ui-autocomplete {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ float: left;
+ display: none;
+ min-width: 160px;
+ padding: 4px 0;
+ margin: 0 0 10px 25px;
+ list-style: none;
+ background-color: #ffffff;
+ border-color: #ccc;
+ border-color: rgba(0, 0, 0, 0.2);
+ border-style: solid;
+ border-width: 1px;
+ border-radius: 5px;
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding;
+ background-clip: padding-box;
+ *border-right-width: 2px;
+ *border-bottom-width: 2px;
+}
+
+.ui-menu-item {
+ display: block;
+ padding: 3px 15px;
+ clear: both;
+ font-weight: normal;
+ line-height: 18px;
+ color: #555555;
+ white-space: nowrap;
+ text-decoration: none;
+}
+
+.ui-state-hover, .ui-state-active {
+ font-weight: 700;
+}
+
+#appimage img {
+ max-width: 95px;
+}
+
+#sapconfig, .newblock {
+ display: none;
+ width: 100%;
+}
+#sapconfig h2, .newblock h2 {
+ background: #f2f3f6;
+ padding: 2px 25px;
+ height: 60px;
+ margin-left: -15px;
+ width: calc(100% + 30px);
+ /* margin-right: -30px; */
+ border-top: 1px solid #dbdce3;
+ border-bottom: 1px solid #dbdce3;
+ font-size: 18px;
+ color: #5b5b5b;
+ font-weight: 500;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+#sapconfig .items, .newblock .items {
+ display: flex;
+}
+
+hr {
+ margin: 23px 0 18px;
+ height: 0;
+ border-style: none;
+ border-width: 0;
+ border-top: 1px solid #eaeaea;
+ border-bottom: 1px solid #fff;
+}
+
+.upload-btn-wrapper {
+ position: relative;
+ overflow: hidden;
+ display: inline-block;
+}
+
+.btn {
+ border: none;
+ color: white;
+ background-color: #d64d55;
+ padding: 8px 12px;
+ border-radius: 8px;
+ font-size: 16px;
+}
+.btn.test {
+ font-size: 16px;
+ font-weight: 500;
+ border-top-right-radius: 5px;
+ border-bottom-right-radius: 5px;
+ color: white;
+ text-transform: uppercase;
+ padding: 8px 50px;
+ background: #207774;
+}
+
+.upload-btn-wrapper input[type=file] {
+ font-size: 100px;
+ position: absolute;
+ left: 0;
+ top: 0;
+ opacity: 0;
+}
+
+.icon-container {
+ display: flex;
+ align-items: center;
+}
+.icon-container img {
+ margin-right: 15px;
+}
+
+.ui-helper-hidden-accessible {
+ display: none;
+}
+
+.livestats-container .livestats {
+ margin: 5px 0px 0px;
+ padding: 0;
+ display: flex;
+ list-style: none;
+ justify-content: space-between;
+ width: 100%;
+}
+.livestats-container .livestats span {
+ display: block;
+ text-transform: uppercase;
+ font-size: 11px;
+ font-weight: 500;
+ opacity: 0.5;
+ line-height: 1;
+ display: flex;
+ text-align: left;
+}
+.livestats-container .livestats strong {
+ display: block;
+ line-height: 1;
+ display: flex;
+ align-items: center;
+ color: white;
+ font-size: 12px;
+ line-height: 1.2;
+}
+.livestats-container .livestats strong span {
+ margin-left: 4px;
+}
+.livestats-container .livestats li {
+ text-align: center;
+ margin: 0;
+ line-height: 1;
+}
+.livestats-container .livestats li.right {
+ text-align: right;
+}
+.livestats-container .livestats li.right span {
+ justify-content: flex-end;
+}
+.livestats-container .livestats.flexcolumn {
+ flex-direction: column;
+}
+.livestats-container.black .livestats strong {
+ color: #000;
+}
+
+input:-webkit-autofill,
+input:-webkit-autofill:hover,
+input:-webkit-autofill:focus input:-webkit-autofill,
+textarea:-webkit-autofill,
+textarea:-webkit-autofill:hover textarea:-webkit-autofill:focus,
+select:-webkit-autofill,
+select:-webkit-autofill:hover,
+select:-webkit-autofill:focus {
+ border: inherit;
+ -webkit-text-fill-color: inherit;
+ -webkit-box-shadow: inherit;
+ transition: inherit;
+ color: #2f313a !important;
+}
+
+.title-marquee {
+ width: 125px;
+ overflow: hidden;
+ display: flex;
+ align-items: flex-start;
+ margin-top: 2px;
+}
+.title-marquee > span, .title-marquee > strong {
+ white-space: nowrap;
+ transform: translate(0, 0);
+ -webkit-animation: marquee 8s linear;
+ animation: marquee 8s linear;
+}
+.title-marquee .title {
+ margin-right: 4px;
+}
+
+.no-marquee .title {
+ margin-right: 4px;
+}
+
+@-webkit-keyframes marquee {
+ 0% {
+ transform: translate(0, 0);
+ }
+ 20% {
+ transform: translate(0, 0);
+ }
+ 95% {
+ transform: translate(-200%, 0);
+ }
+ 100% {
+ transform: translate(-200%, 0);
+ }
+}
+
+@keyframes marquee {
+ 0% {
+ transform: translate(0, 0);
+ }
+ 20% {
+ transform: translate(0, 0);
+ }
+ 95% {
+ transform: translate(-200%, 0);
+ }
+ 100% {
+ transform: translate(-200%, 0);
+ }
+}
/*! Huebee v2.0.0
http://huebee.buzz
----------------------------------------------- */.huebee{position:absolute;z-index:1;transform:translateY(0);transition:opacity .15s,transform .15s}.huebee.is-hidden{opacity:0;transform:translateY(10px)}.huebee.is-static-open{position:relative;z-index:auto}.huebee__container{position:absolute;left:0;top:5px;padding:10px;background:#eee;border-radius:5px;box-shadow:0 5px 10px rgba(0,0,0,.3)}.huebee.is-static-open .huebee__container{position:relative;display:inline-block;left:auto;top:auto;box-shadow:none}.huebee__canvas{display:block;cursor:pointer}.huebee__cursor{width:15px;height:15px;position:absolute;left:0;top:0;box-sizing:content-box;border:3px solid #fff;border-radius:5px;pointer-events:none}.huebee__cursor.is-hidden{opacity:0}.huebee__close-button{display:block;position:absolute;width:24px;height:24px;top:-9px;right:-9px;border-radius:12px;background:#222}.huebee__close-button__x{stroke:#fff;stroke-width:3;stroke-linecap:round}.huebee__close-button:hover{background:#fff;cursor:pointer}.huebee__close-button:hover .huebee__close-button__x{stroke:#222}.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:39px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;white-space:nowrap!important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent;border-style:solid;border-width:5px 4px 0;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888;border-width:0 4px 5px}.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #dedfe2;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#f2f3f6;border:1px solid #dedfe2;border-radius:4px;cursor:default;float:left;margin-right:5px;font-size:13px;font-weight:300;margin-top:5px;padding:5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:1px solid #dedfe2;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:#fff}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:linear-gradient(180deg,#fff 50%,#eee);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#FFFFFFFF",endColorstr="#FFEEEEEE",GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:linear-gradient(180deg,#eee 50%,#ccc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#FFEEEEEE",endColorstr="#FFCCCCCC",GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent;border-style:solid;border-width:5px 4px 0;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888;border-width:0 4px 5px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:linear-gradient(180deg,#fff 0,#eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#FFFFFFFF",endColorstr="#FFEEEEEE",GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:linear-gradient(180deg,#eee 50%,#fff);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#FFEEEEEE",endColorstr="#FFFFFFFF",GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}
\ No newline at end of file
+---------------------------------------------- */
+.huebee {
+ position: absolute;
+ z-index: 1;
+ transform: translateY(0px);
+ transition: opacity 0.15s, transform 0.15s;
+}
+
+.huebee.is-hidden {
+ opacity: 0;
+ transform: translateY(10px);
+}
+
+.huebee.is-static-open {
+ position: relative;
+ z-index: auto;
+}
+
+.huebee__container {
+ position: absolute;
+ left: 0;
+ top: 5px;
+ padding: 10px;
+ background: #EEE;
+ border-radius: 5px;
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3);
+}
+
+.huebee.is-static-open .huebee__container {
+ position: relative;
+ display: inline-block;
+ left: auto;
+ top: auto;
+ box-shadow: none;
+}
+
+.huebee__canvas {
+ display: block;
+ cursor: pointer;
+}
+
+.huebee__cursor {
+ width: 15px;
+ height: 15px;
+ position: absolute;
+ left: 0px;
+ top: 0px;
+ box-sizing: content-box;
+ border: 3px solid white;
+ border-radius: 5px;
+ pointer-events: none;
+}
+
+.huebee__cursor.is-hidden {
+ opacity: 0;
+}
+
+.huebee__close-button {
+ display: block;
+ position: absolute;
+ width: 24px;
+ height: 24px;
+ top: -9px;
+ right: -9px;
+ border-radius: 12px;
+ background: #222;
+}
+
+.huebee__close-button__x {
+ stroke: white;
+ stroke-width: 3;
+ stroke-linecap: round;
+}
+
+.huebee__close-button:hover {
+ background: white;
+ cursor: pointer;
+}
+
+.huebee__close-button:hover .huebee__close-button__x {
+ stroke: #222;
+}
+
+.select2-container {
+ box-sizing: border-box;
+ display: inline-block;
+ margin: 0;
+ position: relative;
+ vertical-align: middle;
+}
+
+.select2-container .select2-selection--single {
+ box-sizing: border-box;
+ cursor: pointer;
+ display: block;
+ height: 28px;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -webkit-user-select: none;
+}
+
+.select2-container .select2-selection--single .select2-selection__rendered {
+ display: block;
+ padding-left: 8px;
+ padding-right: 20px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.select2-container .select2-selection--single .select2-selection__clear {
+ position: relative;
+}
+
+.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered {
+ padding-right: 8px;
+ padding-left: 20px;
+}
+
+.select2-container .select2-selection--multiple {
+ box-sizing: border-box;
+ cursor: pointer;
+ display: block;
+ min-height: 39px;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -webkit-user-select: none;
+}
+
+.select2-container .select2-selection--multiple .select2-selection__rendered {
+ display: inline-block;
+ overflow: hidden;
+ padding-left: 8px;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.select2-container .select2-search--inline {
+ float: left;
+}
+
+.select2-container .select2-search--inline .select2-search__field {
+ box-sizing: border-box;
+ border: none;
+ font-size: 100%;
+ margin-top: 5px;
+ padding: 0;
+}
+
+.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button {
+ -webkit-appearance: none;
+}
+
+.select2-dropdown {
+ background-color: white;
+ border: 1px solid #aaa;
+ border-radius: 4px;
+ box-sizing: border-box;
+ display: block;
+ position: absolute;
+ left: -100000px;
+ width: 100%;
+ z-index: 1051;
+}
+
+.select2-results {
+ display: block;
+}
+
+.select2-results__options {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.select2-results__option {
+ padding: 6px;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -webkit-user-select: none;
+}
+
+.select2-results__option[aria-selected] {
+ cursor: pointer;
+}
+
+.select2-container--open .select2-dropdown {
+ left: 0;
+}
+
+.select2-container--open .select2-dropdown--above {
+ border-bottom: none;
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.select2-container--open .select2-dropdown--below {
+ border-top: none;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.select2-search--dropdown {
+ display: block;
+ padding: 4px;
+}
+
+.select2-search--dropdown .select2-search__field {
+ padding: 4px;
+ width: 100%;
+ box-sizing: border-box;
+}
+
+.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button {
+ -webkit-appearance: none;
+}
+
+.select2-search--dropdown.select2-search--hide {
+ display: none;
+}
+
+.select2-close-mask {
+ border: 0;
+ margin: 0;
+ padding: 0;
+ display: block;
+ position: fixed;
+ left: 0;
+ top: 0;
+ min-height: 100%;
+ min-width: 100%;
+ height: auto;
+ width: auto;
+ opacity: 0;
+ z-index: 99;
+ background-color: #fff;
+ filter: alpha(opacity=0);
+}
+
+.select2-hidden-accessible {
+ border: 0 !important;
+ clip: rect(0 0 0 0) !important;
+ -webkit-clip-path: inset(50%) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ overflow: hidden !important;
+ padding: 0 !important;
+ position: absolute !important;
+ width: 1px !important;
+ white-space: nowrap !important;
+}
+
+.select2-container--default .select2-selection--single {
+ background-color: #fff;
+ border: 1px solid #aaa;
+ border-radius: 4px;
+}
+
+.select2-container--default .select2-selection--single .select2-selection__rendered {
+ color: #444;
+ line-height: 28px;
+}
+
+.select2-container--default .select2-selection--single .select2-selection__clear {
+ cursor: pointer;
+ float: right;
+ font-weight: bold;
+}
+
+.select2-container--default .select2-selection--single .select2-selection__placeholder {
+ color: #999;
+}
+
+.select2-container--default .select2-selection--single .select2-selection__arrow {
+ height: 26px;
+ position: absolute;
+ top: 1px;
+ right: 1px;
+ width: 20px;
+}
+
+.select2-container--default .select2-selection--single .select2-selection__arrow b {
+ border-color: #888 transparent transparent transparent;
+ border-style: solid;
+ border-width: 5px 4px 0 4px;
+ height: 0;
+ left: 50%;
+ margin-left: -4px;
+ margin-top: -2px;
+ position: absolute;
+ top: 50%;
+ width: 0;
+}
+
+.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear {
+ float: left;
+}
+
+.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow {
+ left: 1px;
+ right: auto;
+}
+
+.select2-container--default.select2-container--disabled .select2-selection--single {
+ background-color: #eee;
+ cursor: default;
+}
+
+.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear {
+ display: none;
+}
+
+.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
+ border-color: transparent transparent #888 transparent;
+ border-width: 0 4px 5px 4px;
+}
+
+.select2-container--default .select2-selection--multiple {
+ background-color: white;
+ border: 1px solid #dedfe2;
+ border-radius: 4px;
+ cursor: text;
+}
+
+.select2-container--default .select2-selection--multiple .select2-selection__rendered {
+ box-sizing: border-box;
+ list-style: none;
+ margin: 0;
+ padding: 0 5px;
+ width: 100%;
+}
+
+.select2-container--default .select2-selection--multiple .select2-selection__rendered li {
+ list-style: none;
+}
+
+.select2-container--default .select2-selection--multiple .select2-selection__placeholder {
+ color: #999;
+ margin-top: 5px;
+ float: left;
+}
+
+.select2-container--default .select2-selection--multiple .select2-selection__clear {
+ cursor: pointer;
+ float: right;
+ font-weight: bold;
+ margin-top: 5px;
+ margin-right: 10px;
+}
+
+.select2-container--default .select2-selection--multiple .select2-selection__choice {
+ background-color: #f2f3f6;
+ border: 1px solid #dedfe2;
+ border-radius: 4px;
+ cursor: default;
+ float: left;
+ margin-right: 5px;
+ font-size: 13px;
+ font-weight: 300;
+ margin-top: 5px;
+ padding: 5px;
+}
+
+.select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
+ color: #999;
+ cursor: pointer;
+ display: inline-block;
+ font-weight: bold;
+ margin-right: 2px;
+}
+
+.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
+ color: #333;
+}
+
+.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline {
+ float: right;
+}
+
+.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice {
+ margin-left: 5px;
+ margin-right: auto;
+}
+
+.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove {
+ margin-left: 2px;
+ margin-right: auto;
+}
+
+.select2-container--default.select2-container--focus .select2-selection--multiple {
+ border: solid #dedfe2 1px;
+ outline: 0;
+}
+
+.select2-container--default.select2-container--disabled .select2-selection--multiple {
+ background-color: #eee;
+ cursor: default;
+}
+
+.select2-container--default.select2-container--disabled .select2-selection__choice__remove {
+ display: none;
+}
+
+.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple {
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.select2-container--default .select2-search--dropdown .select2-search__field {
+ border: 1px solid #aaa;
+}
+
+.select2-container--default .select2-search--inline .select2-search__field {
+ background: transparent;
+ border: none;
+ outline: 0;
+ box-shadow: none;
+ -webkit-appearance: textfield;
+}
+
+.select2-container--default .select2-results > .select2-results__options {
+ max-height: 200px;
+ overflow-y: auto;
+}
+
+.select2-container--default .select2-results__option[role=group] {
+ padding: 0;
+}
+
+.select2-container--default .select2-results__option[aria-disabled=true] {
+ color: #999;
+}
+
+.select2-container--default .select2-results__option[aria-selected=true] {
+ background-color: #ddd;
+}
+
+.select2-container--default .select2-results__option .select2-results__option {
+ padding-left: 1em;
+}
+
+.select2-container--default .select2-results__option .select2-results__option .select2-results__group {
+ padding-left: 0;
+}
+
+.select2-container--default .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -1em;
+ padding-left: 2em;
+}
+
+.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -2em;
+ padding-left: 3em;
+}
+
+.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -3em;
+ padding-left: 4em;
+}
+
+.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -4em;
+ padding-left: 5em;
+}
+
+.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -5em;
+ padding-left: 6em;
+}
+
+.select2-container--default .select2-results__option--highlighted[aria-selected] {
+ background-color: #5897fb;
+ color: white;
+}
+
+.select2-container--default .select2-results__group {
+ cursor: default;
+ display: block;
+ padding: 6px;
+}
+
+.select2-container--classic .select2-selection--single {
+ background-color: #f7f7f7;
+ border: 1px solid #aaa;
+ border-radius: 4px;
+ outline: 0;
+ background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#FFFFFFFF", endColorstr="#FFEEEEEE", GradientType=0);
+}
+
+.select2-container--classic .select2-selection--single:focus {
+ border: 1px solid #5897fb;
+}
+
+.select2-container--classic .select2-selection--single .select2-selection__rendered {
+ color: #444;
+ line-height: 28px;
+}
+
+.select2-container--classic .select2-selection--single .select2-selection__clear {
+ cursor: pointer;
+ float: right;
+ font-weight: bold;
+ margin-right: 10px;
+}
+
+.select2-container--classic .select2-selection--single .select2-selection__placeholder {
+ color: #999;
+}
+
+.select2-container--classic .select2-selection--single .select2-selection__arrow {
+ background-color: #ddd;
+ border: none;
+ border-left: 1px solid #aaa;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+ height: 26px;
+ position: absolute;
+ top: 1px;
+ right: 1px;
+ width: 20px;
+ background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#FFEEEEEE", endColorstr="#FFCCCCCC", GradientType=0);
+}
+
+.select2-container--classic .select2-selection--single .select2-selection__arrow b {
+ border-color: #888 transparent transparent transparent;
+ border-style: solid;
+ border-width: 5px 4px 0 4px;
+ height: 0;
+ left: 50%;
+ margin-left: -4px;
+ margin-top: -2px;
+ position: absolute;
+ top: 50%;
+ width: 0;
+}
+
+.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear {
+ float: left;
+}
+
+.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow {
+ border: none;
+ border-right: 1px solid #aaa;
+ border-radius: 0;
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+ left: 1px;
+ right: auto;
+}
+
+.select2-container--classic.select2-container--open .select2-selection--single {
+ border: 1px solid #5897fb;
+}
+
+.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow {
+ background: transparent;
+ border: none;
+}
+
+.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b {
+ border-color: transparent transparent #888 transparent;
+ border-width: 0 4px 5px 4px;
+}
+
+.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single {
+ border-top: none;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+ background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#FFFFFFFF", endColorstr="#FFEEEEEE", GradientType=0);
+}
+
+.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single {
+ border-bottom: none;
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+ background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#FFEEEEEE", endColorstr="#FFFFFFFF", GradientType=0);
+}
+
+.select2-container--classic .select2-selection--multiple {
+ background-color: white;
+ border: 1px solid #aaa;
+ border-radius: 4px;
+ cursor: text;
+ outline: 0;
+}
+
+.select2-container--classic .select2-selection--multiple:focus {
+ border: 1px solid #5897fb;
+}
+
+.select2-container--classic .select2-selection--multiple .select2-selection__rendered {
+ list-style: none;
+ margin: 0;
+ padding: 0 5px;
+}
+
+.select2-container--classic .select2-selection--multiple .select2-selection__clear {
+ display: none;
+}
+
+.select2-container--classic .select2-selection--multiple .select2-selection__choice {
+ background-color: #e4e4e4;
+ border: 1px solid #aaa;
+ border-radius: 4px;
+ cursor: default;
+ float: left;
+ margin-right: 5px;
+ margin-top: 5px;
+ padding: 0 5px;
+}
+
+.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove {
+ color: #888;
+ cursor: pointer;
+ display: inline-block;
+ font-weight: bold;
+ margin-right: 2px;
+}
+
+.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover {
+ color: #555;
+}
+
+.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice {
+ float: right;
+ margin-left: 5px;
+ margin-right: auto;
+}
+
+.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove {
+ margin-left: 2px;
+ margin-right: auto;
+}
+
+.select2-container--classic.select2-container--open .select2-selection--multiple {
+ border: 1px solid #5897fb;
+}
+
+.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple {
+ border-top: none;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple {
+ border-bottom: none;
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.select2-container--classic .select2-search--dropdown .select2-search__field {
+ border: 1px solid #aaa;
+ outline: 0;
+}
+
+.select2-container--classic .select2-search--inline .select2-search__field {
+ outline: 0;
+ box-shadow: none;
+}
+
+.select2-container--classic .select2-dropdown {
+ background-color: white;
+ border: 1px solid transparent;
+}
+
+.select2-container--classic .select2-dropdown--above {
+ border-bottom: none;
+}
+
+.select2-container--classic .select2-dropdown--below {
+ border-top: none;
+}
+
+.select2-container--classic .select2-results > .select2-results__options {
+ max-height: 200px;
+ overflow-y: auto;
+}
+
+.select2-container--classic .select2-results__option[role=group] {
+ padding: 0;
+}
+
+.select2-container--classic .select2-results__option[aria-disabled=true] {
+ color: grey;
+}
+
+.select2-container--classic .select2-results__option--highlighted[aria-selected] {
+ background-color: #3875d7;
+ color: white;
+}
+
+.select2-container--classic .select2-results__group {
+ cursor: default;
+ display: block;
+ padding: 6px;
+}
+
+.select2-container--classic.select2-container--open .select2-dropdown {
+ border-color: #5897fb;
+}
\ No newline at end of file
diff --git a/public/js/app.js b/public/js/app.js
index d8ae8c80..33042837 100644
--- a/public/js/app.js
+++ b/public/js/app.js
@@ -1 +1,741 @@
-function _typeof(t){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}!function(t,e){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",e):"object"==("undefined"==typeof module?"undefined":_typeof(module))&&module.exports?module.exports=e():t.EvEmitter=e()}("undefined"!=typeof window?window:this,function(){function t(){}var e=t.prototype;return e.on=function(t,e){if(t&&e){var n=this._events=this._events||{},i=n[t]=n[t]||[];return-1==i.indexOf(e)&&i.push(e),this}},e.once=function(t,e){if(t&&e){this.on(t,e);var n=this._onceEvents=this._onceEvents||{};return(n[t]=n[t]||{})[e]=!0,this}},e.off=function(t,e){var n=this._events&&this._events[t];if(n&&n.length){var i=n.indexOf(e);return-1!=i&&n.splice(i,1),this}},e.emitEvent=function(t,e){var n=this._events&&this._events[t];if(n&&n.length){var i=0,o=n[i];e=e||[];for(var s=this._onceEvents&&this._onceEvents[t];o;){var r=s&&s[o];r&&(this.off(t,o),delete s[o]),o.apply(this,e),o=n[i+=r?0:1]}return this}},t}),function(t,e){"function"==typeof define&&define.amd?define("unipointer/unipointer",["ev-emitter/ev-emitter"],function(n){return e(t,n)}):"object"==("undefined"==typeof module?"undefined":_typeof(module))&&module.exports?module.exports=e(t,require("ev-emitter")):t.Unipointer=e(t,t.EvEmitter)}(window,function(t,e){function n(){}var i=n.prototype=Object.create(e.prototype);i.bindStartEvent=function(t){this._bindStartEvent(t,!0)},i.unbindStartEvent=function(t){this._bindStartEvent(t,!1)},i._bindStartEvent=function(e,n){var i=(n=void 0===n||!!n)?"addEventListener":"removeEventListener";t.navigator.pointerEnabled?e[i]("pointerdown",this):t.navigator.msPointerEnabled?e[i]("MSPointerDown",this):(e[i]("mousedown",this),e[i]("touchstart",this))},i.handleEvent=function(t){var e="on"+t.type;this[e]&&this[e](t)},i.getTouch=function(t){for(var e=0;e
.5;var o=this.colorGrid[e.toUpperCase()];this.updateCursor(o),this.setTexts(),this.setBackgrounds(),n||this.emitEvent("change",[e,t.hue,t.sat,t.lum])}},h.setTexts=function(){if(this.setTextElems)for(var t=0;t0&&(void 0===document.addEventListener||void 0===t?console.log("This browser does not support visibilityChange"):document.addEventListener(e,function(){document[t]?function(){for(var t=0,e=i;t .5;
+ var o = this.colorGrid[e.toUpperCase()];
+ this.updateCursor(o), this.setTexts(), this.setBackgrounds(), n || this.emitEvent("change", [e, t.hue, t.sat, t.lum]);
+ }
+ }, f.setTexts = function () {
+ if (this.setTextElems) for (var t = 0; t < this.setTextElems.length; t++) {
+ var e = this.setTextElems[t],
+ n = "INPUT" == e.nodeName ? "value" : "textContent";
+ e[n] = this.color;
+ }
+ }, f.setBackgrounds = function () {
+ if (this.setBGElems) for (var t = this.isLight ? "#222" : "white", e = 0; e < this.setBGElems.length; e++) {
+ var n = this.setBGElems[e];
+ n.style.backgroundColor = this.color, n.style.color = t;
+ }
+ }, f.updateCursor = function (t) {
+ if (this.isOpen) {
+ var e = t ? "remove" : "add";
+
+ if (this.cursor.classList[e]("is-hidden"), t) {
+ var n = this.gridSize,
+ i = this.canvasOffset,
+ o = this.cursorBorder;
+ this.cursor.style.left = t.x * n + i.x - o + "px", this.cursor.style.top = t.y * n + i.y - o + "px";
+ }
+ }
+ };
+ var C = t.console,
+ S = document.readyState;
+ "complete" == S || "interactive" == S ? o() : document.addEventListener("DOMContentLoaded", o), i.data = function (t) {
+ t = h(t);
+ var e = t && t.huebeeGUID;
+ return e && l[e];
+ };
+ var y = document.createElement("canvas");
+ y.width = y.height = 1;
+
+ var _ = y.getContext("2d");
+
+ return i;
+});
+$.when($.ready).then(function () {
+ var base = (document.querySelector('base') || {}).href;
+
+ if ($('.message-container').length) {
+ setTimeout(function () {
+ $('.message-container').fadeOut();
+ }, 3500);
+ } // from https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API
+ // Set the name of the hidden property and the change event for visibility
+
+
+ var hidden, visibilityChange;
+
+ if (typeof document.hidden !== "undefined") {
+ // Opera 12.10 and Firefox 18 and later support
+ hidden = "hidden";
+ visibilityChange = "visibilitychange";
+ } else if (typeof document.msHidden !== "undefined") {
+ hidden = "msHidden";
+ visibilityChange = "msvisibilitychange";
+ } else if (typeof document.webkitHidden !== "undefined") {
+ hidden = "webkitHidden";
+ visibilityChange = "webkitvisibilitychange";
+ }
+
+ var livestatsRefreshTimeouts = [];
+ var livestatsFuncs = [];
+ var livestatsContainers = $('.livestats-container');
+
+ function stopLivestatsRefresh() {
+ for (var _i = 0, _livestatsRefreshTime = livestatsRefreshTimeouts; _i < _livestatsRefreshTime.length; _i++) {
+ var timeoutId = _livestatsRefreshTime[_i];
+ window.clearTimeout(timeoutId);
+ }
+ }
+
+ function startLivestatsRefresh() {
+ for (var _i2 = 0, _livestatsFuncs = livestatsFuncs; _i2 < _livestatsFuncs.length; _i2++) {
+ var fun = _livestatsFuncs[_i2];
+ fun();
+ }
+ }
+
+ if (livestatsContainers.length > 0) {
+ if (typeof document.addEventListener === "undefined" || hidden === undefined) {
+ console.log("This browser does not support visibilityChange");
+ } else {
+ document.addEventListener(visibilityChange, function () {
+ if (document[hidden]) {
+ stopLivestatsRefresh();
+ } else {
+ startLivestatsRefresh();
+ }
+ }, false);
+ }
+
+ livestatsContainers.each(function (index) {
+ var id = $(this).data('id');
+ var dataonly = $(this).data('dataonly');
+ var increaseby = dataonly == 1 ? 20000 : 1000;
+ var container = $(this);
+ var max_timer = 30000;
+ var timer = 5000;
+
+ var fun = function worker() {
+ $.ajax({
+ url: base + 'get_stats/' + id,
+ dataType: 'json',
+ success: function success(data) {
+ container.html(data.html);
+ if (data.status == 'active') timer = increaseby;else {
+ if (timer < max_timer) timer += 2000;
+ }
+ },
+ complete: function complete() {
+ // Schedule the next request when the current one's complete
+ livestatsRefreshTimeouts[index] = window.setTimeout(worker, timer);
+ }
+ });
+ };
+
+ livestatsFuncs[index] = fun;
+ fun();
+ });
+ }
+
+ function readURL(input) {
+ if (input.files && input.files[0]) {
+ var reader = new FileReader();
+
+ reader.onload = function (e) {
+ $('#appimage img').attr('src', e.target.result);
+ };
+
+ reader.readAsDataURL(input.files[0]);
+ }
+ }
+
+ $('#upload').change(function () {
+ readURL(this);
+ });
+ /*$(".droppable").droppable({
+ tolerance: "intersect",
+ drop: function( event, ui ) {
+ var tag = $( this ).data('id');
+ var item = $( ui.draggable ).data('id');
+ $.get('tag/add/'+tag+'/'+item, function(data) {
+ if(data == 1) {
+ $( ui.draggable ).remove();
+ } else {
+ alert('not added');
+ }
+ });
+ }
+ });*/
+
+ $('#sortable').sortable({
+ stop: function stop(event, ui) {
+ var idsInOrder = $('#sortable').sortable('toArray', {
+ attribute: 'data-id'
+ });
+ $.post(base + 'order', {
+ order: idsInOrder
+ });
+ }
+ });
+ $('#sortable').sortable('disable');
+ $('#search-container').on('input', 'input[name=q]', function () {
+ var search = this.value;
+ var items = $('#sortable').children('.item-container');
+
+ if ($('#search-container select[name=provider]').val() === 'tiles') {
+ if (search.length > 0) {
+ items.hide();
+ items.filter(function () {
+ var name = $(this).data('name').toLowerCase();
+ return name.includes(search.toLowerCase());
+ }).show();
+ } else {
+ items.show();
+ }
+ } else {
+ items.show();
+ }
+ }).on('change', 'select[name=provider]', function () {
+ var items = $('#sortable').children('.item-container');
+
+ if ($(this).val() === 'tiles') {
+ $('#search-container button').hide();
+ var search = $('#search-container input[name=q]').val();
+
+ if (search.length > 0) {
+ items.hide();
+ items.filter(function () {
+ var name = $(this).data('name').toLowerCase();
+ return name.includes(search.toLowerCase());
+ }).show();
+ } else {
+ items.show();
+ }
+ } else {
+ $('#search-container button').show();
+ items.show();
+ }
+ });
+ $('#app').on('click', '#config-button', function (e) {
+ e.preventDefault();
+ var app = $('#app');
+ var active = app.hasClass('header');
+ app.toggleClass('header');
+
+ if (active) {
+ $('.add-item').hide();
+ $('.item-edit').hide();
+ $('#app').removeClass('sidebar');
+ $('#sortable').sortable('disable');
+ } else {
+ $('#sortable').sortable('enable');
+ setTimeout(function () {
+ $('.add-item').fadeIn();
+ $('.item-edit').fadeIn();
+ }, 350);
+ }
+ }).on('click', '#add-item, #pin-item', function (e) {
+ e.preventDefault();
+ var app = $('#app');
+ var active = app.hasClass('sidebar');
+ app.toggleClass('sidebar');
+ }).on('click', '.close-sidenav', function (e) {
+ e.preventDefault();
+ var app = $('#app');
+ app.removeClass('sidebar');
+ }).on('click', '#test_config', function (e) {
+ e.preventDefault();
+ var apiurl = $('#create input[name=url]').val();
+ var override_url = $('#create input[name="config[override_url]"]').val();
+
+ if (override_url.length && override_url != '') {
+ apiurl = override_url;
+ }
+
+ var data = {};
+ data['url'] = apiurl;
+ $('.config-item').each(function (index) {
+ var config = $(this).data('config');
+ data[config] = $(this).val();
+ });
+ $.post(base + 'test_config', {
+ data: data
+ }, function (data) {
+ alert(data);
+ });
+ });
+ $('#pinlist').on('click', 'a', function (e) {
+ e.preventDefault();
+ var current = $(this);
+ var id = current.data('id');
+ var tag = current.data('tag');
+ $.get(base + 'items/pintoggle/' + id + '/true/' + tag, function (data) {
+ var inner = $(data).filter('#sortable').html();
+ $('#sortable').html(inner);
+ current.toggleClass('active');
+ });
+ });
+});
diff --git a/public/mix-manifest.json b/public/mix-manifest.json
index fc52f9e7..82b7e59d 100644
--- a/public/mix-manifest.json
+++ b/public/mix-manifest.json
@@ -1,4 +1,4 @@
{
- "/css/app.css": "/css/app.css?id=62b46d36567ec0e3418f",
- "/js/app.js": "/js/app.js?id=fd29fe4c923023023da6"
+ "/css/app.css": "/css/app.css?id=bafda2139c75830558d2",
+ "/js/app.js": "/js/app.js?id=0ff185efa8c02e94999e"
}
diff --git a/resources/assets/js/app.js b/resources/assets/js/app.js
index 4a41a3d4..683309ba 100644
--- a/resources/assets/js/app.js
+++ b/resources/assets/js/app.js
@@ -128,7 +128,41 @@ $.when( $.ready ).then(function() {
});
$('#sortable').sortable('disable');
-
+ $('#search-container').on('input', 'input[name=q]', function () {
+ const search = this.value
+ const items = $('#sortable').children('.item-container')
+ if($('#search-container select[name=provider]').val() === 'tiles') {
+ if(search.length > 0) {
+ items.hide()
+ items.filter(function () {
+ const name = $(this).data('name').toLowerCase();
+ return name.includes(search.toLowerCase())
+ }).show()
+ } else {
+ items.show()
+ }
+ } else {
+ items.show()
+ }
+ }).on('change', 'select[name=provider]', function () {
+ const items = $('#sortable').children('.item-container')
+ if($(this).val() === 'tiles') {
+ $('#search-container button').hide()
+ const search = $('#search-container input[name=q]').val()
+ if(search.length > 0) {
+ items.hide()
+ items.filter(function () {
+ const name = $(this).data('name').toLowerCase();
+ return name.includes(search.toLowerCase())
+ }).show()
+ } else {
+ items.show()
+ }
+ } else {
+ $('#search-container button').show()
+ items.show()
+ }
+ })
$('#app').on('click', '#config-button', function(e) {
e.preventDefault();
diff --git a/resources/views/item.blade.php b/resources/views/item.blade.php
index 738dbe96..c29e1590 100644
--- a/resources/views/item.blade.php
+++ b/resources/views/item.blade.php
@@ -1,4 +1,4 @@
-
+
@if($app->icon)
diff --git a/storage/app/searchproviders.yaml b/storage/app/searchproviders.yaml
new file mode 100644
index 00000000..6c5ab5e5
--- /dev/null
+++ b/storage/app/searchproviders.yaml
@@ -0,0 +1,37 @@
+tiles:
+ id: tiles
+ name: Tiles
+ target: _blank
+
+google:
+ id: google
+ url: https://www.google.com/search
+ name: Google
+ method: get
+ target: _blank
+ query: q
+
+bing:
+ id: bing
+ url: https://www.bing.com/search
+ name: Bing
+ method: get
+ target: _blank
+ query: q
+
+ddg:
+ id: ddg
+ url: https://duckduckgo.com/
+ name: DuckDuckGo
+ method: get
+ target: _blank
+ query: q
+
+startpage:
+ id: startpage
+ url: https://www.startpage.com/do/dsearch
+ name: Startpage
+ method: get
+ target: _blank
+ query: query
+
diff --git a/vendor/bin/yaml-lint b/vendor/bin/yaml-lint
new file mode 120000
index 00000000..1c1bbf3c
--- /dev/null
+++ b/vendor/bin/yaml-lint
@@ -0,0 +1 @@
+../symfony/yaml/Resources/bin/yaml-lint
\ No newline at end of file
diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php
index afef3fa2..0cd6055d 100644
--- a/vendor/composer/ClassLoader.php
+++ b/vendor/composer/ClassLoader.php
@@ -149,7 +149,7 @@ class ClassLoader
/**
* @return string[] Array of classname => path
- * @psalm-return array
+ * @psalm-var array
*/
public function getClassMap()
{
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
index b3fa634d..984ba951 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -43,6 +43,315 @@ return array(
'App\\SettingGroup' => $baseDir . '/app/SettingGroup.php',
'App\\SettingUser' => $baseDir . '/app/SettingUser.php',
'App\\SupportedApps' => $baseDir . '/app/SupportedApps.php',
+ 'App\\SupportedApps\\AMP\\AMP' => $baseDir . '/app/SupportedApps/AMP/AMP.php',
+ 'App\\SupportedApps\\AVMFritzbox\\AVMFritzbox' => $baseDir . '/app/SupportedApps/AVMFritzbox/AVMFritzbox.php',
+ 'App\\SupportedApps\\AWX\\AWX' => $baseDir . '/app/SupportedApps/AWX/AWX.php',
+ 'App\\SupportedApps\\AdGuardHome\\AdGuardHome' => $baseDir . '/app/SupportedApps/AdGuardHome/AdGuardHome.php',
+ 'App\\SupportedApps\\Adminer\\Adminer' => $baseDir . '/app/SupportedApps/Adminer/Adminer.php',
+ 'App\\SupportedApps\\Airsonic\\Airsonic' => $baseDir . '/app/SupportedApps/Airsonic/Airsonic.php',
+ 'App\\SupportedApps\\AlarmPI\\AlarmPI' => $baseDir . '/app/SupportedApps/AlarmPI/AlarmPI.php',
+ 'App\\SupportedApps\\Alertmanager\\Alertmanager' => $baseDir . '/app/SupportedApps/Alertmanager/Alertmanager.php',
+ 'App\\SupportedApps\\ArchiSteamFarm\\ArchiSteamFarm' => $baseDir . '/app/SupportedApps/ArchiSteamFarm/ArchiSteamFarm.php',
+ 'App\\SupportedApps\\ArchiveBox\\ArchiveBox' => $baseDir . '/app/SupportedApps/ArchiveBox/ArchiveBox.php',
+ 'App\\SupportedApps\\ArchiveTeamWarrior\\ArchiveTeamWarrior' => $baseDir . '/app/SupportedApps/ArchiveTeamWarrior/ArchiveTeamWarrior.php',
+ 'App\\SupportedApps\\AriaNg\\AriaNg' => $baseDir . '/app/SupportedApps/AriaNg/AriaNg.php',
+ 'App\\SupportedApps\\Artifactory\\Artifactory' => $baseDir . '/app/SupportedApps/Artifactory/Artifactory.php',
+ 'App\\SupportedApps\\AsrockRackIPMI\\AsrockRackIPMI' => $baseDir . '/app/SupportedApps/AsrockRackIPMI/AsrockRackIPMI.php',
+ 'App\\SupportedApps\\Bacula\\Bacula' => $baseDir . '/app/SupportedApps/Bacula/Bacula.php',
+ 'App\\SupportedApps\\Baikal\\Baikal' => $baseDir . '/app/SupportedApps/Baikal/Baikal.php',
+ 'App\\SupportedApps\\Bastillion\\Bastillion' => $baseDir . '/app/SupportedApps/Bastillion/Bastillion.php',
+ 'App\\SupportedApps\\Bazarr\\Bazarr' => $baseDir . '/app/SupportedApps/Bazarr/Bazarr.php',
+ 'App\\SupportedApps\\Bitwarden\\Bitwarden' => $baseDir . '/app/SupportedApps/Bitwarden/Bitwarden.php',
+ 'App\\SupportedApps\\Booksonic\\Booksonic' => $baseDir . '/app/SupportedApps/Booksonic/Booksonic.php',
+ 'App\\SupportedApps\\Bookstack\\Bookstack' => $baseDir . '/app/SupportedApps/Bookstack/Bookstack.php',
+ 'App\\SupportedApps\\Box\\Box' => $baseDir . '/app/SupportedApps/Box/Box.php',
+ 'App\\SupportedApps\\Cabot\\Cabot' => $baseDir . '/app/SupportedApps/Cabot/Cabot.php',
+ 'App\\SupportedApps\\CalibreWeb\\CalibreWeb' => $baseDir . '/app/SupportedApps/CalibreWeb/CalibreWeb.php',
+ 'App\\SupportedApps\\Cardigann\\Cardigann' => $baseDir . '/app/SupportedApps/Cardigann/Cardigann.php',
+ 'App\\SupportedApps\\ChangeDetectionio\\ChangeDetectionio' => $baseDir . '/app/SupportedApps/ChangeDetectionio/ChangeDetectionio.php',
+ 'App\\SupportedApps\\CheckMK\\CheckMK' => $baseDir . '/app/SupportedApps/CheckMK/CheckMK.php',
+ 'App\\SupportedApps\\Chevereto\\Chevereto' => $baseDir . '/app/SupportedApps/Chevereto/Chevereto.php',
+ 'App\\SupportedApps\\Chronograf\\Chronograf' => $baseDir . '/app/SupportedApps/Chronograf/Chronograf.php',
+ 'App\\SupportedApps\\Clarkson\\Clarkson' => $baseDir . '/app/SupportedApps/Clarkson/Clarkson.php',
+ 'App\\SupportedApps\\CloudCMD\\CloudCMD' => $baseDir . '/app/SupportedApps/CloudCMD/CloudCMD.php',
+ 'App\\SupportedApps\\CockpitCMS\\CockpitCMS' => $baseDir . '/app/SupportedApps/CockpitCMS/CockpitCMS.php',
+ 'App\\SupportedApps\\Cockpit\\Cockpit' => $baseDir . '/app/SupportedApps/Cockpit/Cockpit.php',
+ 'App\\SupportedApps\\Codeserver\\Codeserver' => $baseDir . '/app/SupportedApps/Codeserver/Codeserver.php',
+ 'App\\SupportedApps\\CodiMD\\CodiMD' => $baseDir . '/app/SupportedApps/CodiMD/CodiMD.php',
+ 'App\\SupportedApps\\Concourse\\Concourse' => $baseDir . '/app/SupportedApps/Concourse/Concourse.php',
+ 'App\\SupportedApps\\Confluence\\Confluence' => $baseDir . '/app/SupportedApps/Confluence/Confluence.php',
+ 'App\\SupportedApps\\CouchPotato\\CouchPotato' => $baseDir . '/app/SupportedApps/CouchPotato/CouchPotato.php',
+ 'App\\SupportedApps\\CryptPad\\CryptPad' => $baseDir . '/app/SupportedApps/CryptPad/CryptPad.php',
+ 'App\\SupportedApps\\Deluge\\Deluge' => $baseDir . '/app/SupportedApps/Deluge/Deluge.php',
+ 'App\\SupportedApps\\Dillinger\\Dillinger' => $baseDir . '/app/SupportedApps/Dillinger/Dillinger.php',
+ 'App\\SupportedApps\\Directus\\Directus' => $baseDir . '/app/SupportedApps/Directus/Directus.php',
+ 'App\\SupportedApps\\DokuWiki\\DokuWiki' => $baseDir . '/app/SupportedApps/DokuWiki/DokuWiki.php',
+ 'App\\SupportedApps\\Domoticz\\Domoticz' => $baseDir . '/app/SupportedApps/Domoticz/Domoticz.php',
+ 'App\\SupportedApps\\Dozzle\\Dozzle' => $baseDir . '/app/SupportedApps/Dozzle/Dozzle.php',
+ 'App\\SupportedApps\\Drone\\Drone' => $baseDir . '/app/SupportedApps/Drone/Drone.php',
+ 'App\\SupportedApps\\Droppy\\Droppy' => $baseDir . '/app/SupportedApps/Droppy/Droppy.php',
+ 'App\\SupportedApps\\Duplicacy\\Duplicacy' => $baseDir . '/app/SupportedApps/Duplicacy/Duplicacy.php',
+ 'App\\SupportedApps\\Duplicati\\Duplicati' => $baseDir . '/app/SupportedApps/Duplicati/Duplicati.php',
+ 'App\\SupportedApps\\ESPHome\\ESPHome' => $baseDir . '/app/SupportedApps/ESPHome/ESPHome.php',
+ 'App\\SupportedApps\\Element\\Element' => $baseDir . '/app/SupportedApps/Element/Element.php',
+ 'App\\SupportedApps\\EmbyStat\\EmbyStat' => $baseDir . '/app/SupportedApps/EmbyStat/EmbyStat.php',
+ 'App\\SupportedApps\\Emby\\Emby' => $baseDir . '/app/SupportedApps/Emby/Emby.php',
+ 'App\\SupportedApps\\FileBrowser\\FileBrowser' => $baseDir . '/app/SupportedApps/FileBrowser/FileBrowser.php',
+ 'App\\SupportedApps\\FileFlows\\FileFlows' => $baseDir . '/app/SupportedApps/FileFlows/FileFlows.php',
+ 'App\\SupportedApps\\FileRun\\FileRun' => $baseDir . '/app/SupportedApps/FileRun/FileRun.php',
+ 'App\\SupportedApps\\Firefly\\Firefly' => $baseDir . '/app/SupportedApps/Firefly/Firefly.php',
+ 'App\\SupportedApps\\FirefoxSend\\FirefoxSend' => $baseDir . '/app/SupportedApps/FirefoxSend/FirefoxSend.php',
+ 'App\\SupportedApps\\FlexGet\\FlexGet' => $baseDir . '/app/SupportedApps/FlexGet/FlexGet.php',
+ 'App\\SupportedApps\\Flood\\Flood' => $baseDir . '/app/SupportedApps/Flood/Flood.php',
+ 'App\\SupportedApps\\Focalboard\\Focalboard' => $baseDir . '/app/SupportedApps/Focalboard/Focalboard.php',
+ 'App\\SupportedApps\\FoldingHome\\FoldingHome' => $baseDir . '/app/SupportedApps/FoldingHome/FoldingHome.php',
+ 'App\\SupportedApps\\FortinetFortiMonitor\\FortinetFortiMonitor' => $baseDir . '/app/SupportedApps/FortinetFortiMonitor/FortinetFortiMonitor.php',
+ 'App\\SupportedApps\\Freenas\\Freenas' => $baseDir . '/app/SupportedApps/Freenas/Freenas.php',
+ 'App\\SupportedApps\\FreshRSS\\FreshRSS' => $baseDir . '/app/SupportedApps/FreshRSS/FreshRSS.php',
+ 'App\\SupportedApps\\Fronius\\Fronius' => $baseDir . '/app/SupportedApps/Fronius/Fronius.php',
+ 'App\\SupportedApps\\Funkwhale\\Funkwhale' => $baseDir . '/app/SupportedApps/Funkwhale/Funkwhale.php',
+ 'App\\SupportedApps\\Ghost\\Ghost' => $baseDir . '/app/SupportedApps/Ghost/Ghost.php',
+ 'App\\SupportedApps\\GitHub\\GitHub' => $baseDir . '/app/SupportedApps/GitHub/GitHub.php',
+ 'App\\SupportedApps\\GitLab\\GitLab' => $baseDir . '/app/SupportedApps/GitLab/GitLab.php',
+ 'App\\SupportedApps\\Gitea\\Gitea' => $baseDir . '/app/SupportedApps/Gitea/Gitea.php',
+ 'App\\SupportedApps\\Glances\\Glances' => $baseDir . '/app/SupportedApps/Glances/Glances.php',
+ 'App\\SupportedApps\\Gogs\\Gogs' => $baseDir . '/app/SupportedApps/Gogs/Gogs.php',
+ 'App\\SupportedApps\\Gotify\\Gotify' => $baseDir . '/app/SupportedApps/Gotify/Gotify.php',
+ 'App\\SupportedApps\\Grafana\\Grafana' => $baseDir . '/app/SupportedApps/Grafana/Grafana.php',
+ 'App\\SupportedApps\\Grav\\Grav' => $baseDir . '/app/SupportedApps/Grav/Grav.php',
+ 'App\\SupportedApps\\Graylog\\Graylog' => $baseDir . '/app/SupportedApps/Graylog/Graylog.php',
+ 'App\\SupportedApps\\Grocy\\Grocy' => $baseDir . '/app/SupportedApps/Grocy/Grocy.php',
+ 'App\\SupportedApps\\Guacamole\\Guacamole' => $baseDir . '/app/SupportedApps/Guacamole/Guacamole.php',
+ 'App\\SupportedApps\\HAProxy\\HAProxy' => $baseDir . '/app/SupportedApps/HAProxy/HAProxy.php',
+ 'App\\SupportedApps\\HDHomeRun\\HDHomeRun' => $baseDir . '/app/SupportedApps/HDHomeRun/HDHomeRun.php',
+ 'App\\SupportedApps\\Handbrake\\Handbrake' => $baseDir . '/app/SupportedApps/Handbrake/Handbrake.php',
+ 'App\\SupportedApps\\Hasura\\Hasura' => $baseDir . '/app/SupportedApps/Hasura/Hasura.php',
+ 'App\\SupportedApps\\Headphones\\Headphones' => $baseDir . '/app/SupportedApps/Headphones/Headphones.php',
+ 'App\\SupportedApps\\Healthchecks\\Healthchecks' => $baseDir . '/app/SupportedApps/Healthchecks/Healthchecks.php',
+ 'App\\SupportedApps\\HomeAssistant\\HomeAssistant' => $baseDir . '/app/SupportedApps/HomeAssistant/HomeAssistant.php',
+ 'App\\SupportedApps\\Homebridge\\Homebridge' => $baseDir . '/app/SupportedApps/Homebridge/Homebridge.php',
+ 'App\\SupportedApps\\Homer\\Homer' => $baseDir . '/app/SupportedApps/Homer/Homer.php',
+ 'App\\SupportedApps\\Hubitat\\Hubitat' => $baseDir . '/app/SupportedApps/Hubitat/Hubitat.php',
+ 'App\\SupportedApps\\Huginn\\Huginn' => $baseDir . '/app/SupportedApps/Huginn/Huginn.php',
+ 'App\\SupportedApps\\Icecast\\Icecast' => $baseDir . '/app/SupportedApps/Icecast/Icecast.php',
+ 'App\\SupportedApps\\IcingaWeb\\IcingaWeb' => $baseDir . '/app/SupportedApps/IcingaWeb/IcingaWeb.php',
+ 'App\\SupportedApps\\InfluxDB\\InfluxDB' => $baseDir . '/app/SupportedApps/InfluxDB/InfluxDB.php',
+ 'App\\SupportedApps\\Infoblox\\Infoblox' => $baseDir . '/app/SupportedApps/Infoblox/Infoblox.php',
+ 'App\\SupportedApps\\Invidious\\Invidious' => $baseDir . '/app/SupportedApps/Invidious/Invidious.php',
+ 'App\\SupportedApps\\InvoiceNinja\\InvoiceNinja' => $baseDir . '/app/SupportedApps/InvoiceNinja/InvoiceNinja.php',
+ 'App\\SupportedApps\\JDownloader\\JDownloader' => $baseDir . '/app/SupportedApps/JDownloader/JDownloader.php',
+ 'App\\SupportedApps\\Jackett\\Jackett' => $baseDir . '/app/SupportedApps/Jackett/Jackett.php',
+ 'App\\SupportedApps\\Jaeger\\Jaeger' => $baseDir . '/app/SupportedApps/Jaeger/Jaeger.php',
+ 'App\\SupportedApps\\Jeedom\\Jeedom' => $baseDir . '/app/SupportedApps/Jeedom/Jeedom.php',
+ 'App\\SupportedApps\\Jellyfin\\Jellyfin' => $baseDir . '/app/SupportedApps/Jellyfin/Jellyfin.php',
+ 'App\\SupportedApps\\Jenkins\\Jenkins' => $baseDir . '/app/SupportedApps/Jenkins/Jenkins.php',
+ 'App\\SupportedApps\\Jira\\Jira' => $baseDir . '/app/SupportedApps/Jira/Jira.php',
+ 'App\\SupportedApps\\Jitsi\\Jitsi' => $baseDir . '/app/SupportedApps/Jitsi/Jitsi.php',
+ 'App\\SupportedApps\\Joomla\\Joomla' => $baseDir . '/app/SupportedApps/Joomla/Joomla.php',
+ 'App\\SupportedApps\\Jupyter\\Jupyter' => $baseDir . '/app/SupportedApps/Jupyter/Jupyter.php',
+ 'App\\SupportedApps\\Kanboard\\Kanboard' => $baseDir . '/app/SupportedApps/Kanboard/Kanboard.php',
+ 'App\\SupportedApps\\Keycloak\\Keycloak' => $baseDir . '/app/SupportedApps/Keycloak/Keycloak.php',
+ 'App\\SupportedApps\\Kibana\\Kibana' => $baseDir . '/app/SupportedApps/Kibana/Kibana.php',
+ 'App\\SupportedApps\\Kimai\\Kimai' => $baseDir . '/app/SupportedApps/Kimai/Kimai.php',
+ 'App\\SupportedApps\\Kitana\\Kitana' => $baseDir . '/app/SupportedApps/Kitana/Kitana.php',
+ 'App\\SupportedApps\\Kodi\\Kodi' => $baseDir . '/app/SupportedApps/Kodi/Kodi.php',
+ 'App\\SupportedApps\\Komga\\Komga' => $baseDir . '/app/SupportedApps/Komga/Komga.php',
+ 'App\\SupportedApps\\Kopia\\Kopia' => $baseDir . '/app/SupportedApps/Kopia/Kopia.php',
+ 'App\\SupportedApps\\Krusader\\Krusader' => $baseDir . '/app/SupportedApps/Krusader/Krusader.php',
+ 'App\\SupportedApps\\KubernetesDashboard\\KubernetesDashboard' => $baseDir . '/app/SupportedApps/KubernetesDashboard/KubernetesDashboard.php',
+ 'App\\SupportedApps\\LazyLibrarian\\LazyLibrarian' => $baseDir . '/app/SupportedApps/LazyLibrarian/LazyLibrarian.php',
+ 'App\\SupportedApps\\LemonLDAPNG\\LemonLDAPNG' => $baseDir . '/app/SupportedApps/LemonLDAPNG/LemonLDAPNG.php',
+ 'App\\SupportedApps\\LibreNMS\\LibreNMS' => $baseDir . '/app/SupportedApps/LibreNMS/LibreNMS.php',
+ 'App\\SupportedApps\\LibreSpeed\\LibreSpeed' => $baseDir . '/app/SupportedApps/LibreSpeed/LibreSpeed.php',
+ 'App\\SupportedApps\\Lidarr\\Lidarr' => $baseDir . '/app/SupportedApps/Lidarr/Lidarr.php',
+ 'App\\SupportedApps\\LinkAce\\LinkAce' => $baseDir . '/app/SupportedApps/LinkAce/LinkAce.php',
+ 'App\\SupportedApps\\Lychee\\Lychee' => $baseDir . '/app/SupportedApps/Lychee/Lychee.php',
+ 'App\\SupportedApps\\MailcowSOGo\\MailcowSOGo' => $baseDir . '/app/SupportedApps/MailcowSOGo/MailcowSOGo.php',
+ 'App\\SupportedApps\\Mailcow\\Mailcow' => $baseDir . '/app/SupportedApps/Mailcow/Mailcow.php',
+ 'App\\SupportedApps\\Mailhog\\Mailhog' => $baseDir . '/app/SupportedApps/Mailhog/Mailhog.php',
+ 'App\\SupportedApps\\Mainsail\\Mainsail' => $baseDir . '/app/SupportedApps/Mainsail/Mainsail.php',
+ 'App\\SupportedApps\\Mastodon\\Mastodon' => $baseDir . '/app/SupportedApps/Mastodon/Mastodon.php',
+ 'App\\SupportedApps\\Mattermost\\Mattermost' => $baseDir . '/app/SupportedApps/Mattermost/Mattermost.php',
+ 'App\\SupportedApps\\MayanEDMS\\MayanEDMS' => $baseDir . '/app/SupportedApps/MayanEDMS/MayanEDMS.php',
+ 'App\\SupportedApps\\McMyAdmin\\McMyAdmin' => $baseDir . '/app/SupportedApps/McMyAdmin/McMyAdmin.php',
+ 'App\\SupportedApps\\Mealie\\Mealie' => $baseDir . '/app/SupportedApps/Mealie/Mealie.php',
+ 'App\\SupportedApps\\MediaWiki\\MediaWiki' => $baseDir . '/app/SupportedApps/MediaWiki/MediaWiki.php',
+ 'App\\SupportedApps\\Medusa\\Medusa' => $baseDir . '/app/SupportedApps/Medusa/Medusa.php',
+ 'App\\SupportedApps\\Meraki\\Meraki' => $baseDir . '/app/SupportedApps/Meraki/Meraki.php',
+ 'App\\SupportedApps\\MineOS\\MineOS' => $baseDir . '/app/SupportedApps/MineOS/MineOS.php',
+ 'App\\SupportedApps\\Miniflux\\Miniflux' => $baseDir . '/app/SupportedApps/Miniflux/Miniflux.php',
+ 'App\\SupportedApps\\Minio\\Minio' => $baseDir . '/app/SupportedApps/Minio/Minio.php',
+ 'App\\SupportedApps\\Monica\\Monica' => $baseDir . '/app/SupportedApps/Monica/Monica.php',
+ 'App\\SupportedApps\\Monit\\Monit' => $baseDir . '/app/SupportedApps/Monit/Monit.php',
+ 'App\\SupportedApps\\MotionEye\\MotionEye' => $baseDir . '/app/SupportedApps/MotionEye/MotionEye.php',
+ 'App\\SupportedApps\\MusicBrainz\\MusicBrainz' => $baseDir . '/app/SupportedApps/MusicBrainz/MusicBrainz.php',
+ 'App\\SupportedApps\\Mylar\\Mylar' => $baseDir . '/app/SupportedApps/Mylar/Mylar.php',
+ 'App\\SupportedApps\\NZBHydra\\NZBHydra' => $baseDir . '/app/SupportedApps/NZBHydra/NZBHydra.php',
+ 'App\\SupportedApps\\Navidrome\\Navidrome' => $baseDir . '/app/SupportedApps/Navidrome/Navidrome.php',
+ 'App\\SupportedApps\\Nessus\\Nessus' => $baseDir . '/app/SupportedApps/Nessus/Nessus.php',
+ 'App\\SupportedApps\\NetBox\\NetBox' => $baseDir . '/app/SupportedApps/NetBox/NetBox.php',
+ 'App\\SupportedApps\\Netatmo\\Netatmo' => $baseDir . '/app/SupportedApps/Netatmo/Netatmo.php',
+ 'App\\SupportedApps\\Netboot\\Netboot' => $baseDir . '/app/SupportedApps/Netboot/Netboot.php',
+ 'App\\SupportedApps\\Netdata\\Netdata' => $baseDir . '/app/SupportedApps/Netdata/Netdata.php',
+ 'App\\SupportedApps\\Nextcloud\\Nextcloud' => $baseDir . '/app/SupportedApps/Nextcloud/Nextcloud.php',
+ 'App\\SupportedApps\\NginxProxyManager\\NginxProxyManager' => $baseDir . '/app/SupportedApps/NginxProxyManager/NginxProxyManager.php',
+ 'App\\SupportedApps\\Nitter\\Nitter' => $baseDir . '/app/SupportedApps/Nitter/Nitter.php',
+ 'App\\SupportedApps\\NodeRed\\NodeRed' => $baseDir . '/app/SupportedApps/NodeRed/NodeRed.php',
+ 'App\\SupportedApps\\NowShowing\\NowShowing' => $baseDir . '/app/SupportedApps/NowShowing/NowShowing.php',
+ 'App\\SupportedApps\\NxFilter\\NxFilter' => $baseDir . '/app/SupportedApps/NxFilter/NxFilter.php',
+ 'App\\SupportedApps\\Nzbget\\Nzbget' => $baseDir . '/app/SupportedApps/Nzbget/Nzbget.php',
+ 'App\\SupportedApps\\OPNsense\\OPNsense' => $baseDir . '/app/SupportedApps/OPNsense/OPNsense.php',
+ 'App\\SupportedApps\\Octoprint\\Octoprint' => $baseDir . '/app/SupportedApps/Octoprint/Octoprint.php',
+ 'App\\SupportedApps\\Ombi\\Ombi' => $baseDir . '/app/SupportedApps/Ombi/Ombi.php',
+ 'App\\SupportedApps\\OmniDB\\OmniDB' => $baseDir . '/app/SupportedApps/OmniDB/OmniDB.php',
+ 'App\\SupportedApps\\OnlyOffice\\OnlyOffice' => $baseDir . '/app/SupportedApps/OnlyOffice/OnlyOffice.php',
+ 'App\\SupportedApps\\OpenMapTiler\\OpenMapTiler' => $baseDir . '/app/SupportedApps/OpenMapTiler/OpenMapTiler.php',
+ 'App\\SupportedApps\\OpenSpeedTest\\OpenSpeedTest' => $baseDir . '/app/SupportedApps/OpenSpeedTest/OpenSpeedTest.php',
+ 'App\\SupportedApps\\OpenSprinkler\\OpenSprinkler' => $baseDir . '/app/SupportedApps/OpenSprinkler/OpenSprinkler.php',
+ 'App\\SupportedApps\\OpenWrt\\OpenWrt' => $baseDir . '/app/SupportedApps/OpenWrt/OpenWrt.php',
+ 'App\\SupportedApps\\Oscarr\\Oscarr' => $baseDir . '/app/SupportedApps/Oscarr/Oscarr.php',
+ 'App\\SupportedApps\\Overseerr\\Overseerr' => $baseDir . '/app/SupportedApps/Overseerr/Overseerr.php',
+ 'App\\SupportedApps\\OwnPhotos\\OwnPhotos' => $baseDir . '/app/SupportedApps/OwnPhotos/OwnPhotos.php',
+ 'App\\SupportedApps\\PRTG\\PRTG' => $baseDir . '/app/SupportedApps/PRTG/PRTG.php',
+ 'App\\SupportedApps\\PaloAltoNetworks\\PaloAltoNetworks' => $baseDir . '/app/SupportedApps/PaloAltoNetworks/PaloAltoNetworks.php',
+ 'App\\SupportedApps\\Paperless\\Paperless' => $baseDir . '/app/SupportedApps/Paperless/Paperless.php',
+ 'App\\SupportedApps\\PartKeepr\\PartKeepr' => $baseDir . '/app/SupportedApps/PartKeepr/PartKeepr.php',
+ 'App\\SupportedApps\\PeerTube\\PeerTube' => $baseDir . '/app/SupportedApps/PeerTube/PeerTube.php',
+ 'App\\SupportedApps\\PhotoPrism\\PhotoPrism' => $baseDir . '/app/SupportedApps/PhotoPrism/PhotoPrism.php',
+ 'App\\SupportedApps\\Photonix\\Photonix' => $baseDir . '/app/SupportedApps/Photonix/Photonix.php',
+ 'App\\SupportedApps\\PiAware\\PiAware' => $baseDir . '/app/SupportedApps/PiAware/PiAware.php',
+ 'App\\SupportedApps\\PiVPN\\PiVPN' => $baseDir . '/app/SupportedApps/PiVPN/PiVPN.php',
+ 'App\\SupportedApps\\Pihole\\Pihole' => $baseDir . '/app/SupportedApps/Pihole/Pihole.php',
+ 'App\\SupportedApps\\Piwigo\\Piwigo' => $baseDir . '/app/SupportedApps/Piwigo/Piwigo.php',
+ 'App\\SupportedApps\\Pleroma\\Pleroma' => $baseDir . '/app/SupportedApps/Pleroma/Pleroma.php',
+ 'App\\SupportedApps\\Plesk\\Plesk' => $baseDir . '/app/SupportedApps/Plesk/Plesk.php',
+ 'App\\SupportedApps\\PlexRequests\\PlexRequests' => $baseDir . '/app/SupportedApps/PlexRequests/PlexRequests.php',
+ 'App\\SupportedApps\\Plex\\Plex' => $baseDir . '/app/SupportedApps/Plex/Plex.php',
+ 'App\\SupportedApps\\Plume\\Plume' => $baseDir . '/app/SupportedApps/Plume/Plume.php',
+ 'App\\SupportedApps\\Portainer\\Portainer' => $baseDir . '/app/SupportedApps/Portainer/Portainer.php',
+ 'App\\SupportedApps\\Poste\\Poste' => $baseDir . '/app/SupportedApps/Poste/Poste.php',
+ 'App\\SupportedApps\\Printer\\Printer' => $baseDir . '/app/SupportedApps/Printer/Printer.php',
+ 'App\\SupportedApps\\Privatebin\\Privatebin' => $baseDir . '/app/SupportedApps/Privatebin/Privatebin.php',
+ 'App\\SupportedApps\\ProjectSend\\ProjectSend' => $baseDir . '/app/SupportedApps/ProjectSend/ProjectSend.php',
+ 'App\\SupportedApps\\Prometheus\\Prometheus' => $baseDir . '/app/SupportedApps/Prometheus/Prometheus.php',
+ 'App\\SupportedApps\\Prowlarr\\Prowlarr' => $baseDir . '/app/SupportedApps/Prowlarr/Prowlarr.php',
+ 'App\\SupportedApps\\Proxmox\\Proxmox' => $baseDir . '/app/SupportedApps/Proxmox/Proxmox.php',
+ 'App\\SupportedApps\\PsiTransfer\\PsiTransfer' => $baseDir . '/app/SupportedApps/PsiTransfer/PsiTransfer.php',
+ 'App\\SupportedApps\\Pterodactyl\\Pterodactyl' => $baseDir . '/app/SupportedApps/Pterodactyl/Pterodactyl.php',
+ 'App\\SupportedApps\\QNAP\\QNAP' => $baseDir . '/app/SupportedApps/QNAP/QNAP.php',
+ 'App\\SupportedApps\\RStudioServer\\RStudioServer' => $baseDir . '/app/SupportedApps/RStudioServer/RStudioServer.php',
+ 'App\\SupportedApps\\Radarr\\Radarr' => $baseDir . '/app/SupportedApps/Radarr/Radarr.php',
+ 'App\\SupportedApps\\Rainloop\\Rainloop' => $baseDir . '/app/SupportedApps/Rainloop/Rainloop.php',
+ 'App\\SupportedApps\\Rancher\\Rancher' => $baseDir . '/app/SupportedApps/Rancher/Rancher.php',
+ 'App\\SupportedApps\\Raneto\\Raneto' => $baseDir . '/app/SupportedApps/Raneto/Raneto.php',
+ 'App\\SupportedApps\\Rclone\\Rclone' => $baseDir . '/app/SupportedApps/Rclone/Rclone.php',
+ 'App\\SupportedApps\\Readarr\\Readarr' => $baseDir . '/app/SupportedApps/Readarr/Readarr.php',
+ 'App\\SupportedApps\\Recalbox\\Recalbox' => $baseDir . '/app/SupportedApps/Recalbox/Recalbox.php',
+ 'App\\SupportedApps\\Requestrr\\Requestrr' => $baseDir . '/app/SupportedApps/Requestrr/Requestrr.php',
+ 'App\\SupportedApps\\ResilioSync\\ResilioSync' => $baseDir . '/app/SupportedApps/ResilioSync/ResilioSync.php',
+ 'App\\SupportedApps\\RiotWeb\\RiotWeb' => $baseDir . '/app/SupportedApps/RiotWeb/RiotWeb.php',
+ 'App\\SupportedApps\\RocketChat\\RocketChat' => $baseDir . '/app/SupportedApps/RocketChat/RocketChat.php',
+ 'App\\SupportedApps\\RompЯ\\RompЯ' => $baseDir . '/app/SupportedApps/RompЯ/RompЯ.php',
+ 'App\\SupportedApps\\Roundcube\\Roundcube' => $baseDir . '/app/SupportedApps/Roundcube/Roundcube.php',
+ 'App\\SupportedApps\\Router\\Router' => $baseDir . '/app/SupportedApps/Router/Router.php',
+ 'App\\SupportedApps\\Rspamd\\Rspamd' => $baseDir . '/app/SupportedApps/Rspamd/Rspamd.php',
+ 'App\\SupportedApps\\Rundeck\\Rundeck' => $baseDir . '/app/SupportedApps/Rundeck/Rundeck.php',
+ 'App\\SupportedApps\\RuneAudio\\RuneAudio' => $baseDir . '/app/SupportedApps/RuneAudio/RuneAudio.php',
+ 'App\\SupportedApps\\SABnzbd\\SABnzbd' => $baseDir . '/app/SupportedApps/SABnzbd/SABnzbd.php',
+ 'App\\SupportedApps\\SOGo\\SOGo' => $baseDir . '/app/SupportedApps/SOGo/SOGo.php',
+ 'App\\SupportedApps\\Seafile\\Seafile' => $baseDir . '/app/SupportedApps/Seafile/Seafile.php',
+ 'App\\SupportedApps\\SearxMetasearchEngine\\SearxMetasearchEngine' => $baseDir . '/app/SupportedApps/SearxMetasearchEngine/SearxMetasearchEngine.php',
+ 'App\\SupportedApps\\Serviio\\Serviio' => $baseDir . '/app/SupportedApps/Serviio/Serviio.php',
+ 'App\\SupportedApps\\Shaarli\\Shaarli' => $baseDir . '/app/SupportedApps/Shaarli/Shaarli.php',
+ 'App\\SupportedApps\\Shinobi\\Shinobi' => $baseDir . '/app/SupportedApps/Shinobi/Shinobi.php',
+ 'App\\SupportedApps\\SickBeard\\SickBeard' => $baseDir . '/app/SupportedApps/SickBeard/SickBeard.php',
+ 'App\\SupportedApps\\SickGear\\SickGear' => $baseDir . '/app/SupportedApps/SickGear/SickGear.php',
+ 'App\\SupportedApps\\Sickchill\\Sickchill' => $baseDir . '/app/SupportedApps/Sickchill/Sickchill.php',
+ 'App\\SupportedApps\\Slack\\Slack' => $baseDir . '/app/SupportedApps/Slack/Slack.php',
+ 'App\\SupportedApps\\Snibox\\Snibox' => $baseDir . '/app/SupportedApps/Snibox/Snibox.php',
+ 'App\\SupportedApps\\SonarQube\\SonarQube' => $baseDir . '/app/SupportedApps/SonarQube/SonarQube.php',
+ 'App\\SupportedApps\\Sonarr\\Sonarr' => $baseDir . '/app/SupportedApps/Sonarr/Sonarr.php',
+ 'App\\SupportedApps\\Sourcegraph\\Sourcegraph' => $baseDir . '/app/SupportedApps/Sourcegraph/Sourcegraph.php',
+ 'App\\SupportedApps\\Splunk\\Splunk' => $baseDir . '/app/SupportedApps/Splunk/Splunk.php',
+ 'App\\SupportedApps\\Spotweb\\Spotweb' => $baseDir . '/app/SupportedApps/Spotweb/Spotweb.php',
+ 'App\\SupportedApps\\Squidex\\Squidex' => $baseDir . '/app/SupportedApps/Squidex/Squidex.php',
+ 'App\\SupportedApps\\Stash\\Stash' => $baseDir . '/app/SupportedApps/Stash/Stash.php',
+ 'App\\SupportedApps\\Statping\\Statping' => $baseDir . '/app/SupportedApps/Statping/Statping.php',
+ 'App\\SupportedApps\\Strapi\\Strapi' => $baseDir . '/app/SupportedApps/Strapi/Strapi.php',
+ 'App\\SupportedApps\\Streama\\Streama' => $baseDir . '/app/SupportedApps/Streama/Streama.php',
+ 'App\\SupportedApps\\Sympa\\Sympa' => $baseDir . '/app/SupportedApps/Sympa/Sympa.php',
+ 'App\\SupportedApps\\Synclounge\\Synclounge' => $baseDir . '/app/SupportedApps/Synclounge/Synclounge.php',
+ 'App\\SupportedApps\\Syncthing\\Syncthing' => $baseDir . '/app/SupportedApps/Syncthing/Syncthing.php',
+ 'App\\SupportedApps\\Synology\\Synology' => $baseDir . '/app/SupportedApps/Synology/Synology.php',
+ 'App\\SupportedApps\\TVHeadend\\TVHeadend' => $baseDir . '/app/SupportedApps/TVHeadend/TVHeadend.php',
+ 'App\\SupportedApps\\TYPO\\TYPO' => $baseDir . '/app/SupportedApps/TYPO/TYPO.php',
+ 'App\\SupportedApps\\Taiga\\Taiga' => $baseDir . '/app/SupportedApps/Taiga/Taiga.php',
+ 'App\\SupportedApps\\TandoorRecipes\\TandoorRecipes' => $baseDir . '/app/SupportedApps/TandoorRecipes/TandoorRecipes.php',
+ 'App\\SupportedApps\\TarTenNinety\\TarTenNinety' => $baseDir . '/app/SupportedApps/TarTenNinety/TarTenNinety.php',
+ 'App\\SupportedApps\\TasmoAdmin\\TasmoAdmin' => $baseDir . '/app/SupportedApps/TasmoAdmin/TasmoAdmin.php',
+ 'App\\SupportedApps\\Tasmota\\Tasmota' => $baseDir . '/app/SupportedApps/Tasmota/Tasmota.php',
+ 'App\\SupportedApps\\Tautulli\\Tautulli' => $baseDir . '/app/SupportedApps/Tautulli/Tautulli.php',
+ 'App\\SupportedApps\\Tdarr\\Tdarr' => $baseDir . '/app/SupportedApps/Tdarr/Tdarr.php',
+ 'App\\SupportedApps\\Teedy\\Teedy' => $baseDir . '/app/SupportedApps/Teedy/Teedy.php',
+ 'App\\SupportedApps\\TheLounge\\TheLounge' => $baseDir . '/app/SupportedApps/TheLounge/TheLounge.php',
+ 'App\\SupportedApps\\TinyTinyRSS\\TinyTinyRSS' => $baseDir . '/app/SupportedApps/TinyTinyRSS/TinyTinyRSS.php',
+ 'App\\SupportedApps\\Traccar\\Traccar' => $baseDir . '/app/SupportedApps/Traccar/Traccar.php',
+ 'App\\SupportedApps\\Traefik\\Traefik' => $baseDir . '/app/SupportedApps/Traefik/Traefik.php',
+ 'App\\SupportedApps\\Transmission\\Transmission' => $baseDir . '/app/SupportedApps/Transmission/Transmission.php',
+ 'App\\SupportedApps\\Trilium\\Trilium' => $baseDir . '/app/SupportedApps/Trilium/Trilium.php',
+ 'App\\SupportedApps\\TrueNASCORE\\TrueNASCORE' => $baseDir . '/app/SupportedApps/TrueNASCORE/TrueNASCORE.php',
+ 'App\\SupportedApps\\TrueNAS\\TrueNAS' => $baseDir . '/app/SupportedApps/TrueNAS/TrueNAS.php',
+ 'App\\SupportedApps\\Ubooquity\\Ubooquity' => $baseDir . '/app/SupportedApps/Ubooquity/Ubooquity.php',
+ 'App\\SupportedApps\\UniFi\\UniFi' => $baseDir . '/app/SupportedApps/UniFi/UniFi.php',
+ 'App\\SupportedApps\\Unraid\\Unraid' => $baseDir . '/app/SupportedApps/Unraid/Unraid.php',
+ 'App\\SupportedApps\\UrBackup\\UrBackup' => $baseDir . '/app/SupportedApps/UrBackup/UrBackup.php',
+ 'App\\SupportedApps\\VMwareESXi\\VMwareESXi' => $baseDir . '/app/SupportedApps/VMwareESXi/VMwareESXi.php',
+ 'App\\SupportedApps\\VMwarevCenter\\VMwarevCenter' => $baseDir . '/app/SupportedApps/VMwarevCenter/VMwarevCenter.php',
+ 'App\\SupportedApps\\ViMbAdmin\\ViMbAdmin' => $baseDir . '/app/SupportedApps/ViMbAdmin/ViMbAdmin.php',
+ 'App\\SupportedApps\\VirtualRadarServer\\VirtualRadarServer' => $baseDir . '/app/SupportedApps/VirtualRadarServer/VirtualRadarServer.php',
+ 'App\\SupportedApps\\Virtualmin\\Virtualmin' => $baseDir . '/app/SupportedApps/Virtualmin/Virtualmin.php',
+ 'App\\SupportedApps\\Volumio\\Volumio' => $baseDir . '/app/SupportedApps/Volumio/Volumio.php',
+ 'App\\SupportedApps\\VuPlus\\VuPlus' => $baseDir . '/app/SupportedApps/VuPlus/VuPlus.php',
+ 'App\\SupportedApps\\Wallabag\\Wallabag' => $baseDir . '/app/SupportedApps/Wallabag/Wallabag.php',
+ 'App\\SupportedApps\\WaniKani\\WaniKani' => $baseDir . '/app/SupportedApps/WaniKani/WaniKani.php',
+ 'App\\SupportedApps\\Watcher\\Watcher' => $baseDir . '/app/SupportedApps/Watcher/Watcher.php',
+ 'App\\SupportedApps\\WebTools\\WebTools' => $baseDir . '/app/SupportedApps/WebTools/WebTools.php',
+ 'App\\SupportedApps\\Webmin\\Webmin' => $baseDir . '/app/SupportedApps/Webmin/Webmin.php',
+ 'App\\SupportedApps\\Wekan\\Wekan' => $baseDir . '/app/SupportedApps/Wekan/Wekan.php',
+ 'App\\SupportedApps\\Wetty\\Wetty' => $baseDir . '/app/SupportedApps/Wetty/Wetty.php',
+ 'App\\SupportedApps\\WgGenWeb\\WgGenWeb' => $baseDir . '/app/SupportedApps/WgGenWeb/WgGenWeb.php',
+ 'App\\SupportedApps\\Wikijs\\Wikijs' => $baseDir . '/app/SupportedApps/Wikijs/Wikijs.php',
+ 'App\\SupportedApps\\WireGuard\\WireGuard' => $baseDir . '/app/SupportedApps/WireGuard/WireGuard.php',
+ 'App\\SupportedApps\\Wordpress\\Wordpress' => $baseDir . '/app/SupportedApps/Wordpress/Wordpress.php',
+ 'App\\SupportedApps\\XWiki\\XWiki' => $baseDir . '/app/SupportedApps/XWiki/XWiki.php',
+ 'App\\SupportedApps\\XenOrchestra\\XenOrchestra' => $baseDir . '/app/SupportedApps/XenOrchestra/XenOrchestra.php',
+ 'App\\SupportedApps\\Xigmanas\\Xigmanas' => $baseDir . '/app/SupportedApps/Xigmanas/Xigmanas.php',
+ 'App\\SupportedApps\\YNAB\\YNAB' => $baseDir . '/app/SupportedApps/YNAB/YNAB.php',
+ 'App\\SupportedApps\\ZNC\\ZNC' => $baseDir . '/app/SupportedApps/ZNC/ZNC.php',
+ 'App\\SupportedApps\\Zabbix\\Zabbix' => $baseDir . '/app/SupportedApps/Zabbix/Zabbix.php',
+ 'App\\SupportedApps\\Zammad\\Zammad' => $baseDir . '/app/SupportedApps/Zammad/Zammad.php',
+ 'App\\SupportedApps\\ZoneMinder\\ZoneMinder' => $baseDir . '/app/SupportedApps/ZoneMinder/ZoneMinder.php',
+ 'App\\SupportedApps\\Zulip\\Zulip' => $baseDir . '/app/SupportedApps/Zulip/Zulip.php',
+ 'App\\SupportedApps\\cPanel\\cPanel' => $baseDir . '/app/SupportedApps/cPanel/cPanel.php',
+ 'App\\SupportedApps\\iDRAC\\iDRAC' => $baseDir . '/app/SupportedApps/iDRAC/iDRAC.php',
+ 'App\\SupportedApps\\iLO\\iLO' => $baseDir . '/app/SupportedApps/iLO/iLO.php',
+ 'App\\SupportedApps\\ioBroker\\ioBroker' => $baseDir . '/app/SupportedApps/ioBroker/ioBroker.php',
+ 'App\\SupportedApps\\neightn\\neightn' => $baseDir . '/app/SupportedApps/neightn/neightn.php',
+ 'App\\SupportedApps\\openHAB\\openHAB' => $baseDir . '/app/SupportedApps/openHAB/openHAB.php',
+ 'App\\SupportedApps\\openmediavault\\openmediavault' => $baseDir . '/app/SupportedApps/openmediavault/openmediavault.php',
+ 'App\\SupportedApps\\osTicket\\osTicket' => $baseDir . '/app/SupportedApps/osTicket/osTicket.php',
+ 'App\\SupportedApps\\ownCloud\\ownCloud' => $baseDir . '/app/SupportedApps/ownCloud/ownCloud.php',
+ 'App\\SupportedApps\\pfSense\\pfSense' => $baseDir . '/app/SupportedApps/pfSense/pfSense.php',
+ 'App\\SupportedApps\\pgAdmin\\pgAdmin' => $baseDir . '/app/SupportedApps/pgAdmin/pgAdmin.php',
+ 'App\\SupportedApps\\phpIPAM\\phpIPAM' => $baseDir . '/app/SupportedApps/phpIPAM/phpIPAM.php',
+ 'App\\SupportedApps\\phpLDAPadmin\\phpLDAPadmin' => $baseDir . '/app/SupportedApps/phpLDAPadmin/phpLDAPadmin.php',
+ 'App\\SupportedApps\\phpMyAdmin\\phpMyAdmin' => $baseDir . '/app/SupportedApps/phpMyAdmin/phpMyAdmin.php',
+ 'App\\SupportedApps\\pyLoad\\pyLoad' => $baseDir . '/app/SupportedApps/pyLoad/pyLoad.php',
+ 'App\\SupportedApps\\qBittorrent\\qBittorrent' => $baseDir . '/app/SupportedApps/qBittorrent/qBittorrent.php',
+ 'App\\SupportedApps\\ruTorrent\\ruTorrent' => $baseDir . '/app/SupportedApps/ruTorrent/ruTorrent.php',
+ 'App\\SupportedApps\\vmwarehorizon\\vmwarehorizon' => $baseDir . '/app/SupportedApps/vmwarehorizon/vmwarehorizon.php',
+ 'App\\SupportedApps\\xTeVe\\xTeVe' => $baseDir . '/app/SupportedApps/xTeVe/xTeVe.php',
+ 'App\\SupportedApps\\youtubedl\\youtubedl' => $baseDir . '/app/SupportedApps/youtubedl/youtubedl.php',
'App\\User' => $baseDir . '/app/User.php',
'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
'Brick\\Math\\BigDecimal' => $vendorDir . '/brick/math/src/BigDecimal.php',
@@ -4618,6 +4927,18 @@ return array(
'Symfony\\Component\\VarExporter\\Internal\\Registry' => $vendorDir . '/symfony/var-exporter/Internal/Registry.php',
'Symfony\\Component\\VarExporter\\Internal\\Values' => $vendorDir . '/symfony/var-exporter/Internal/Values.php',
'Symfony\\Component\\VarExporter\\VarExporter' => $vendorDir . '/symfony/var-exporter/VarExporter.php',
+ 'Symfony\\Component\\Yaml\\Command\\LintCommand' => $vendorDir . '/symfony/yaml/Command/LintCommand.php',
+ 'Symfony\\Component\\Yaml\\Dumper' => $vendorDir . '/symfony/yaml/Dumper.php',
+ 'Symfony\\Component\\Yaml\\Escaper' => $vendorDir . '/symfony/yaml/Escaper.php',
+ 'Symfony\\Component\\Yaml\\Exception\\DumpException' => $vendorDir . '/symfony/yaml/Exception/DumpException.php',
+ 'Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/yaml/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\Yaml\\Exception\\ParseException' => $vendorDir . '/symfony/yaml/Exception/ParseException.php',
+ 'Symfony\\Component\\Yaml\\Exception\\RuntimeException' => $vendorDir . '/symfony/yaml/Exception/RuntimeException.php',
+ 'Symfony\\Component\\Yaml\\Inline' => $vendorDir . '/symfony/yaml/Inline.php',
+ 'Symfony\\Component\\Yaml\\Parser' => $vendorDir . '/symfony/yaml/Parser.php',
+ 'Symfony\\Component\\Yaml\\Tag\\TaggedValue' => $vendorDir . '/symfony/yaml/Tag/TaggedValue.php',
+ 'Symfony\\Component\\Yaml\\Unescaper' => $vendorDir . '/symfony/yaml/Unescaper.php',
+ 'Symfony\\Component\\Yaml\\Yaml' => $vendorDir . '/symfony/yaml/Yaml.php',
'Symfony\\Contracts\\Cache\\CacheInterface' => $vendorDir . '/symfony/cache-contracts/CacheInterface.php',
'Symfony\\Contracts\\Cache\\CacheTrait' => $vendorDir . '/symfony/cache-contracts/CacheTrait.php',
'Symfony\\Contracts\\Cache\\CallbackInterface' => $vendorDir . '/symfony/cache-contracts/CallbackInterface.php',
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
index 00b4b5fb..7ff7522c 100644
--- a/vendor/composer/autoload_files.php
+++ b/vendor/composer/autoload_files.php
@@ -6,8 +6,8 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
- 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
'6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
+ 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php',
'25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index 0e0a7d32..2b84fcc1 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -27,6 +27,7 @@ return array(
'Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'),
'Symfony\\Contracts\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher-contracts'),
'Symfony\\Contracts\\Cache\\' => array($vendorDir . '/symfony/cache-contracts'),
+ 'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'),
'Symfony\\Component\\VarExporter\\' => array($vendorDir . '/symfony/var-exporter'),
'Symfony\\Component\\VarDumper\\' => array($vendorDir . '/symfony/var-dumper'),
'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'),
diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php
index 8309daae..03275c82 100644
--- a/vendor/composer/autoload_real.php
+++ b/vendor/composer/autoload_real.php
@@ -65,16 +65,11 @@ class ComposerAutoloaderInit4b6fb9210a1ea37c2db27b8ff53a1ecf
}
}
-/**
- * @param string $fileIdentifier
- * @param string $file
- * @return void
- */
function composerRequire4b6fb9210a1ea37c2db27b8ff53a1ecf($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
- $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
-
require $file;
+
+ $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
}
}
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index a76c6f54..249a8530 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -7,8 +7,8 @@ namespace Composer\Autoload;
class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf
{
public static $files = array (
- 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
'6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
+ 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php',
'25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',
@@ -73,6 +73,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf
'Symfony\\Contracts\\Service\\' => 26,
'Symfony\\Contracts\\EventDispatcher\\' => 34,
'Symfony\\Contracts\\Cache\\' => 24,
+ 'Symfony\\Component\\Yaml\\' => 23,
'Symfony\\Component\\VarExporter\\' => 30,
'Symfony\\Component\\VarDumper\\' => 28,
'Symfony\\Component\\Translation\\' => 30,
@@ -271,6 +272,10 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf
array (
0 => __DIR__ . '/..' . '/symfony/cache-contracts',
),
+ 'Symfony\\Component\\Yaml\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/yaml',
+ ),
'Symfony\\Component\\VarExporter\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/var-exporter',
@@ -587,6 +592,315 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf
'App\\SettingGroup' => __DIR__ . '/../..' . '/app/SettingGroup.php',
'App\\SettingUser' => __DIR__ . '/../..' . '/app/SettingUser.php',
'App\\SupportedApps' => __DIR__ . '/../..' . '/app/SupportedApps.php',
+ 'App\\SupportedApps\\AMP\\AMP' => __DIR__ . '/../..' . '/app/SupportedApps/AMP/AMP.php',
+ 'App\\SupportedApps\\AVMFritzbox\\AVMFritzbox' => __DIR__ . '/../..' . '/app/SupportedApps/AVMFritzbox/AVMFritzbox.php',
+ 'App\\SupportedApps\\AWX\\AWX' => __DIR__ . '/../..' . '/app/SupportedApps/AWX/AWX.php',
+ 'App\\SupportedApps\\AdGuardHome\\AdGuardHome' => __DIR__ . '/../..' . '/app/SupportedApps/AdGuardHome/AdGuardHome.php',
+ 'App\\SupportedApps\\Adminer\\Adminer' => __DIR__ . '/../..' . '/app/SupportedApps/Adminer/Adminer.php',
+ 'App\\SupportedApps\\Airsonic\\Airsonic' => __DIR__ . '/../..' . '/app/SupportedApps/Airsonic/Airsonic.php',
+ 'App\\SupportedApps\\AlarmPI\\AlarmPI' => __DIR__ . '/../..' . '/app/SupportedApps/AlarmPI/AlarmPI.php',
+ 'App\\SupportedApps\\Alertmanager\\Alertmanager' => __DIR__ . '/../..' . '/app/SupportedApps/Alertmanager/Alertmanager.php',
+ 'App\\SupportedApps\\ArchiSteamFarm\\ArchiSteamFarm' => __DIR__ . '/../..' . '/app/SupportedApps/ArchiSteamFarm/ArchiSteamFarm.php',
+ 'App\\SupportedApps\\ArchiveBox\\ArchiveBox' => __DIR__ . '/../..' . '/app/SupportedApps/ArchiveBox/ArchiveBox.php',
+ 'App\\SupportedApps\\ArchiveTeamWarrior\\ArchiveTeamWarrior' => __DIR__ . '/../..' . '/app/SupportedApps/ArchiveTeamWarrior/ArchiveTeamWarrior.php',
+ 'App\\SupportedApps\\AriaNg\\AriaNg' => __DIR__ . '/../..' . '/app/SupportedApps/AriaNg/AriaNg.php',
+ 'App\\SupportedApps\\Artifactory\\Artifactory' => __DIR__ . '/../..' . '/app/SupportedApps/Artifactory/Artifactory.php',
+ 'App\\SupportedApps\\AsrockRackIPMI\\AsrockRackIPMI' => __DIR__ . '/../..' . '/app/SupportedApps/AsrockRackIPMI/AsrockRackIPMI.php',
+ 'App\\SupportedApps\\Bacula\\Bacula' => __DIR__ . '/../..' . '/app/SupportedApps/Bacula/Bacula.php',
+ 'App\\SupportedApps\\Baikal\\Baikal' => __DIR__ . '/../..' . '/app/SupportedApps/Baikal/Baikal.php',
+ 'App\\SupportedApps\\Bastillion\\Bastillion' => __DIR__ . '/../..' . '/app/SupportedApps/Bastillion/Bastillion.php',
+ 'App\\SupportedApps\\Bazarr\\Bazarr' => __DIR__ . '/../..' . '/app/SupportedApps/Bazarr/Bazarr.php',
+ 'App\\SupportedApps\\Bitwarden\\Bitwarden' => __DIR__ . '/../..' . '/app/SupportedApps/Bitwarden/Bitwarden.php',
+ 'App\\SupportedApps\\Booksonic\\Booksonic' => __DIR__ . '/../..' . '/app/SupportedApps/Booksonic/Booksonic.php',
+ 'App\\SupportedApps\\Bookstack\\Bookstack' => __DIR__ . '/../..' . '/app/SupportedApps/Bookstack/Bookstack.php',
+ 'App\\SupportedApps\\Box\\Box' => __DIR__ . '/../..' . '/app/SupportedApps/Box/Box.php',
+ 'App\\SupportedApps\\Cabot\\Cabot' => __DIR__ . '/../..' . '/app/SupportedApps/Cabot/Cabot.php',
+ 'App\\SupportedApps\\CalibreWeb\\CalibreWeb' => __DIR__ . '/../..' . '/app/SupportedApps/CalibreWeb/CalibreWeb.php',
+ 'App\\SupportedApps\\Cardigann\\Cardigann' => __DIR__ . '/../..' . '/app/SupportedApps/Cardigann/Cardigann.php',
+ 'App\\SupportedApps\\ChangeDetectionio\\ChangeDetectionio' => __DIR__ . '/../..' . '/app/SupportedApps/ChangeDetectionio/ChangeDetectionio.php',
+ 'App\\SupportedApps\\CheckMK\\CheckMK' => __DIR__ . '/../..' . '/app/SupportedApps/CheckMK/CheckMK.php',
+ 'App\\SupportedApps\\Chevereto\\Chevereto' => __DIR__ . '/../..' . '/app/SupportedApps/Chevereto/Chevereto.php',
+ 'App\\SupportedApps\\Chronograf\\Chronograf' => __DIR__ . '/../..' . '/app/SupportedApps/Chronograf/Chronograf.php',
+ 'App\\SupportedApps\\Clarkson\\Clarkson' => __DIR__ . '/../..' . '/app/SupportedApps/Clarkson/Clarkson.php',
+ 'App\\SupportedApps\\CloudCMD\\CloudCMD' => __DIR__ . '/../..' . '/app/SupportedApps/CloudCMD/CloudCMD.php',
+ 'App\\SupportedApps\\CockpitCMS\\CockpitCMS' => __DIR__ . '/../..' . '/app/SupportedApps/CockpitCMS/CockpitCMS.php',
+ 'App\\SupportedApps\\Cockpit\\Cockpit' => __DIR__ . '/../..' . '/app/SupportedApps/Cockpit/Cockpit.php',
+ 'App\\SupportedApps\\Codeserver\\Codeserver' => __DIR__ . '/../..' . '/app/SupportedApps/Codeserver/Codeserver.php',
+ 'App\\SupportedApps\\CodiMD\\CodiMD' => __DIR__ . '/../..' . '/app/SupportedApps/CodiMD/CodiMD.php',
+ 'App\\SupportedApps\\Concourse\\Concourse' => __DIR__ . '/../..' . '/app/SupportedApps/Concourse/Concourse.php',
+ 'App\\SupportedApps\\Confluence\\Confluence' => __DIR__ . '/../..' . '/app/SupportedApps/Confluence/Confluence.php',
+ 'App\\SupportedApps\\CouchPotato\\CouchPotato' => __DIR__ . '/../..' . '/app/SupportedApps/CouchPotato/CouchPotato.php',
+ 'App\\SupportedApps\\CryptPad\\CryptPad' => __DIR__ . '/../..' . '/app/SupportedApps/CryptPad/CryptPad.php',
+ 'App\\SupportedApps\\Deluge\\Deluge' => __DIR__ . '/../..' . '/app/SupportedApps/Deluge/Deluge.php',
+ 'App\\SupportedApps\\Dillinger\\Dillinger' => __DIR__ . '/../..' . '/app/SupportedApps/Dillinger/Dillinger.php',
+ 'App\\SupportedApps\\Directus\\Directus' => __DIR__ . '/../..' . '/app/SupportedApps/Directus/Directus.php',
+ 'App\\SupportedApps\\DokuWiki\\DokuWiki' => __DIR__ . '/../..' . '/app/SupportedApps/DokuWiki/DokuWiki.php',
+ 'App\\SupportedApps\\Domoticz\\Domoticz' => __DIR__ . '/../..' . '/app/SupportedApps/Domoticz/Domoticz.php',
+ 'App\\SupportedApps\\Dozzle\\Dozzle' => __DIR__ . '/../..' . '/app/SupportedApps/Dozzle/Dozzle.php',
+ 'App\\SupportedApps\\Drone\\Drone' => __DIR__ . '/../..' . '/app/SupportedApps/Drone/Drone.php',
+ 'App\\SupportedApps\\Droppy\\Droppy' => __DIR__ . '/../..' . '/app/SupportedApps/Droppy/Droppy.php',
+ 'App\\SupportedApps\\Duplicacy\\Duplicacy' => __DIR__ . '/../..' . '/app/SupportedApps/Duplicacy/Duplicacy.php',
+ 'App\\SupportedApps\\Duplicati\\Duplicati' => __DIR__ . '/../..' . '/app/SupportedApps/Duplicati/Duplicati.php',
+ 'App\\SupportedApps\\ESPHome\\ESPHome' => __DIR__ . '/../..' . '/app/SupportedApps/ESPHome/ESPHome.php',
+ 'App\\SupportedApps\\Element\\Element' => __DIR__ . '/../..' . '/app/SupportedApps/Element/Element.php',
+ 'App\\SupportedApps\\EmbyStat\\EmbyStat' => __DIR__ . '/../..' . '/app/SupportedApps/EmbyStat/EmbyStat.php',
+ 'App\\SupportedApps\\Emby\\Emby' => __DIR__ . '/../..' . '/app/SupportedApps/Emby/Emby.php',
+ 'App\\SupportedApps\\FileBrowser\\FileBrowser' => __DIR__ . '/../..' . '/app/SupportedApps/FileBrowser/FileBrowser.php',
+ 'App\\SupportedApps\\FileFlows\\FileFlows' => __DIR__ . '/../..' . '/app/SupportedApps/FileFlows/FileFlows.php',
+ 'App\\SupportedApps\\FileRun\\FileRun' => __DIR__ . '/../..' . '/app/SupportedApps/FileRun/FileRun.php',
+ 'App\\SupportedApps\\Firefly\\Firefly' => __DIR__ . '/../..' . '/app/SupportedApps/Firefly/Firefly.php',
+ 'App\\SupportedApps\\FirefoxSend\\FirefoxSend' => __DIR__ . '/../..' . '/app/SupportedApps/FirefoxSend/FirefoxSend.php',
+ 'App\\SupportedApps\\FlexGet\\FlexGet' => __DIR__ . '/../..' . '/app/SupportedApps/FlexGet/FlexGet.php',
+ 'App\\SupportedApps\\Flood\\Flood' => __DIR__ . '/../..' . '/app/SupportedApps/Flood/Flood.php',
+ 'App\\SupportedApps\\Focalboard\\Focalboard' => __DIR__ . '/../..' . '/app/SupportedApps/Focalboard/Focalboard.php',
+ 'App\\SupportedApps\\FoldingHome\\FoldingHome' => __DIR__ . '/../..' . '/app/SupportedApps/FoldingHome/FoldingHome.php',
+ 'App\\SupportedApps\\FortinetFortiMonitor\\FortinetFortiMonitor' => __DIR__ . '/../..' . '/app/SupportedApps/FortinetFortiMonitor/FortinetFortiMonitor.php',
+ 'App\\SupportedApps\\Freenas\\Freenas' => __DIR__ . '/../..' . '/app/SupportedApps/Freenas/Freenas.php',
+ 'App\\SupportedApps\\FreshRSS\\FreshRSS' => __DIR__ . '/../..' . '/app/SupportedApps/FreshRSS/FreshRSS.php',
+ 'App\\SupportedApps\\Fronius\\Fronius' => __DIR__ . '/../..' . '/app/SupportedApps/Fronius/Fronius.php',
+ 'App\\SupportedApps\\Funkwhale\\Funkwhale' => __DIR__ . '/../..' . '/app/SupportedApps/Funkwhale/Funkwhale.php',
+ 'App\\SupportedApps\\Ghost\\Ghost' => __DIR__ . '/../..' . '/app/SupportedApps/Ghost/Ghost.php',
+ 'App\\SupportedApps\\GitHub\\GitHub' => __DIR__ . '/../..' . '/app/SupportedApps/GitHub/GitHub.php',
+ 'App\\SupportedApps\\GitLab\\GitLab' => __DIR__ . '/../..' . '/app/SupportedApps/GitLab/GitLab.php',
+ 'App\\SupportedApps\\Gitea\\Gitea' => __DIR__ . '/../..' . '/app/SupportedApps/Gitea/Gitea.php',
+ 'App\\SupportedApps\\Glances\\Glances' => __DIR__ . '/../..' . '/app/SupportedApps/Glances/Glances.php',
+ 'App\\SupportedApps\\Gogs\\Gogs' => __DIR__ . '/../..' . '/app/SupportedApps/Gogs/Gogs.php',
+ 'App\\SupportedApps\\Gotify\\Gotify' => __DIR__ . '/../..' . '/app/SupportedApps/Gotify/Gotify.php',
+ 'App\\SupportedApps\\Grafana\\Grafana' => __DIR__ . '/../..' . '/app/SupportedApps/Grafana/Grafana.php',
+ 'App\\SupportedApps\\Grav\\Grav' => __DIR__ . '/../..' . '/app/SupportedApps/Grav/Grav.php',
+ 'App\\SupportedApps\\Graylog\\Graylog' => __DIR__ . '/../..' . '/app/SupportedApps/Graylog/Graylog.php',
+ 'App\\SupportedApps\\Grocy\\Grocy' => __DIR__ . '/../..' . '/app/SupportedApps/Grocy/Grocy.php',
+ 'App\\SupportedApps\\Guacamole\\Guacamole' => __DIR__ . '/../..' . '/app/SupportedApps/Guacamole/Guacamole.php',
+ 'App\\SupportedApps\\HAProxy\\HAProxy' => __DIR__ . '/../..' . '/app/SupportedApps/HAProxy/HAProxy.php',
+ 'App\\SupportedApps\\HDHomeRun\\HDHomeRun' => __DIR__ . '/../..' . '/app/SupportedApps/HDHomeRun/HDHomeRun.php',
+ 'App\\SupportedApps\\Handbrake\\Handbrake' => __DIR__ . '/../..' . '/app/SupportedApps/Handbrake/Handbrake.php',
+ 'App\\SupportedApps\\Hasura\\Hasura' => __DIR__ . '/../..' . '/app/SupportedApps/Hasura/Hasura.php',
+ 'App\\SupportedApps\\Headphones\\Headphones' => __DIR__ . '/../..' . '/app/SupportedApps/Headphones/Headphones.php',
+ 'App\\SupportedApps\\Healthchecks\\Healthchecks' => __DIR__ . '/../..' . '/app/SupportedApps/Healthchecks/Healthchecks.php',
+ 'App\\SupportedApps\\HomeAssistant\\HomeAssistant' => __DIR__ . '/../..' . '/app/SupportedApps/HomeAssistant/HomeAssistant.php',
+ 'App\\SupportedApps\\Homebridge\\Homebridge' => __DIR__ . '/../..' . '/app/SupportedApps/Homebridge/Homebridge.php',
+ 'App\\SupportedApps\\Homer\\Homer' => __DIR__ . '/../..' . '/app/SupportedApps/Homer/Homer.php',
+ 'App\\SupportedApps\\Hubitat\\Hubitat' => __DIR__ . '/../..' . '/app/SupportedApps/Hubitat/Hubitat.php',
+ 'App\\SupportedApps\\Huginn\\Huginn' => __DIR__ . '/../..' . '/app/SupportedApps/Huginn/Huginn.php',
+ 'App\\SupportedApps\\Icecast\\Icecast' => __DIR__ . '/../..' . '/app/SupportedApps/Icecast/Icecast.php',
+ 'App\\SupportedApps\\IcingaWeb\\IcingaWeb' => __DIR__ . '/../..' . '/app/SupportedApps/IcingaWeb/IcingaWeb.php',
+ 'App\\SupportedApps\\InfluxDB\\InfluxDB' => __DIR__ . '/../..' . '/app/SupportedApps/InfluxDB/InfluxDB.php',
+ 'App\\SupportedApps\\Infoblox\\Infoblox' => __DIR__ . '/../..' . '/app/SupportedApps/Infoblox/Infoblox.php',
+ 'App\\SupportedApps\\Invidious\\Invidious' => __DIR__ . '/../..' . '/app/SupportedApps/Invidious/Invidious.php',
+ 'App\\SupportedApps\\InvoiceNinja\\InvoiceNinja' => __DIR__ . '/../..' . '/app/SupportedApps/InvoiceNinja/InvoiceNinja.php',
+ 'App\\SupportedApps\\JDownloader\\JDownloader' => __DIR__ . '/../..' . '/app/SupportedApps/JDownloader/JDownloader.php',
+ 'App\\SupportedApps\\Jackett\\Jackett' => __DIR__ . '/../..' . '/app/SupportedApps/Jackett/Jackett.php',
+ 'App\\SupportedApps\\Jaeger\\Jaeger' => __DIR__ . '/../..' . '/app/SupportedApps/Jaeger/Jaeger.php',
+ 'App\\SupportedApps\\Jeedom\\Jeedom' => __DIR__ . '/../..' . '/app/SupportedApps/Jeedom/Jeedom.php',
+ 'App\\SupportedApps\\Jellyfin\\Jellyfin' => __DIR__ . '/../..' . '/app/SupportedApps/Jellyfin/Jellyfin.php',
+ 'App\\SupportedApps\\Jenkins\\Jenkins' => __DIR__ . '/../..' . '/app/SupportedApps/Jenkins/Jenkins.php',
+ 'App\\SupportedApps\\Jira\\Jira' => __DIR__ . '/../..' . '/app/SupportedApps/Jira/Jira.php',
+ 'App\\SupportedApps\\Jitsi\\Jitsi' => __DIR__ . '/../..' . '/app/SupportedApps/Jitsi/Jitsi.php',
+ 'App\\SupportedApps\\Joomla\\Joomla' => __DIR__ . '/../..' . '/app/SupportedApps/Joomla/Joomla.php',
+ 'App\\SupportedApps\\Jupyter\\Jupyter' => __DIR__ . '/../..' . '/app/SupportedApps/Jupyter/Jupyter.php',
+ 'App\\SupportedApps\\Kanboard\\Kanboard' => __DIR__ . '/../..' . '/app/SupportedApps/Kanboard/Kanboard.php',
+ 'App\\SupportedApps\\Keycloak\\Keycloak' => __DIR__ . '/../..' . '/app/SupportedApps/Keycloak/Keycloak.php',
+ 'App\\SupportedApps\\Kibana\\Kibana' => __DIR__ . '/../..' . '/app/SupportedApps/Kibana/Kibana.php',
+ 'App\\SupportedApps\\Kimai\\Kimai' => __DIR__ . '/../..' . '/app/SupportedApps/Kimai/Kimai.php',
+ 'App\\SupportedApps\\Kitana\\Kitana' => __DIR__ . '/../..' . '/app/SupportedApps/Kitana/Kitana.php',
+ 'App\\SupportedApps\\Kodi\\Kodi' => __DIR__ . '/../..' . '/app/SupportedApps/Kodi/Kodi.php',
+ 'App\\SupportedApps\\Komga\\Komga' => __DIR__ . '/../..' . '/app/SupportedApps/Komga/Komga.php',
+ 'App\\SupportedApps\\Kopia\\Kopia' => __DIR__ . '/../..' . '/app/SupportedApps/Kopia/Kopia.php',
+ 'App\\SupportedApps\\Krusader\\Krusader' => __DIR__ . '/../..' . '/app/SupportedApps/Krusader/Krusader.php',
+ 'App\\SupportedApps\\KubernetesDashboard\\KubernetesDashboard' => __DIR__ . '/../..' . '/app/SupportedApps/KubernetesDashboard/KubernetesDashboard.php',
+ 'App\\SupportedApps\\LazyLibrarian\\LazyLibrarian' => __DIR__ . '/../..' . '/app/SupportedApps/LazyLibrarian/LazyLibrarian.php',
+ 'App\\SupportedApps\\LemonLDAPNG\\LemonLDAPNG' => __DIR__ . '/../..' . '/app/SupportedApps/LemonLDAPNG/LemonLDAPNG.php',
+ 'App\\SupportedApps\\LibreNMS\\LibreNMS' => __DIR__ . '/../..' . '/app/SupportedApps/LibreNMS/LibreNMS.php',
+ 'App\\SupportedApps\\LibreSpeed\\LibreSpeed' => __DIR__ . '/../..' . '/app/SupportedApps/LibreSpeed/LibreSpeed.php',
+ 'App\\SupportedApps\\Lidarr\\Lidarr' => __DIR__ . '/../..' . '/app/SupportedApps/Lidarr/Lidarr.php',
+ 'App\\SupportedApps\\LinkAce\\LinkAce' => __DIR__ . '/../..' . '/app/SupportedApps/LinkAce/LinkAce.php',
+ 'App\\SupportedApps\\Lychee\\Lychee' => __DIR__ . '/../..' . '/app/SupportedApps/Lychee/Lychee.php',
+ 'App\\SupportedApps\\MailcowSOGo\\MailcowSOGo' => __DIR__ . '/../..' . '/app/SupportedApps/MailcowSOGo/MailcowSOGo.php',
+ 'App\\SupportedApps\\Mailcow\\Mailcow' => __DIR__ . '/../..' . '/app/SupportedApps/Mailcow/Mailcow.php',
+ 'App\\SupportedApps\\Mailhog\\Mailhog' => __DIR__ . '/../..' . '/app/SupportedApps/Mailhog/Mailhog.php',
+ 'App\\SupportedApps\\Mainsail\\Mainsail' => __DIR__ . '/../..' . '/app/SupportedApps/Mainsail/Mainsail.php',
+ 'App\\SupportedApps\\Mastodon\\Mastodon' => __DIR__ . '/../..' . '/app/SupportedApps/Mastodon/Mastodon.php',
+ 'App\\SupportedApps\\Mattermost\\Mattermost' => __DIR__ . '/../..' . '/app/SupportedApps/Mattermost/Mattermost.php',
+ 'App\\SupportedApps\\MayanEDMS\\MayanEDMS' => __DIR__ . '/../..' . '/app/SupportedApps/MayanEDMS/MayanEDMS.php',
+ 'App\\SupportedApps\\McMyAdmin\\McMyAdmin' => __DIR__ . '/../..' . '/app/SupportedApps/McMyAdmin/McMyAdmin.php',
+ 'App\\SupportedApps\\Mealie\\Mealie' => __DIR__ . '/../..' . '/app/SupportedApps/Mealie/Mealie.php',
+ 'App\\SupportedApps\\MediaWiki\\MediaWiki' => __DIR__ . '/../..' . '/app/SupportedApps/MediaWiki/MediaWiki.php',
+ 'App\\SupportedApps\\Medusa\\Medusa' => __DIR__ . '/../..' . '/app/SupportedApps/Medusa/Medusa.php',
+ 'App\\SupportedApps\\Meraki\\Meraki' => __DIR__ . '/../..' . '/app/SupportedApps/Meraki/Meraki.php',
+ 'App\\SupportedApps\\MineOS\\MineOS' => __DIR__ . '/../..' . '/app/SupportedApps/MineOS/MineOS.php',
+ 'App\\SupportedApps\\Miniflux\\Miniflux' => __DIR__ . '/../..' . '/app/SupportedApps/Miniflux/Miniflux.php',
+ 'App\\SupportedApps\\Minio\\Minio' => __DIR__ . '/../..' . '/app/SupportedApps/Minio/Minio.php',
+ 'App\\SupportedApps\\Monica\\Monica' => __DIR__ . '/../..' . '/app/SupportedApps/Monica/Monica.php',
+ 'App\\SupportedApps\\Monit\\Monit' => __DIR__ . '/../..' . '/app/SupportedApps/Monit/Monit.php',
+ 'App\\SupportedApps\\MotionEye\\MotionEye' => __DIR__ . '/../..' . '/app/SupportedApps/MotionEye/MotionEye.php',
+ 'App\\SupportedApps\\MusicBrainz\\MusicBrainz' => __DIR__ . '/../..' . '/app/SupportedApps/MusicBrainz/MusicBrainz.php',
+ 'App\\SupportedApps\\Mylar\\Mylar' => __DIR__ . '/../..' . '/app/SupportedApps/Mylar/Mylar.php',
+ 'App\\SupportedApps\\NZBHydra\\NZBHydra' => __DIR__ . '/../..' . '/app/SupportedApps/NZBHydra/NZBHydra.php',
+ 'App\\SupportedApps\\Navidrome\\Navidrome' => __DIR__ . '/../..' . '/app/SupportedApps/Navidrome/Navidrome.php',
+ 'App\\SupportedApps\\Nessus\\Nessus' => __DIR__ . '/../..' . '/app/SupportedApps/Nessus/Nessus.php',
+ 'App\\SupportedApps\\NetBox\\NetBox' => __DIR__ . '/../..' . '/app/SupportedApps/NetBox/NetBox.php',
+ 'App\\SupportedApps\\Netatmo\\Netatmo' => __DIR__ . '/../..' . '/app/SupportedApps/Netatmo/Netatmo.php',
+ 'App\\SupportedApps\\Netboot\\Netboot' => __DIR__ . '/../..' . '/app/SupportedApps/Netboot/Netboot.php',
+ 'App\\SupportedApps\\Netdata\\Netdata' => __DIR__ . '/../..' . '/app/SupportedApps/Netdata/Netdata.php',
+ 'App\\SupportedApps\\Nextcloud\\Nextcloud' => __DIR__ . '/../..' . '/app/SupportedApps/Nextcloud/Nextcloud.php',
+ 'App\\SupportedApps\\NginxProxyManager\\NginxProxyManager' => __DIR__ . '/../..' . '/app/SupportedApps/NginxProxyManager/NginxProxyManager.php',
+ 'App\\SupportedApps\\Nitter\\Nitter' => __DIR__ . '/../..' . '/app/SupportedApps/Nitter/Nitter.php',
+ 'App\\SupportedApps\\NodeRed\\NodeRed' => __DIR__ . '/../..' . '/app/SupportedApps/NodeRed/NodeRed.php',
+ 'App\\SupportedApps\\NowShowing\\NowShowing' => __DIR__ . '/../..' . '/app/SupportedApps/NowShowing/NowShowing.php',
+ 'App\\SupportedApps\\NxFilter\\NxFilter' => __DIR__ . '/../..' . '/app/SupportedApps/NxFilter/NxFilter.php',
+ 'App\\SupportedApps\\Nzbget\\Nzbget' => __DIR__ . '/../..' . '/app/SupportedApps/Nzbget/Nzbget.php',
+ 'App\\SupportedApps\\OPNsense\\OPNsense' => __DIR__ . '/../..' . '/app/SupportedApps/OPNsense/OPNsense.php',
+ 'App\\SupportedApps\\Octoprint\\Octoprint' => __DIR__ . '/../..' . '/app/SupportedApps/Octoprint/Octoprint.php',
+ 'App\\SupportedApps\\Ombi\\Ombi' => __DIR__ . '/../..' . '/app/SupportedApps/Ombi/Ombi.php',
+ 'App\\SupportedApps\\OmniDB\\OmniDB' => __DIR__ . '/../..' . '/app/SupportedApps/OmniDB/OmniDB.php',
+ 'App\\SupportedApps\\OnlyOffice\\OnlyOffice' => __DIR__ . '/../..' . '/app/SupportedApps/OnlyOffice/OnlyOffice.php',
+ 'App\\SupportedApps\\OpenMapTiler\\OpenMapTiler' => __DIR__ . '/../..' . '/app/SupportedApps/OpenMapTiler/OpenMapTiler.php',
+ 'App\\SupportedApps\\OpenSpeedTest\\OpenSpeedTest' => __DIR__ . '/../..' . '/app/SupportedApps/OpenSpeedTest/OpenSpeedTest.php',
+ 'App\\SupportedApps\\OpenSprinkler\\OpenSprinkler' => __DIR__ . '/../..' . '/app/SupportedApps/OpenSprinkler/OpenSprinkler.php',
+ 'App\\SupportedApps\\OpenWrt\\OpenWrt' => __DIR__ . '/../..' . '/app/SupportedApps/OpenWrt/OpenWrt.php',
+ 'App\\SupportedApps\\Oscarr\\Oscarr' => __DIR__ . '/../..' . '/app/SupportedApps/Oscarr/Oscarr.php',
+ 'App\\SupportedApps\\Overseerr\\Overseerr' => __DIR__ . '/../..' . '/app/SupportedApps/Overseerr/Overseerr.php',
+ 'App\\SupportedApps\\OwnPhotos\\OwnPhotos' => __DIR__ . '/../..' . '/app/SupportedApps/OwnPhotos/OwnPhotos.php',
+ 'App\\SupportedApps\\PRTG\\PRTG' => __DIR__ . '/../..' . '/app/SupportedApps/PRTG/PRTG.php',
+ 'App\\SupportedApps\\PaloAltoNetworks\\PaloAltoNetworks' => __DIR__ . '/../..' . '/app/SupportedApps/PaloAltoNetworks/PaloAltoNetworks.php',
+ 'App\\SupportedApps\\Paperless\\Paperless' => __DIR__ . '/../..' . '/app/SupportedApps/Paperless/Paperless.php',
+ 'App\\SupportedApps\\PartKeepr\\PartKeepr' => __DIR__ . '/../..' . '/app/SupportedApps/PartKeepr/PartKeepr.php',
+ 'App\\SupportedApps\\PeerTube\\PeerTube' => __DIR__ . '/../..' . '/app/SupportedApps/PeerTube/PeerTube.php',
+ 'App\\SupportedApps\\PhotoPrism\\PhotoPrism' => __DIR__ . '/../..' . '/app/SupportedApps/PhotoPrism/PhotoPrism.php',
+ 'App\\SupportedApps\\Photonix\\Photonix' => __DIR__ . '/../..' . '/app/SupportedApps/Photonix/Photonix.php',
+ 'App\\SupportedApps\\PiAware\\PiAware' => __DIR__ . '/../..' . '/app/SupportedApps/PiAware/PiAware.php',
+ 'App\\SupportedApps\\PiVPN\\PiVPN' => __DIR__ . '/../..' . '/app/SupportedApps/PiVPN/PiVPN.php',
+ 'App\\SupportedApps\\Pihole\\Pihole' => __DIR__ . '/../..' . '/app/SupportedApps/Pihole/Pihole.php',
+ 'App\\SupportedApps\\Piwigo\\Piwigo' => __DIR__ . '/../..' . '/app/SupportedApps/Piwigo/Piwigo.php',
+ 'App\\SupportedApps\\Pleroma\\Pleroma' => __DIR__ . '/../..' . '/app/SupportedApps/Pleroma/Pleroma.php',
+ 'App\\SupportedApps\\Plesk\\Plesk' => __DIR__ . '/../..' . '/app/SupportedApps/Plesk/Plesk.php',
+ 'App\\SupportedApps\\PlexRequests\\PlexRequests' => __DIR__ . '/../..' . '/app/SupportedApps/PlexRequests/PlexRequests.php',
+ 'App\\SupportedApps\\Plex\\Plex' => __DIR__ . '/../..' . '/app/SupportedApps/Plex/Plex.php',
+ 'App\\SupportedApps\\Plume\\Plume' => __DIR__ . '/../..' . '/app/SupportedApps/Plume/Plume.php',
+ 'App\\SupportedApps\\Portainer\\Portainer' => __DIR__ . '/../..' . '/app/SupportedApps/Portainer/Portainer.php',
+ 'App\\SupportedApps\\Poste\\Poste' => __DIR__ . '/../..' . '/app/SupportedApps/Poste/Poste.php',
+ 'App\\SupportedApps\\Printer\\Printer' => __DIR__ . '/../..' . '/app/SupportedApps/Printer/Printer.php',
+ 'App\\SupportedApps\\Privatebin\\Privatebin' => __DIR__ . '/../..' . '/app/SupportedApps/Privatebin/Privatebin.php',
+ 'App\\SupportedApps\\ProjectSend\\ProjectSend' => __DIR__ . '/../..' . '/app/SupportedApps/ProjectSend/ProjectSend.php',
+ 'App\\SupportedApps\\Prometheus\\Prometheus' => __DIR__ . '/../..' . '/app/SupportedApps/Prometheus/Prometheus.php',
+ 'App\\SupportedApps\\Prowlarr\\Prowlarr' => __DIR__ . '/../..' . '/app/SupportedApps/Prowlarr/Prowlarr.php',
+ 'App\\SupportedApps\\Proxmox\\Proxmox' => __DIR__ . '/../..' . '/app/SupportedApps/Proxmox/Proxmox.php',
+ 'App\\SupportedApps\\PsiTransfer\\PsiTransfer' => __DIR__ . '/../..' . '/app/SupportedApps/PsiTransfer/PsiTransfer.php',
+ 'App\\SupportedApps\\Pterodactyl\\Pterodactyl' => __DIR__ . '/../..' . '/app/SupportedApps/Pterodactyl/Pterodactyl.php',
+ 'App\\SupportedApps\\QNAP\\QNAP' => __DIR__ . '/../..' . '/app/SupportedApps/QNAP/QNAP.php',
+ 'App\\SupportedApps\\RStudioServer\\RStudioServer' => __DIR__ . '/../..' . '/app/SupportedApps/RStudioServer/RStudioServer.php',
+ 'App\\SupportedApps\\Radarr\\Radarr' => __DIR__ . '/../..' . '/app/SupportedApps/Radarr/Radarr.php',
+ 'App\\SupportedApps\\Rainloop\\Rainloop' => __DIR__ . '/../..' . '/app/SupportedApps/Rainloop/Rainloop.php',
+ 'App\\SupportedApps\\Rancher\\Rancher' => __DIR__ . '/../..' . '/app/SupportedApps/Rancher/Rancher.php',
+ 'App\\SupportedApps\\Raneto\\Raneto' => __DIR__ . '/../..' . '/app/SupportedApps/Raneto/Raneto.php',
+ 'App\\SupportedApps\\Rclone\\Rclone' => __DIR__ . '/../..' . '/app/SupportedApps/Rclone/Rclone.php',
+ 'App\\SupportedApps\\Readarr\\Readarr' => __DIR__ . '/../..' . '/app/SupportedApps/Readarr/Readarr.php',
+ 'App\\SupportedApps\\Recalbox\\Recalbox' => __DIR__ . '/../..' . '/app/SupportedApps/Recalbox/Recalbox.php',
+ 'App\\SupportedApps\\Requestrr\\Requestrr' => __DIR__ . '/../..' . '/app/SupportedApps/Requestrr/Requestrr.php',
+ 'App\\SupportedApps\\ResilioSync\\ResilioSync' => __DIR__ . '/../..' . '/app/SupportedApps/ResilioSync/ResilioSync.php',
+ 'App\\SupportedApps\\RiotWeb\\RiotWeb' => __DIR__ . '/../..' . '/app/SupportedApps/RiotWeb/RiotWeb.php',
+ 'App\\SupportedApps\\RocketChat\\RocketChat' => __DIR__ . '/../..' . '/app/SupportedApps/RocketChat/RocketChat.php',
+ 'App\\SupportedApps\\RompЯ\\RompЯ' => __DIR__ . '/../..' . '/app/SupportedApps/RompЯ/RompЯ.php',
+ 'App\\SupportedApps\\Roundcube\\Roundcube' => __DIR__ . '/../..' . '/app/SupportedApps/Roundcube/Roundcube.php',
+ 'App\\SupportedApps\\Router\\Router' => __DIR__ . '/../..' . '/app/SupportedApps/Router/Router.php',
+ 'App\\SupportedApps\\Rspamd\\Rspamd' => __DIR__ . '/../..' . '/app/SupportedApps/Rspamd/Rspamd.php',
+ 'App\\SupportedApps\\Rundeck\\Rundeck' => __DIR__ . '/../..' . '/app/SupportedApps/Rundeck/Rundeck.php',
+ 'App\\SupportedApps\\RuneAudio\\RuneAudio' => __DIR__ . '/../..' . '/app/SupportedApps/RuneAudio/RuneAudio.php',
+ 'App\\SupportedApps\\SABnzbd\\SABnzbd' => __DIR__ . '/../..' . '/app/SupportedApps/SABnzbd/SABnzbd.php',
+ 'App\\SupportedApps\\SOGo\\SOGo' => __DIR__ . '/../..' . '/app/SupportedApps/SOGo/SOGo.php',
+ 'App\\SupportedApps\\Seafile\\Seafile' => __DIR__ . '/../..' . '/app/SupportedApps/Seafile/Seafile.php',
+ 'App\\SupportedApps\\SearxMetasearchEngine\\SearxMetasearchEngine' => __DIR__ . '/../..' . '/app/SupportedApps/SearxMetasearchEngine/SearxMetasearchEngine.php',
+ 'App\\SupportedApps\\Serviio\\Serviio' => __DIR__ . '/../..' . '/app/SupportedApps/Serviio/Serviio.php',
+ 'App\\SupportedApps\\Shaarli\\Shaarli' => __DIR__ . '/../..' . '/app/SupportedApps/Shaarli/Shaarli.php',
+ 'App\\SupportedApps\\Shinobi\\Shinobi' => __DIR__ . '/../..' . '/app/SupportedApps/Shinobi/Shinobi.php',
+ 'App\\SupportedApps\\SickBeard\\SickBeard' => __DIR__ . '/../..' . '/app/SupportedApps/SickBeard/SickBeard.php',
+ 'App\\SupportedApps\\SickGear\\SickGear' => __DIR__ . '/../..' . '/app/SupportedApps/SickGear/SickGear.php',
+ 'App\\SupportedApps\\Sickchill\\Sickchill' => __DIR__ . '/../..' . '/app/SupportedApps/Sickchill/Sickchill.php',
+ 'App\\SupportedApps\\Slack\\Slack' => __DIR__ . '/../..' . '/app/SupportedApps/Slack/Slack.php',
+ 'App\\SupportedApps\\Snibox\\Snibox' => __DIR__ . '/../..' . '/app/SupportedApps/Snibox/Snibox.php',
+ 'App\\SupportedApps\\SonarQube\\SonarQube' => __DIR__ . '/../..' . '/app/SupportedApps/SonarQube/SonarQube.php',
+ 'App\\SupportedApps\\Sonarr\\Sonarr' => __DIR__ . '/../..' . '/app/SupportedApps/Sonarr/Sonarr.php',
+ 'App\\SupportedApps\\Sourcegraph\\Sourcegraph' => __DIR__ . '/../..' . '/app/SupportedApps/Sourcegraph/Sourcegraph.php',
+ 'App\\SupportedApps\\Splunk\\Splunk' => __DIR__ . '/../..' . '/app/SupportedApps/Splunk/Splunk.php',
+ 'App\\SupportedApps\\Spotweb\\Spotweb' => __DIR__ . '/../..' . '/app/SupportedApps/Spotweb/Spotweb.php',
+ 'App\\SupportedApps\\Squidex\\Squidex' => __DIR__ . '/../..' . '/app/SupportedApps/Squidex/Squidex.php',
+ 'App\\SupportedApps\\Stash\\Stash' => __DIR__ . '/../..' . '/app/SupportedApps/Stash/Stash.php',
+ 'App\\SupportedApps\\Statping\\Statping' => __DIR__ . '/../..' . '/app/SupportedApps/Statping/Statping.php',
+ 'App\\SupportedApps\\Strapi\\Strapi' => __DIR__ . '/../..' . '/app/SupportedApps/Strapi/Strapi.php',
+ 'App\\SupportedApps\\Streama\\Streama' => __DIR__ . '/../..' . '/app/SupportedApps/Streama/Streama.php',
+ 'App\\SupportedApps\\Sympa\\Sympa' => __DIR__ . '/../..' . '/app/SupportedApps/Sympa/Sympa.php',
+ 'App\\SupportedApps\\Synclounge\\Synclounge' => __DIR__ . '/../..' . '/app/SupportedApps/Synclounge/Synclounge.php',
+ 'App\\SupportedApps\\Syncthing\\Syncthing' => __DIR__ . '/../..' . '/app/SupportedApps/Syncthing/Syncthing.php',
+ 'App\\SupportedApps\\Synology\\Synology' => __DIR__ . '/../..' . '/app/SupportedApps/Synology/Synology.php',
+ 'App\\SupportedApps\\TVHeadend\\TVHeadend' => __DIR__ . '/../..' . '/app/SupportedApps/TVHeadend/TVHeadend.php',
+ 'App\\SupportedApps\\TYPO\\TYPO' => __DIR__ . '/../..' . '/app/SupportedApps/TYPO/TYPO.php',
+ 'App\\SupportedApps\\Taiga\\Taiga' => __DIR__ . '/../..' . '/app/SupportedApps/Taiga/Taiga.php',
+ 'App\\SupportedApps\\TandoorRecipes\\TandoorRecipes' => __DIR__ . '/../..' . '/app/SupportedApps/TandoorRecipes/TandoorRecipes.php',
+ 'App\\SupportedApps\\TarTenNinety\\TarTenNinety' => __DIR__ . '/../..' . '/app/SupportedApps/TarTenNinety/TarTenNinety.php',
+ 'App\\SupportedApps\\TasmoAdmin\\TasmoAdmin' => __DIR__ . '/../..' . '/app/SupportedApps/TasmoAdmin/TasmoAdmin.php',
+ 'App\\SupportedApps\\Tasmota\\Tasmota' => __DIR__ . '/../..' . '/app/SupportedApps/Tasmota/Tasmota.php',
+ 'App\\SupportedApps\\Tautulli\\Tautulli' => __DIR__ . '/../..' . '/app/SupportedApps/Tautulli/Tautulli.php',
+ 'App\\SupportedApps\\Tdarr\\Tdarr' => __DIR__ . '/../..' . '/app/SupportedApps/Tdarr/Tdarr.php',
+ 'App\\SupportedApps\\Teedy\\Teedy' => __DIR__ . '/../..' . '/app/SupportedApps/Teedy/Teedy.php',
+ 'App\\SupportedApps\\TheLounge\\TheLounge' => __DIR__ . '/../..' . '/app/SupportedApps/TheLounge/TheLounge.php',
+ 'App\\SupportedApps\\TinyTinyRSS\\TinyTinyRSS' => __DIR__ . '/../..' . '/app/SupportedApps/TinyTinyRSS/TinyTinyRSS.php',
+ 'App\\SupportedApps\\Traccar\\Traccar' => __DIR__ . '/../..' . '/app/SupportedApps/Traccar/Traccar.php',
+ 'App\\SupportedApps\\Traefik\\Traefik' => __DIR__ . '/../..' . '/app/SupportedApps/Traefik/Traefik.php',
+ 'App\\SupportedApps\\Transmission\\Transmission' => __DIR__ . '/../..' . '/app/SupportedApps/Transmission/Transmission.php',
+ 'App\\SupportedApps\\Trilium\\Trilium' => __DIR__ . '/../..' . '/app/SupportedApps/Trilium/Trilium.php',
+ 'App\\SupportedApps\\TrueNASCORE\\TrueNASCORE' => __DIR__ . '/../..' . '/app/SupportedApps/TrueNASCORE/TrueNASCORE.php',
+ 'App\\SupportedApps\\TrueNAS\\TrueNAS' => __DIR__ . '/../..' . '/app/SupportedApps/TrueNAS/TrueNAS.php',
+ 'App\\SupportedApps\\Ubooquity\\Ubooquity' => __DIR__ . '/../..' . '/app/SupportedApps/Ubooquity/Ubooquity.php',
+ 'App\\SupportedApps\\UniFi\\UniFi' => __DIR__ . '/../..' . '/app/SupportedApps/UniFi/UniFi.php',
+ 'App\\SupportedApps\\Unraid\\Unraid' => __DIR__ . '/../..' . '/app/SupportedApps/Unraid/Unraid.php',
+ 'App\\SupportedApps\\UrBackup\\UrBackup' => __DIR__ . '/../..' . '/app/SupportedApps/UrBackup/UrBackup.php',
+ 'App\\SupportedApps\\VMwareESXi\\VMwareESXi' => __DIR__ . '/../..' . '/app/SupportedApps/VMwareESXi/VMwareESXi.php',
+ 'App\\SupportedApps\\VMwarevCenter\\VMwarevCenter' => __DIR__ . '/../..' . '/app/SupportedApps/VMwarevCenter/VMwarevCenter.php',
+ 'App\\SupportedApps\\ViMbAdmin\\ViMbAdmin' => __DIR__ . '/../..' . '/app/SupportedApps/ViMbAdmin/ViMbAdmin.php',
+ 'App\\SupportedApps\\VirtualRadarServer\\VirtualRadarServer' => __DIR__ . '/../..' . '/app/SupportedApps/VirtualRadarServer/VirtualRadarServer.php',
+ 'App\\SupportedApps\\Virtualmin\\Virtualmin' => __DIR__ . '/../..' . '/app/SupportedApps/Virtualmin/Virtualmin.php',
+ 'App\\SupportedApps\\Volumio\\Volumio' => __DIR__ . '/../..' . '/app/SupportedApps/Volumio/Volumio.php',
+ 'App\\SupportedApps\\VuPlus\\VuPlus' => __DIR__ . '/../..' . '/app/SupportedApps/VuPlus/VuPlus.php',
+ 'App\\SupportedApps\\Wallabag\\Wallabag' => __DIR__ . '/../..' . '/app/SupportedApps/Wallabag/Wallabag.php',
+ 'App\\SupportedApps\\WaniKani\\WaniKani' => __DIR__ . '/../..' . '/app/SupportedApps/WaniKani/WaniKani.php',
+ 'App\\SupportedApps\\Watcher\\Watcher' => __DIR__ . '/../..' . '/app/SupportedApps/Watcher/Watcher.php',
+ 'App\\SupportedApps\\WebTools\\WebTools' => __DIR__ . '/../..' . '/app/SupportedApps/WebTools/WebTools.php',
+ 'App\\SupportedApps\\Webmin\\Webmin' => __DIR__ . '/../..' . '/app/SupportedApps/Webmin/Webmin.php',
+ 'App\\SupportedApps\\Wekan\\Wekan' => __DIR__ . '/../..' . '/app/SupportedApps/Wekan/Wekan.php',
+ 'App\\SupportedApps\\Wetty\\Wetty' => __DIR__ . '/../..' . '/app/SupportedApps/Wetty/Wetty.php',
+ 'App\\SupportedApps\\WgGenWeb\\WgGenWeb' => __DIR__ . '/../..' . '/app/SupportedApps/WgGenWeb/WgGenWeb.php',
+ 'App\\SupportedApps\\Wikijs\\Wikijs' => __DIR__ . '/../..' . '/app/SupportedApps/Wikijs/Wikijs.php',
+ 'App\\SupportedApps\\WireGuard\\WireGuard' => __DIR__ . '/../..' . '/app/SupportedApps/WireGuard/WireGuard.php',
+ 'App\\SupportedApps\\Wordpress\\Wordpress' => __DIR__ . '/../..' . '/app/SupportedApps/Wordpress/Wordpress.php',
+ 'App\\SupportedApps\\XWiki\\XWiki' => __DIR__ . '/../..' . '/app/SupportedApps/XWiki/XWiki.php',
+ 'App\\SupportedApps\\XenOrchestra\\XenOrchestra' => __DIR__ . '/../..' . '/app/SupportedApps/XenOrchestra/XenOrchestra.php',
+ 'App\\SupportedApps\\Xigmanas\\Xigmanas' => __DIR__ . '/../..' . '/app/SupportedApps/Xigmanas/Xigmanas.php',
+ 'App\\SupportedApps\\YNAB\\YNAB' => __DIR__ . '/../..' . '/app/SupportedApps/YNAB/YNAB.php',
+ 'App\\SupportedApps\\ZNC\\ZNC' => __DIR__ . '/../..' . '/app/SupportedApps/ZNC/ZNC.php',
+ 'App\\SupportedApps\\Zabbix\\Zabbix' => __DIR__ . '/../..' . '/app/SupportedApps/Zabbix/Zabbix.php',
+ 'App\\SupportedApps\\Zammad\\Zammad' => __DIR__ . '/../..' . '/app/SupportedApps/Zammad/Zammad.php',
+ 'App\\SupportedApps\\ZoneMinder\\ZoneMinder' => __DIR__ . '/../..' . '/app/SupportedApps/ZoneMinder/ZoneMinder.php',
+ 'App\\SupportedApps\\Zulip\\Zulip' => __DIR__ . '/../..' . '/app/SupportedApps/Zulip/Zulip.php',
+ 'App\\SupportedApps\\cPanel\\cPanel' => __DIR__ . '/../..' . '/app/SupportedApps/cPanel/cPanel.php',
+ 'App\\SupportedApps\\iDRAC\\iDRAC' => __DIR__ . '/../..' . '/app/SupportedApps/iDRAC/iDRAC.php',
+ 'App\\SupportedApps\\iLO\\iLO' => __DIR__ . '/../..' . '/app/SupportedApps/iLO/iLO.php',
+ 'App\\SupportedApps\\ioBroker\\ioBroker' => __DIR__ . '/../..' . '/app/SupportedApps/ioBroker/ioBroker.php',
+ 'App\\SupportedApps\\neightn\\neightn' => __DIR__ . '/../..' . '/app/SupportedApps/neightn/neightn.php',
+ 'App\\SupportedApps\\openHAB\\openHAB' => __DIR__ . '/../..' . '/app/SupportedApps/openHAB/openHAB.php',
+ 'App\\SupportedApps\\openmediavault\\openmediavault' => __DIR__ . '/../..' . '/app/SupportedApps/openmediavault/openmediavault.php',
+ 'App\\SupportedApps\\osTicket\\osTicket' => __DIR__ . '/../..' . '/app/SupportedApps/osTicket/osTicket.php',
+ 'App\\SupportedApps\\ownCloud\\ownCloud' => __DIR__ . '/../..' . '/app/SupportedApps/ownCloud/ownCloud.php',
+ 'App\\SupportedApps\\pfSense\\pfSense' => __DIR__ . '/../..' . '/app/SupportedApps/pfSense/pfSense.php',
+ 'App\\SupportedApps\\pgAdmin\\pgAdmin' => __DIR__ . '/../..' . '/app/SupportedApps/pgAdmin/pgAdmin.php',
+ 'App\\SupportedApps\\phpIPAM\\phpIPAM' => __DIR__ . '/../..' . '/app/SupportedApps/phpIPAM/phpIPAM.php',
+ 'App\\SupportedApps\\phpLDAPadmin\\phpLDAPadmin' => __DIR__ . '/../..' . '/app/SupportedApps/phpLDAPadmin/phpLDAPadmin.php',
+ 'App\\SupportedApps\\phpMyAdmin\\phpMyAdmin' => __DIR__ . '/../..' . '/app/SupportedApps/phpMyAdmin/phpMyAdmin.php',
+ 'App\\SupportedApps\\pyLoad\\pyLoad' => __DIR__ . '/../..' . '/app/SupportedApps/pyLoad/pyLoad.php',
+ 'App\\SupportedApps\\qBittorrent\\qBittorrent' => __DIR__ . '/../..' . '/app/SupportedApps/qBittorrent/qBittorrent.php',
+ 'App\\SupportedApps\\ruTorrent\\ruTorrent' => __DIR__ . '/../..' . '/app/SupportedApps/ruTorrent/ruTorrent.php',
+ 'App\\SupportedApps\\vmwarehorizon\\vmwarehorizon' => __DIR__ . '/../..' . '/app/SupportedApps/vmwarehorizon/vmwarehorizon.php',
+ 'App\\SupportedApps\\xTeVe\\xTeVe' => __DIR__ . '/../..' . '/app/SupportedApps/xTeVe/xTeVe.php',
+ 'App\\SupportedApps\\youtubedl\\youtubedl' => __DIR__ . '/../..' . '/app/SupportedApps/youtubedl/youtubedl.php',
'App\\User' => __DIR__ . '/../..' . '/app/User.php',
'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
'Brick\\Math\\BigDecimal' => __DIR__ . '/..' . '/brick/math/src/BigDecimal.php',
@@ -5162,6 +5476,18 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf
'Symfony\\Component\\VarExporter\\Internal\\Registry' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Registry.php',
'Symfony\\Component\\VarExporter\\Internal\\Values' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Values.php',
'Symfony\\Component\\VarExporter\\VarExporter' => __DIR__ . '/..' . '/symfony/var-exporter/VarExporter.php',
+ 'Symfony\\Component\\Yaml\\Command\\LintCommand' => __DIR__ . '/..' . '/symfony/yaml/Command/LintCommand.php',
+ 'Symfony\\Component\\Yaml\\Dumper' => __DIR__ . '/..' . '/symfony/yaml/Dumper.php',
+ 'Symfony\\Component\\Yaml\\Escaper' => __DIR__ . '/..' . '/symfony/yaml/Escaper.php',
+ 'Symfony\\Component\\Yaml\\Exception\\DumpException' => __DIR__ . '/..' . '/symfony/yaml/Exception/DumpException.php',
+ 'Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/yaml/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\Yaml\\Exception\\ParseException' => __DIR__ . '/..' . '/symfony/yaml/Exception/ParseException.php',
+ 'Symfony\\Component\\Yaml\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/yaml/Exception/RuntimeException.php',
+ 'Symfony\\Component\\Yaml\\Inline' => __DIR__ . '/..' . '/symfony/yaml/Inline.php',
+ 'Symfony\\Component\\Yaml\\Parser' => __DIR__ . '/..' . '/symfony/yaml/Parser.php',
+ 'Symfony\\Component\\Yaml\\Tag\\TaggedValue' => __DIR__ . '/..' . '/symfony/yaml/Tag/TaggedValue.php',
+ 'Symfony\\Component\\Yaml\\Unescaper' => __DIR__ . '/..' . '/symfony/yaml/Unescaper.php',
+ 'Symfony\\Component\\Yaml\\Yaml' => __DIR__ . '/..' . '/symfony/yaml/Yaml.php',
'Symfony\\Contracts\\Cache\\CacheInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/CacheInterface.php',
'Symfony\\Contracts\\Cache\\CacheTrait' => __DIR__ . '/..' . '/symfony/cache-contracts/CacheTrait.php',
'Symfony\\Contracts\\Cache\\CallbackInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/CallbackInterface.php',
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 9a071bde..b4bf6a53 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -8000,6 +8000,84 @@
],
"install-path": "../symfony/var-exporter"
},
+ {
+ "name": "symfony/yaml",
+ "version": "v5.4.3",
+ "version_normalized": "5.4.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "e80f87d2c9495966768310fc531b487ce64237a2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/e80f87d2c9495966768310fc531b487ce64237a2",
+ "reference": "e80f87d2c9495966768310fc531b487ce64237a2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "symfony/console": "<5.3"
+ },
+ "require-dev": {
+ "symfony/console": "^5.3|^6.0"
+ },
+ "suggest": {
+ "symfony/console": "For validating YAML files using the lint command"
+ },
+ "time": "2022-01-26T16:32:32+00:00",
+ "bin": [
+ "Resources/bin/yaml-lint"
+ ],
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Loads and dumps YAML files",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/yaml/tree/v5.4.3"
+ },
+ "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"
+ }
+ ],
+ "install-path": "../symfony/yaml"
+ },
{
"name": "theseer/tokenizer",
"version": "1.2.1",
diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php
index de1f5c57..22ebde03 100644
--- a/vendor/composer/installed.php
+++ b/vendor/composer/installed.php
@@ -5,7 +5,7 @@
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
- 'reference' => 'f9a19fce91446a34aa433bb1426491fbb2005611',
+ 'reference' => '96ec1e0b08d37ac3a4beea6d9d9076b6e3f6d58e',
'name' => 'laravel/laravel',
'dev' => true,
),
@@ -379,7 +379,7 @@
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
- 'reference' => 'f9a19fce91446a34aa433bb1426491fbb2005611',
+ 'reference' => '96ec1e0b08d37ac3a4beea6d9d9076b6e3f6d58e',
'dev_requirement' => false,
),
'laravel/tinker' => array(
@@ -1271,6 +1271,15 @@
'reference' => '49e2355fe6f59ea30c18ebb68edf13b7e20582e5',
'dev_requirement' => false,
),
+ 'symfony/yaml' => array(
+ 'pretty_version' => 'v5.4.3',
+ 'version' => '5.4.3.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../symfony/yaml',
+ 'aliases' => array(),
+ 'reference' => 'e80f87d2c9495966768310fc531b487ce64237a2',
+ 'dev_requirement' => false,
+ ),
'theseer/tokenizer' => array(
'pretty_version' => '1.2.1',
'version' => '1.2.1.0',
diff --git a/vendor/symfony/yaml/CHANGELOG.md b/vendor/symfony/yaml/CHANGELOG.md
new file mode 100644
index 00000000..b9561b2a
--- /dev/null
+++ b/vendor/symfony/yaml/CHANGELOG.md
@@ -0,0 +1,237 @@
+CHANGELOG
+=========
+
+5.4
+---
+
+ * Add new `lint:yaml dirname --exclude=/dirname/foo.yaml --exclude=/dirname/bar.yaml`
+ option to exclude one or more specific files from multiple file list
+ * Allow negatable for the parse tags option with `--no-parse-tags`
+
+5.3
+---
+
+ * Added `github` format support & autodetection to render errors as annotations
+ when running the YAML linter command in a Github Action environment.
+
+5.1.0
+-----
+
+ * Added support for parsing numbers prefixed with `0o` as octal numbers.
+ * Deprecated support for parsing numbers starting with `0` as octal numbers. They will be parsed as strings as of Symfony 6.0. Prefix numbers with `0o`
+ so that they are parsed as octal numbers.
+
+ Before:
+
+ ```yaml
+ Yaml::parse('072');
+ ```
+
+ After:
+
+ ```yaml
+ Yaml::parse('0o72');
+ ```
+
+ * Added `yaml-lint` binary.
+ * Deprecated using the `!php/object` and `!php/const` tags without a value.
+
+5.0.0
+-----
+
+ * Removed support for mappings inside multi-line strings.
+ * removed support for implicit STDIN usage in the `lint:yaml` command, use `lint:yaml -` (append a dash) instead to make it explicit.
+
+4.4.0
+-----
+
+ * Added support for parsing the inline notation spanning multiple lines.
+ * Added support to dump `null` as `~` by using the `Yaml::DUMP_NULL_AS_TILDE` flag.
+ * deprecated accepting STDIN implicitly when using the `lint:yaml` command, use `lint:yaml -` (append a dash) instead to make it explicit.
+
+4.3.0
+-----
+
+ * Using a mapping inside a multi-line string is deprecated and will throw a `ParseException` in 5.0.
+
+4.2.0
+-----
+
+ * added support for multiple files or directories in `LintCommand`
+
+4.0.0
+-----
+
+ * The behavior of the non-specific tag `!` is changed and now forces
+ non-evaluating your values.
+ * complex mappings will throw a `ParseException`
+ * support for the comma as a group separator for floats has been dropped, use
+ the underscore instead
+ * support for the `!!php/object` tag has been dropped, use the `!php/object`
+ tag instead
+ * duplicate mapping keys throw a `ParseException`
+ * non-string mapping keys throw a `ParseException`, use the `Yaml::PARSE_KEYS_AS_STRINGS`
+ flag to cast them to strings
+ * `%` at the beginning of an unquoted string throw a `ParseException`
+ * mappings with a colon (`:`) that is not followed by a whitespace throw a
+ `ParseException`
+ * the `Dumper::setIndentation()` method has been removed
+ * being able to pass boolean options to the `Yaml::parse()`, `Yaml::dump()`,
+ `Parser::parse()`, and `Dumper::dump()` methods to configure the behavior of
+ the parser and dumper is no longer supported, pass bitmask flags instead
+ * the constructor arguments of the `Parser` class have been removed
+ * the `Inline` class is internal and no longer part of the BC promise
+ * removed support for the `!str` tag, use the `!!str` tag instead
+ * added support for tagged scalars.
+
+ ```yml
+ Yaml::parse('!foo bar', Yaml::PARSE_CUSTOM_TAGS);
+ // returns TaggedValue('foo', 'bar');
+ ```
+
+3.4.0
+-----
+
+ * added support for parsing YAML files using the `Yaml::parseFile()` or `Parser::parseFile()` method
+
+ * the `Dumper`, `Parser`, and `Yaml` classes are marked as final
+
+ * Deprecated the `!php/object:` tag which will be replaced by the
+ `!php/object` tag (without the colon) in 4.0.
+
+ * Deprecated the `!php/const:` tag which will be replaced by the
+ `!php/const` tag (without the colon) in 4.0.
+
+ * Support for the `!str` tag is deprecated, use the `!!str` tag instead.
+
+ * Deprecated using the non-specific tag `!` as its behavior will change in 4.0.
+ It will force non-evaluating your values in 4.0. Use plain integers or `!!float` instead.
+
+3.3.0
+-----
+
+ * Starting an unquoted string with a question mark followed by a space is
+ deprecated and will throw a `ParseException` in Symfony 4.0.
+
+ * Deprecated support for implicitly parsing non-string mapping keys as strings.
+ Mapping keys that are no strings will lead to a `ParseException` in Symfony
+ 4.0. Use quotes to opt-in for keys to be parsed as strings.
+
+ Before:
+
+ ```php
+ $yaml = << new A(), 'bar' => 1], 0, 0, Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE | Yaml::DUMP_OBJECT);
+ ```
+
+3.0.0
+-----
+
+ * Yaml::parse() now throws an exception when a blackslash is not escaped
+ in double-quoted strings
+
+2.8.0
+-----
+
+ * Deprecated usage of a colon in an unquoted mapping value
+ * Deprecated usage of @, \`, | and > at the beginning of an unquoted string
+ * When surrounding strings with double-quotes, you must now escape `\` characters. Not
+ escaping those characters (when surrounded by double-quotes) is deprecated.
+
+ Before:
+
+ ```yml
+ class: "Foo\Var"
+ ```
+
+ After:
+
+ ```yml
+ class: "Foo\\Var"
+ ```
+
+2.1.0
+-----
+
+ * Yaml::parse() does not evaluate loaded files as PHP files by default
+ anymore (call Yaml::enablePhpParsing() to get back the old behavior)
diff --git a/vendor/symfony/yaml/Command/LintCommand.php b/vendor/symfony/yaml/Command/LintCommand.php
new file mode 100644
index 00000000..3ebd570e
--- /dev/null
+++ b/vendor/symfony/yaml/Command/LintCommand.php
@@ -0,0 +1,289 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml\Command;
+
+use Symfony\Component\Console\CI\GithubActionReporter;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Completion\CompletionInput;
+use Symfony\Component\Console\Completion\CompletionSuggestions;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Exception\RuntimeException;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\Yaml\Exception\ParseException;
+use Symfony\Component\Yaml\Parser;
+use Symfony\Component\Yaml\Yaml;
+
+/**
+ * Validates YAML files syntax and outputs encountered errors.
+ *
+ * @author Grégoire Pineau
+ * @author Robin Chalas
+ */
+class LintCommand extends Command
+{
+ protected static $defaultName = 'lint:yaml';
+ protected static $defaultDescription = 'Lint a YAML file and outputs encountered errors';
+
+ private $parser;
+ private $format;
+ private $displayCorrectFiles;
+ private $directoryIteratorProvider;
+ private $isReadableProvider;
+
+ public function __construct(string $name = null, callable $directoryIteratorProvider = null, callable $isReadableProvider = null)
+ {
+ parent::__construct($name);
+
+ $this->directoryIteratorProvider = $directoryIteratorProvider;
+ $this->isReadableProvider = $isReadableProvider;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function configure()
+ {
+ $this
+ ->setDescription(self::$defaultDescription)
+ ->addArgument('filename', InputArgument::IS_ARRAY, 'A file, a directory or "-" for reading from STDIN')
+ ->addOption('format', null, InputOption::VALUE_REQUIRED, 'The output format')
+ ->addOption('exclude', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Path(s) to exclude')
+ ->addOption('parse-tags', null, InputOption::VALUE_NEGATABLE, 'Parse custom tags', null)
+ ->setHelp(<<%command.name% command lints a YAML file and outputs to STDOUT
+the first encountered syntax error.
+
+You can validates YAML contents passed from STDIN:
+
+ cat filename | php %command.full_name% -
+
+You can also validate the syntax of a file:
+
+ php %command.full_name% filename
+
+Or of a whole directory:
+
+ php %command.full_name% dirname
+ php %command.full_name% dirname --format=json
+
+You can also exclude one or more specific files:
+
+ php %command.full_name% dirname --exclude="dirname/foo.yaml" --exclude="dirname/bar.yaml"
+
+EOF
+ )
+ ;
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output)
+ {
+ $io = new SymfonyStyle($input, $output);
+ $filenames = (array) $input->getArgument('filename');
+ $excludes = $input->getOption('exclude');
+ $this->format = $input->getOption('format');
+ $flags = $input->getOption('parse-tags');
+
+ if ('github' === $this->format && !class_exists(GithubActionReporter::class)) {
+ throw new \InvalidArgumentException('The "github" format is only available since "symfony/console" >= 5.3.');
+ }
+
+ if (null === $this->format) {
+ // Autodetect format according to CI environment
+ $this->format = class_exists(GithubActionReporter::class) && GithubActionReporter::isGithubActionEnvironment() ? 'github' : 'txt';
+ }
+
+ $flags = $flags ? Yaml::PARSE_CUSTOM_TAGS : 0;
+
+ $this->displayCorrectFiles = $output->isVerbose();
+
+ if (['-'] === $filenames) {
+ return $this->display($io, [$this->validate(file_get_contents('php://stdin'), $flags)]);
+ }
+
+ if (!$filenames) {
+ throw new RuntimeException('Please provide a filename or pipe file content to STDIN.');
+ }
+
+ $filesInfo = [];
+ foreach ($filenames as $filename) {
+ if (!$this->isReadable($filename)) {
+ throw new RuntimeException(sprintf('File or directory "%s" is not readable.', $filename));
+ }
+
+ foreach ($this->getFiles($filename) as $file) {
+ if (!\in_array($file->getPathname(), $excludes, true)) {
+ $filesInfo[] = $this->validate(file_get_contents($file), $flags, $file);
+ }
+ }
+ }
+
+ return $this->display($io, $filesInfo);
+ }
+
+ private function validate(string $content, int $flags, string $file = null)
+ {
+ $prevErrorHandler = set_error_handler(function ($level, $message, $file, $line) use (&$prevErrorHandler) {
+ if (\E_USER_DEPRECATED === $level) {
+ throw new ParseException($message, $this->getParser()->getRealCurrentLineNb() + 1);
+ }
+
+ return $prevErrorHandler ? $prevErrorHandler($level, $message, $file, $line) : false;
+ });
+
+ try {
+ $this->getParser()->parse($content, Yaml::PARSE_CONSTANT | $flags);
+ } catch (ParseException $e) {
+ return ['file' => $file, 'line' => $e->getParsedLine(), 'valid' => false, 'message' => $e->getMessage()];
+ } finally {
+ restore_error_handler();
+ }
+
+ return ['file' => $file, 'valid' => true];
+ }
+
+ private function display(SymfonyStyle $io, array $files): int
+ {
+ switch ($this->format) {
+ case 'txt':
+ return $this->displayTxt($io, $files);
+ case 'json':
+ return $this->displayJson($io, $files);
+ case 'github':
+ return $this->displayTxt($io, $files, true);
+ default:
+ throw new InvalidArgumentException(sprintf('The format "%s" is not supported.', $this->format));
+ }
+ }
+
+ private function displayTxt(SymfonyStyle $io, array $filesInfo, bool $errorAsGithubAnnotations = false): int
+ {
+ $countFiles = \count($filesInfo);
+ $erroredFiles = 0;
+ $suggestTagOption = false;
+
+ if ($errorAsGithubAnnotations) {
+ $githubReporter = new GithubActionReporter($io);
+ }
+
+ foreach ($filesInfo as $info) {
+ if ($info['valid'] && $this->displayCorrectFiles) {
+ $io->comment('OK'.($info['file'] ? sprintf(' in %s', $info['file']) : ''));
+ } elseif (!$info['valid']) {
+ ++$erroredFiles;
+ $io->text(' ERROR '.($info['file'] ? sprintf(' in %s', $info['file']) : ''));
+ $io->text(sprintf(' >> %s', $info['message']));
+
+ if (false !== strpos($info['message'], 'PARSE_CUSTOM_TAGS')) {
+ $suggestTagOption = true;
+ }
+
+ if ($errorAsGithubAnnotations) {
+ $githubReporter->error($info['message'], $info['file'] ?? 'php://stdin', $info['line']);
+ }
+ }
+ }
+
+ if (0 === $erroredFiles) {
+ $io->success(sprintf('All %d YAML files contain valid syntax.', $countFiles));
+ } else {
+ $io->warning(sprintf('%d YAML files have valid syntax and %d contain errors.%s', $countFiles - $erroredFiles, $erroredFiles, $suggestTagOption ? ' Use the --parse-tags option if you want parse custom tags.' : ''));
+ }
+
+ return min($erroredFiles, 1);
+ }
+
+ private function displayJson(SymfonyStyle $io, array $filesInfo): int
+ {
+ $errors = 0;
+
+ array_walk($filesInfo, function (&$v) use (&$errors) {
+ $v['file'] = (string) $v['file'];
+ if (!$v['valid']) {
+ ++$errors;
+ }
+
+ if (isset($v['message']) && false !== strpos($v['message'], 'PARSE_CUSTOM_TAGS')) {
+ $v['message'] .= ' Use the --parse-tags option if you want parse custom tags.';
+ }
+ });
+
+ $io->writeln(json_encode($filesInfo, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES));
+
+ return min($errors, 1);
+ }
+
+ private function getFiles(string $fileOrDirectory): iterable
+ {
+ if (is_file($fileOrDirectory)) {
+ yield new \SplFileInfo($fileOrDirectory);
+
+ return;
+ }
+
+ foreach ($this->getDirectoryIterator($fileOrDirectory) as $file) {
+ if (!\in_array($file->getExtension(), ['yml', 'yaml'])) {
+ continue;
+ }
+
+ yield $file;
+ }
+ }
+
+ private function getParser(): Parser
+ {
+ if (!$this->parser) {
+ $this->parser = new Parser();
+ }
+
+ return $this->parser;
+ }
+
+ private function getDirectoryIterator(string $directory): iterable
+ {
+ $default = function ($directory) {
+ return new \RecursiveIteratorIterator(
+ new \RecursiveDirectoryIterator($directory, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS),
+ \RecursiveIteratorIterator::LEAVES_ONLY
+ );
+ };
+
+ if (null !== $this->directoryIteratorProvider) {
+ return ($this->directoryIteratorProvider)($directory, $default);
+ }
+
+ return $default($directory);
+ }
+
+ private function isReadable(string $fileOrDirectory): bool
+ {
+ $default = function ($fileOrDirectory) {
+ return is_readable($fileOrDirectory);
+ };
+
+ if (null !== $this->isReadableProvider) {
+ return ($this->isReadableProvider)($fileOrDirectory, $default);
+ }
+
+ return $default($fileOrDirectory);
+ }
+
+ public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
+ {
+ if ($input->mustSuggestOptionValuesFor('format')) {
+ $suggestions->suggestValues(['txt', 'json', 'github']);
+ }
+ }
+}
diff --git a/vendor/symfony/yaml/Dumper.php b/vendor/symfony/yaml/Dumper.php
new file mode 100644
index 00000000..db3e346b
--- /dev/null
+++ b/vendor/symfony/yaml/Dumper.php
@@ -0,0 +1,140 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml;
+
+use Symfony\Component\Yaml\Tag\TaggedValue;
+
+/**
+ * Dumper dumps PHP variables to YAML strings.
+ *
+ * @author Fabien Potencier
+ *
+ * @final
+ */
+class Dumper
+{
+ /**
+ * The amount of spaces to use for indentation of nested nodes.
+ *
+ * @var int
+ */
+ protected $indentation;
+
+ public function __construct(int $indentation = 4)
+ {
+ if ($indentation < 1) {
+ throw new \InvalidArgumentException('The indentation must be greater than zero.');
+ }
+
+ $this->indentation = $indentation;
+ }
+
+ /**
+ * Dumps a PHP value to YAML.
+ *
+ * @param mixed $input The PHP value
+ * @param int $inline The level where you switch to inline YAML
+ * @param int $indent The level of indentation (used internally)
+ * @param int $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string
+ */
+ public function dump($input, int $inline = 0, int $indent = 0, int $flags = 0): string
+ {
+ $output = '';
+ $prefix = $indent ? str_repeat(' ', $indent) : '';
+ $dumpObjectAsInlineMap = true;
+
+ if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($input instanceof \ArrayObject || $input instanceof \stdClass)) {
+ $dumpObjectAsInlineMap = empty((array) $input);
+ }
+
+ if ($inline <= 0 || (!\is_array($input) && !$input instanceof TaggedValue && $dumpObjectAsInlineMap) || empty($input)) {
+ $output .= $prefix.Inline::dump($input, $flags);
+ } else {
+ $dumpAsMap = Inline::isHash($input);
+
+ foreach ($input as $key => $value) {
+ if ('' !== $output && "\n" !== $output[-1]) {
+ $output .= "\n";
+ }
+
+ if (Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \is_string($value) && false !== strpos($value, "\n") && false === strpos($value, "\r")) {
+ // If the first line starts with a space character, the spec requires a blockIndicationIndicator
+ // http://www.yaml.org/spec/1.2/spec.html#id2793979
+ $blockIndentationIndicator = (' ' === substr($value, 0, 1)) ? (string) $this->indentation : '';
+
+ if (isset($value[-2]) && "\n" === $value[-2] && "\n" === $value[-1]) {
+ $blockChompingIndicator = '+';
+ } elseif ("\n" === $value[-1]) {
+ $blockChompingIndicator = '';
+ } else {
+ $blockChompingIndicator = '-';
+ }
+
+ $output .= sprintf('%s%s%s |%s%s', $prefix, $dumpAsMap ? Inline::dump($key, $flags).':' : '-', '', $blockIndentationIndicator, $blockChompingIndicator);
+
+ foreach (explode("\n", $value) as $row) {
+ if ('' === $row) {
+ $output .= "\n";
+ } else {
+ $output .= sprintf("\n%s%s%s", $prefix, str_repeat(' ', $this->indentation), $row);
+ }
+ }
+
+ continue;
+ }
+
+ if ($value instanceof TaggedValue) {
+ $output .= sprintf('%s%s !%s', $prefix, $dumpAsMap ? Inline::dump($key, $flags).':' : '-', $value->getTag());
+
+ if (Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \is_string($value->getValue()) && false !== strpos($value->getValue(), "\n") && false === strpos($value->getValue(), "\r\n")) {
+ // If the first line starts with a space character, the spec requires a blockIndicationIndicator
+ // http://www.yaml.org/spec/1.2/spec.html#id2793979
+ $blockIndentationIndicator = (' ' === substr($value->getValue(), 0, 1)) ? (string) $this->indentation : '';
+ $output .= sprintf(' |%s', $blockIndentationIndicator);
+
+ foreach (explode("\n", $value->getValue()) as $row) {
+ $output .= sprintf("\n%s%s%s", $prefix, str_repeat(' ', $this->indentation), $row);
+ }
+
+ continue;
+ }
+
+ if ($inline - 1 <= 0 || null === $value->getValue() || is_scalar($value->getValue())) {
+ $output .= ' '.$this->dump($value->getValue(), $inline - 1, 0, $flags)."\n";
+ } else {
+ $output .= "\n";
+ $output .= $this->dump($value->getValue(), $inline - 1, $dumpAsMap ? $indent + $this->indentation : $indent + 2, $flags);
+ }
+
+ continue;
+ }
+
+ $dumpObjectAsInlineMap = true;
+
+ if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($value instanceof \ArrayObject || $value instanceof \stdClass)) {
+ $dumpObjectAsInlineMap = empty((array) $value);
+ }
+
+ $willBeInlined = $inline - 1 <= 0 || !\is_array($value) && $dumpObjectAsInlineMap || empty($value);
+
+ $output .= sprintf('%s%s%s%s',
+ $prefix,
+ $dumpAsMap ? Inline::dump($key, $flags).':' : '-',
+ $willBeInlined ? ' ' : "\n",
+ $this->dump($value, $inline - 1, $willBeInlined ? 0 : $indent + $this->indentation, $flags)
+ ).($willBeInlined ? "\n" : '');
+ }
+ }
+
+ return $output;
+ }
+}
diff --git a/vendor/symfony/yaml/Escaper.php b/vendor/symfony/yaml/Escaper.php
new file mode 100644
index 00000000..e8090d8c
--- /dev/null
+++ b/vendor/symfony/yaml/Escaper.php
@@ -0,0 +1,95 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml;
+
+/**
+ * Escaper encapsulates escaping rules for single and double-quoted
+ * YAML strings.
+ *
+ * @author Matthew Lewinski
+ *
+ * @internal
+ */
+class Escaper
+{
+ // Characters that would cause a dumped string to require double quoting.
+ public const REGEX_CHARACTER_TO_ESCAPE = "[\\x00-\\x1f]|\x7f|\xc2\x85|\xc2\xa0|\xe2\x80\xa8|\xe2\x80\xa9";
+
+ // Mapping arrays for escaping a double quoted string. The backslash is
+ // first to ensure proper escaping because str_replace operates iteratively
+ // on the input arrays. This ordering of the characters avoids the use of strtr,
+ // which performs more slowly.
+ private const ESCAPEES = ['\\', '\\\\', '\\"', '"',
+ "\x00", "\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07",
+ "\x08", "\x09", "\x0a", "\x0b", "\x0c", "\x0d", "\x0e", "\x0f",
+ "\x10", "\x11", "\x12", "\x13", "\x14", "\x15", "\x16", "\x17",
+ "\x18", "\x19", "\x1a", "\x1b", "\x1c", "\x1d", "\x1e", "\x1f",
+ "\x7f",
+ "\xc2\x85", "\xc2\xa0", "\xe2\x80\xa8", "\xe2\x80\xa9",
+ ];
+ private const ESCAPED = ['\\\\', '\\"', '\\\\', '\\"',
+ '\\0', '\\x01', '\\x02', '\\x03', '\\x04', '\\x05', '\\x06', '\\a',
+ '\\b', '\\t', '\\n', '\\v', '\\f', '\\r', '\\x0e', '\\x0f',
+ '\\x10', '\\x11', '\\x12', '\\x13', '\\x14', '\\x15', '\\x16', '\\x17',
+ '\\x18', '\\x19', '\\x1a', '\\e', '\\x1c', '\\x1d', '\\x1e', '\\x1f',
+ '\\x7f',
+ '\\N', '\\_', '\\L', '\\P',
+ ];
+
+ /**
+ * Determines if a PHP value would require double quoting in YAML.
+ *
+ * @param string $value A PHP value
+ */
+ public static function requiresDoubleQuoting(string $value): bool
+ {
+ return 0 < preg_match('/'.self::REGEX_CHARACTER_TO_ESCAPE.'/u', $value);
+ }
+
+ /**
+ * Escapes and surrounds a PHP value with double quotes.
+ *
+ * @param string $value A PHP value
+ */
+ public static function escapeWithDoubleQuotes(string $value): string
+ {
+ return sprintf('"%s"', str_replace(self::ESCAPEES, self::ESCAPED, $value));
+ }
+
+ /**
+ * Determines if a PHP value would require single quoting in YAML.
+ *
+ * @param string $value A PHP value
+ */
+ public static function requiresSingleQuoting(string $value): bool
+ {
+ // Determines if a PHP value is entirely composed of a value that would
+ // require single quoting in YAML.
+ if (\in_array(strtolower($value), ['null', '~', 'true', 'false', 'y', 'n', 'yes', 'no', 'on', 'off'])) {
+ return true;
+ }
+
+ // Determines if the PHP value contains any single characters that would
+ // cause it to require single quoting in YAML.
+ return 0 < preg_match('/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ \- ? | < > = ! % @ ` \p{Zs}]/xu', $value);
+ }
+
+ /**
+ * Escapes and surrounds a PHP value with single quotes.
+ *
+ * @param string $value A PHP value
+ */
+ public static function escapeWithSingleQuotes(string $value): string
+ {
+ return sprintf("'%s'", str_replace('\'', '\'\'', $value));
+ }
+}
diff --git a/vendor/symfony/yaml/Exception/DumpException.php b/vendor/symfony/yaml/Exception/DumpException.php
new file mode 100644
index 00000000..cce972f2
--- /dev/null
+++ b/vendor/symfony/yaml/Exception/DumpException.php
@@ -0,0 +1,21 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml\Exception;
+
+/**
+ * Exception class thrown when an error occurs during dumping.
+ *
+ * @author Fabien Potencier
+ */
+class DumpException extends RuntimeException
+{
+}
diff --git a/vendor/symfony/yaml/Exception/ExceptionInterface.php b/vendor/symfony/yaml/Exception/ExceptionInterface.php
new file mode 100644
index 00000000..90913168
--- /dev/null
+++ b/vendor/symfony/yaml/Exception/ExceptionInterface.php
@@ -0,0 +1,21 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml\Exception;
+
+/**
+ * Exception interface for all exceptions thrown by the component.
+ *
+ * @author Fabien Potencier
+ */
+interface ExceptionInterface extends \Throwable
+{
+}
diff --git a/vendor/symfony/yaml/Exception/ParseException.php b/vendor/symfony/yaml/Exception/ParseException.php
new file mode 100644
index 00000000..8748d2b2
--- /dev/null
+++ b/vendor/symfony/yaml/Exception/ParseException.php
@@ -0,0 +1,132 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml\Exception;
+
+/**
+ * Exception class thrown when an error occurs during parsing.
+ *
+ * @author Fabien Potencier
+ */
+class ParseException extends RuntimeException
+{
+ private $parsedFile;
+ private $parsedLine;
+ private $snippet;
+ private $rawMessage;
+
+ /**
+ * @param string $message The error message
+ * @param int $parsedLine The line where the error occurred
+ * @param string|null $snippet The snippet of code near the problem
+ * @param string|null $parsedFile The file name where the error occurred
+ */
+ public function __construct(string $message, int $parsedLine = -1, string $snippet = null, string $parsedFile = null, \Throwable $previous = null)
+ {
+ $this->parsedFile = $parsedFile;
+ $this->parsedLine = $parsedLine;
+ $this->snippet = $snippet;
+ $this->rawMessage = $message;
+
+ $this->updateRepr();
+
+ parent::__construct($this->message, 0, $previous);
+ }
+
+ /**
+ * Gets the snippet of code near the error.
+ *
+ * @return string
+ */
+ public function getSnippet()
+ {
+ return $this->snippet;
+ }
+
+ /**
+ * Sets the snippet of code near the error.
+ */
+ public function setSnippet(string $snippet)
+ {
+ $this->snippet = $snippet;
+
+ $this->updateRepr();
+ }
+
+ /**
+ * Gets the filename where the error occurred.
+ *
+ * This method returns null if a string is parsed.
+ *
+ * @return string
+ */
+ public function getParsedFile()
+ {
+ return $this->parsedFile;
+ }
+
+ /**
+ * Sets the filename where the error occurred.
+ */
+ public function setParsedFile(string $parsedFile)
+ {
+ $this->parsedFile = $parsedFile;
+
+ $this->updateRepr();
+ }
+
+ /**
+ * Gets the line where the error occurred.
+ *
+ * @return int
+ */
+ public function getParsedLine()
+ {
+ return $this->parsedLine;
+ }
+
+ /**
+ * Sets the line where the error occurred.
+ */
+ public function setParsedLine(int $parsedLine)
+ {
+ $this->parsedLine = $parsedLine;
+
+ $this->updateRepr();
+ }
+
+ private function updateRepr()
+ {
+ $this->message = $this->rawMessage;
+
+ $dot = false;
+ if ('.' === substr($this->message, -1)) {
+ $this->message = substr($this->message, 0, -1);
+ $dot = true;
+ }
+
+ if (null !== $this->parsedFile) {
+ $this->message .= sprintf(' in %s', json_encode($this->parsedFile, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE));
+ }
+
+ if ($this->parsedLine >= 0) {
+ $this->message .= sprintf(' at line %d', $this->parsedLine);
+ }
+
+ if ($this->snippet) {
+ $this->message .= sprintf(' (near "%s")', $this->snippet);
+ }
+
+ if ($dot) {
+ $this->message .= '.';
+ }
+ }
+}
diff --git a/vendor/symfony/yaml/Exception/RuntimeException.php b/vendor/symfony/yaml/Exception/RuntimeException.php
new file mode 100644
index 00000000..3f36b73b
--- /dev/null
+++ b/vendor/symfony/yaml/Exception/RuntimeException.php
@@ -0,0 +1,21 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml\Exception;
+
+/**
+ * Exception class thrown when an error occurs during parsing.
+ *
+ * @author Romain Neutron
+ */
+class RuntimeException extends \RuntimeException implements ExceptionInterface
+{
+}
diff --git a/vendor/symfony/yaml/Inline.php b/vendor/symfony/yaml/Inline.php
new file mode 100644
index 00000000..3d64b1ad
--- /dev/null
+++ b/vendor/symfony/yaml/Inline.php
@@ -0,0 +1,812 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml;
+
+use Symfony\Component\Yaml\Exception\DumpException;
+use Symfony\Component\Yaml\Exception\ParseException;
+use Symfony\Component\Yaml\Tag\TaggedValue;
+
+/**
+ * Inline implements a YAML parser/dumper for the YAML inline syntax.
+ *
+ * @author Fabien Potencier
+ *
+ * @internal
+ */
+class Inline
+{
+ public const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*+(?:\\\\.[^"\\\\]*+)*+)"|\'([^\']*+(?:\'\'[^\']*+)*+)\')';
+
+ public static $parsedLineNumber = -1;
+ public static $parsedFilename;
+
+ private static $exceptionOnInvalidType = false;
+ private static $objectSupport = false;
+ private static $objectForMap = false;
+ private static $constantSupport = false;
+
+ public static function initialize(int $flags, int $parsedLineNumber = null, string $parsedFilename = null)
+ {
+ self::$exceptionOnInvalidType = (bool) (Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE & $flags);
+ self::$objectSupport = (bool) (Yaml::PARSE_OBJECT & $flags);
+ self::$objectForMap = (bool) (Yaml::PARSE_OBJECT_FOR_MAP & $flags);
+ self::$constantSupport = (bool) (Yaml::PARSE_CONSTANT & $flags);
+ self::$parsedFilename = $parsedFilename;
+
+ if (null !== $parsedLineNumber) {
+ self::$parsedLineNumber = $parsedLineNumber;
+ }
+ }
+
+ /**
+ * Converts a YAML string to a PHP value.
+ *
+ * @param string $value A YAML string
+ * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior
+ * @param array $references Mapping of variable names to values
+ *
+ * @return mixed
+ *
+ * @throws ParseException
+ */
+ public static function parse(string $value = null, int $flags = 0, array &$references = [])
+ {
+ self::initialize($flags);
+
+ $value = trim($value);
+
+ if ('' === $value) {
+ return '';
+ }
+
+ if (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) {
+ $mbEncoding = mb_internal_encoding();
+ mb_internal_encoding('ASCII');
+ }
+
+ try {
+ $i = 0;
+ $tag = self::parseTag($value, $i, $flags);
+ switch ($value[$i]) {
+ case '[':
+ $result = self::parseSequence($value, $flags, $i, $references);
+ ++$i;
+ break;
+ case '{':
+ $result = self::parseMapping($value, $flags, $i, $references);
+ ++$i;
+ break;
+ default:
+ $result = self::parseScalar($value, $flags, null, $i, null === $tag, $references);
+ }
+
+ // some comments are allowed at the end
+ if (preg_replace('/\s*#.*$/A', '', substr($value, $i))) {
+ throw new ParseException(sprintf('Unexpected characters near "%s".', substr($value, $i)), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
+ }
+
+ if (null !== $tag && '' !== $tag) {
+ return new TaggedValue($tag, $result);
+ }
+
+ return $result;
+ } finally {
+ if (isset($mbEncoding)) {
+ mb_internal_encoding($mbEncoding);
+ }
+ }
+ }
+
+ /**
+ * Dumps a given PHP variable to a YAML string.
+ *
+ * @param mixed $value The PHP variable to convert
+ * @param int $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string
+ *
+ * @throws DumpException When trying to dump PHP resource
+ */
+ public static function dump($value, int $flags = 0): string
+ {
+ switch (true) {
+ case \is_resource($value):
+ if (Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE & $flags) {
+ throw new DumpException(sprintf('Unable to dump PHP resources in a YAML file ("%s").', get_resource_type($value)));
+ }
+
+ return self::dumpNull($flags);
+ case $value instanceof \DateTimeInterface:
+ return $value->format('c');
+ case $value instanceof \UnitEnum:
+ return sprintf('!php/const %s::%s', \get_class($value), $value->name);
+ case \is_object($value):
+ if ($value instanceof TaggedValue) {
+ return '!'.$value->getTag().' '.self::dump($value->getValue(), $flags);
+ }
+
+ if (Yaml::DUMP_OBJECT & $flags) {
+ return '!php/object '.self::dump(serialize($value));
+ }
+
+ if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($value instanceof \stdClass || $value instanceof \ArrayObject)) {
+ $output = [];
+
+ foreach ($value as $key => $val) {
+ $output[] = sprintf('%s: %s', self::dump($key, $flags), self::dump($val, $flags));
+ }
+
+ return sprintf('{ %s }', implode(', ', $output));
+ }
+
+ if (Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE & $flags) {
+ throw new DumpException('Object support when dumping a YAML file has been disabled.');
+ }
+
+ return self::dumpNull($flags);
+ case \is_array($value):
+ return self::dumpArray($value, $flags);
+ case null === $value:
+ return self::dumpNull($flags);
+ case true === $value:
+ return 'true';
+ case false === $value:
+ return 'false';
+ case \is_int($value):
+ return $value;
+ case is_numeric($value) && false === strpbrk($value, "\f\n\r\t\v"):
+ $locale = setlocale(\LC_NUMERIC, 0);
+ if (false !== $locale) {
+ setlocale(\LC_NUMERIC, 'C');
+ }
+ if (\is_float($value)) {
+ $repr = (string) $value;
+ if (is_infinite($value)) {
+ $repr = str_ireplace('INF', '.Inf', $repr);
+ } elseif (floor($value) == $value && $repr == $value) {
+ // Preserve float data type since storing a whole number will result in integer value.
+ if (false === strpos($repr, 'E')) {
+ $repr = $repr.'.0';
+ }
+ }
+ } else {
+ $repr = \is_string($value) ? "'$value'" : (string) $value;
+ }
+ if (false !== $locale) {
+ setlocale(\LC_NUMERIC, $locale);
+ }
+
+ return $repr;
+ case '' == $value:
+ return "''";
+ case self::isBinaryString($value):
+ return '!!binary '.base64_encode($value);
+ case Escaper::requiresDoubleQuoting($value):
+ return Escaper::escapeWithDoubleQuotes($value);
+ case Escaper::requiresSingleQuoting($value):
+ case Parser::preg_match('{^[0-9]+[_0-9]*$}', $value):
+ case Parser::preg_match(self::getHexRegex(), $value):
+ case Parser::preg_match(self::getTimestampRegex(), $value):
+ return Escaper::escapeWithSingleQuotes($value);
+ default:
+ return $value;
+ }
+ }
+
+ /**
+ * Check if given array is hash or just normal indexed array.
+ *
+ * @param array|\ArrayObject|\stdClass $value The PHP array or array-like object to check
+ */
+ public static function isHash($value): bool
+ {
+ if ($value instanceof \stdClass || $value instanceof \ArrayObject) {
+ return true;
+ }
+
+ $expectedKey = 0;
+
+ foreach ($value as $key => $val) {
+ if ($key !== $expectedKey++) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Dumps a PHP array to a YAML string.
+ *
+ * @param array $value The PHP array to dump
+ * @param int $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string
+ */
+ private static function dumpArray(array $value, int $flags): string
+ {
+ // array
+ if (($value || Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE & $flags) && !self::isHash($value)) {
+ $output = [];
+ foreach ($value as $val) {
+ $output[] = self::dump($val, $flags);
+ }
+
+ return sprintf('[%s]', implode(', ', $output));
+ }
+
+ // hash
+ $output = [];
+ foreach ($value as $key => $val) {
+ $output[] = sprintf('%s: %s', self::dump($key, $flags), self::dump($val, $flags));
+ }
+
+ return sprintf('{ %s }', implode(', ', $output));
+ }
+
+ private static function dumpNull(int $flags): string
+ {
+ if (Yaml::DUMP_NULL_AS_TILDE & $flags) {
+ return '~';
+ }
+
+ return 'null';
+ }
+
+ /**
+ * Parses a YAML scalar.
+ *
+ * @return mixed
+ *
+ * @throws ParseException When malformed inline YAML string is parsed
+ */
+ public static function parseScalar(string $scalar, int $flags = 0, array $delimiters = null, int &$i = 0, bool $evaluate = true, array &$references = [], bool &$isQuoted = null)
+ {
+ if (\in_array($scalar[$i], ['"', "'"], true)) {
+ // quoted scalar
+ $isQuoted = true;
+ $output = self::parseQuotedScalar($scalar, $i);
+
+ if (null !== $delimiters) {
+ $tmp = ltrim(substr($scalar, $i), " \n");
+ if ('' === $tmp) {
+ throw new ParseException(sprintf('Unexpected end of line, expected one of "%s".', implode('', $delimiters)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
+ }
+ if (!\in_array($tmp[0], $delimiters)) {
+ throw new ParseException(sprintf('Unexpected characters (%s).', substr($scalar, $i)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
+ }
+ }
+ } else {
+ // "normal" string
+ $isQuoted = false;
+
+ if (!$delimiters) {
+ $output = substr($scalar, $i);
+ $i += \strlen($output);
+
+ // remove comments
+ if (Parser::preg_match('/[ \t]+#/', $output, $match, \PREG_OFFSET_CAPTURE)) {
+ $output = substr($output, 0, $match[0][1]);
+ }
+ } elseif (Parser::preg_match('/^(.*?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) {
+ $output = $match[1];
+ $i += \strlen($output);
+ $output = trim($output);
+ } else {
+ throw new ParseException(sprintf('Malformed inline YAML string: "%s".', $scalar), self::$parsedLineNumber + 1, null, self::$parsedFilename);
+ }
+
+ // a non-quoted string cannot start with @ or ` (reserved) nor with a scalar indicator (| or >)
+ if ($output && ('@' === $output[0] || '`' === $output[0] || '|' === $output[0] || '>' === $output[0] || '%' === $output[0])) {
+ throw new ParseException(sprintf('The reserved indicator "%s" cannot start a plain scalar; you need to quote the scalar.', $output[0]), self::$parsedLineNumber + 1, $output, self::$parsedFilename);
+ }
+
+ if ($evaluate) {
+ $output = self::evaluateScalar($output, $flags, $references, $isQuoted);
+ }
+ }
+
+ return $output;
+ }
+
+ /**
+ * Parses a YAML quoted scalar.
+ *
+ * @throws ParseException When malformed inline YAML string is parsed
+ */
+ private static function parseQuotedScalar(string $scalar, int &$i = 0): string
+ {
+ if (!Parser::preg_match('/'.self::REGEX_QUOTED_STRING.'/Au', substr($scalar, $i), $match)) {
+ throw new ParseException(sprintf('Malformed inline YAML string: "%s".', substr($scalar, $i)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
+ }
+
+ $output = substr($match[0], 1, -1);
+
+ $unescaper = new Unescaper();
+ if ('"' == $scalar[$i]) {
+ $output = $unescaper->unescapeDoubleQuotedString($output);
+ } else {
+ $output = $unescaper->unescapeSingleQuotedString($output);
+ }
+
+ $i += \strlen($match[0]);
+
+ return $output;
+ }
+
+ /**
+ * Parses a YAML sequence.
+ *
+ * @throws ParseException When malformed inline YAML string is parsed
+ */
+ private static function parseSequence(string $sequence, int $flags, int &$i = 0, array &$references = []): array
+ {
+ $output = [];
+ $len = \strlen($sequence);
+ ++$i;
+
+ // [foo, bar, ...]
+ while ($i < $len) {
+ if (']' === $sequence[$i]) {
+ return $output;
+ }
+ if (',' === $sequence[$i] || ' ' === $sequence[$i]) {
+ ++$i;
+
+ continue;
+ }
+
+ $tag = self::parseTag($sequence, $i, $flags);
+ switch ($sequence[$i]) {
+ case '[':
+ // nested sequence
+ $value = self::parseSequence($sequence, $flags, $i, $references);
+ break;
+ case '{':
+ // nested mapping
+ $value = self::parseMapping($sequence, $flags, $i, $references);
+ break;
+ default:
+ $value = self::parseScalar($sequence, $flags, [',', ']'], $i, null === $tag, $references, $isQuoted);
+
+ // the value can be an array if a reference has been resolved to an array var
+ if (\is_string($value) && !$isQuoted && false !== strpos($value, ': ')) {
+ // embedded mapping?
+ try {
+ $pos = 0;
+ $value = self::parseMapping('{'.$value.'}', $flags, $pos, $references);
+ } catch (\InvalidArgumentException $e) {
+ // no, it's not
+ }
+ }
+
+ if (!$isQuoted && \is_string($value) && '' !== $value && '&' === $value[0] && Parser::preg_match(Parser::REFERENCE_PATTERN, $value, $matches)) {
+ $references[$matches['ref']] = $matches['value'];
+ $value = $matches['value'];
+ }
+
+ --$i;
+ }
+
+ if (null !== $tag && '' !== $tag) {
+ $value = new TaggedValue($tag, $value);
+ }
+
+ $output[] = $value;
+
+ ++$i;
+ }
+
+ throw new ParseException(sprintf('Malformed inline YAML string: "%s".', $sequence), self::$parsedLineNumber + 1, null, self::$parsedFilename);
+ }
+
+ /**
+ * Parses a YAML mapping.
+ *
+ * @return array|\stdClass
+ *
+ * @throws ParseException When malformed inline YAML string is parsed
+ */
+ private static function parseMapping(string $mapping, int $flags, int &$i = 0, array &$references = [])
+ {
+ $output = [];
+ $len = \strlen($mapping);
+ ++$i;
+ $allowOverwrite = false;
+
+ // {foo: bar, bar:foo, ...}
+ while ($i < $len) {
+ switch ($mapping[$i]) {
+ case ' ':
+ case ',':
+ case "\n":
+ ++$i;
+ continue 2;
+ case '}':
+ if (self::$objectForMap) {
+ return (object) $output;
+ }
+
+ return $output;
+ }
+
+ // key
+ $offsetBeforeKeyParsing = $i;
+ $isKeyQuoted = \in_array($mapping[$i], ['"', "'"], true);
+ $key = self::parseScalar($mapping, $flags, [':', ' '], $i, false);
+
+ if ($offsetBeforeKeyParsing === $i) {
+ throw new ParseException('Missing mapping key.', self::$parsedLineNumber + 1, $mapping);
+ }
+
+ if ('!php/const' === $key) {
+ $key .= ' '.self::parseScalar($mapping, $flags, [':'], $i, false);
+ $key = self::evaluateScalar($key, $flags);
+ }
+
+ if (false === $i = strpos($mapping, ':', $i)) {
+ break;
+ }
+
+ if (!$isKeyQuoted) {
+ $evaluatedKey = self::evaluateScalar($key, $flags, $references);
+
+ if ('' !== $key && $evaluatedKey !== $key && !\is_string($evaluatedKey) && !\is_int($evaluatedKey)) {
+ throw new ParseException('Implicit casting of incompatible mapping keys to strings is not supported. Quote your evaluable mapping keys instead.', self::$parsedLineNumber + 1, $mapping);
+ }
+ }
+
+ if (!$isKeyQuoted && (!isset($mapping[$i + 1]) || !\in_array($mapping[$i + 1], [' ', ',', '[', ']', '{', '}', "\n"], true))) {
+ throw new ParseException('Colons must be followed by a space or an indication character (i.e. " ", ",", "[", "]", "{", "}").', self::$parsedLineNumber + 1, $mapping);
+ }
+
+ if ('<<' === $key) {
+ $allowOverwrite = true;
+ }
+
+ while ($i < $len) {
+ if (':' === $mapping[$i] || ' ' === $mapping[$i] || "\n" === $mapping[$i]) {
+ ++$i;
+
+ continue;
+ }
+
+ $tag = self::parseTag($mapping, $i, $flags);
+ switch ($mapping[$i]) {
+ case '[':
+ // nested sequence
+ $value = self::parseSequence($mapping, $flags, $i, $references);
+ // Spec: Keys MUST be unique; first one wins.
+ // Parser cannot abort this mapping earlier, since lines
+ // are processed sequentially.
+ // But overwriting is allowed when a merge node is used in current block.
+ if ('<<' === $key) {
+ foreach ($value as $parsedValue) {
+ $output += $parsedValue;
+ }
+ } elseif ($allowOverwrite || !isset($output[$key])) {
+ if (null !== $tag) {
+ $output[$key] = new TaggedValue($tag, $value);
+ } else {
+ $output[$key] = $value;
+ }
+ } elseif (isset($output[$key])) {
+ throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping);
+ }
+ break;
+ case '{':
+ // nested mapping
+ $value = self::parseMapping($mapping, $flags, $i, $references);
+ // Spec: Keys MUST be unique; first one wins.
+ // Parser cannot abort this mapping earlier, since lines
+ // are processed sequentially.
+ // But overwriting is allowed when a merge node is used in current block.
+ if ('<<' === $key) {
+ $output += $value;
+ } elseif ($allowOverwrite || !isset($output[$key])) {
+ if (null !== $tag) {
+ $output[$key] = new TaggedValue($tag, $value);
+ } else {
+ $output[$key] = $value;
+ }
+ } elseif (isset($output[$key])) {
+ throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping);
+ }
+ break;
+ default:
+ $value = self::parseScalar($mapping, $flags, [',', '}', "\n"], $i, null === $tag, $references, $isValueQuoted);
+ // Spec: Keys MUST be unique; first one wins.
+ // Parser cannot abort this mapping earlier, since lines
+ // are processed sequentially.
+ // But overwriting is allowed when a merge node is used in current block.
+ if ('<<' === $key) {
+ $output += $value;
+ } elseif ($allowOverwrite || !isset($output[$key])) {
+ if (!$isValueQuoted && \is_string($value) && '' !== $value && '&' === $value[0] && Parser::preg_match(Parser::REFERENCE_PATTERN, $value, $matches)) {
+ $references[$matches['ref']] = $matches['value'];
+ $value = $matches['value'];
+ }
+
+ if (null !== $tag) {
+ $output[$key] = new TaggedValue($tag, $value);
+ } else {
+ $output[$key] = $value;
+ }
+ } elseif (isset($output[$key])) {
+ throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping);
+ }
+ --$i;
+ }
+ ++$i;
+
+ continue 2;
+ }
+ }
+
+ throw new ParseException(sprintf('Malformed inline YAML string: "%s".', $mapping), self::$parsedLineNumber + 1, null, self::$parsedFilename);
+ }
+
+ /**
+ * Evaluates scalars and replaces magic values.
+ *
+ * @return mixed
+ *
+ * @throws ParseException when object parsing support was disabled and the parser detected a PHP object or when a reference could not be resolved
+ */
+ private static function evaluateScalar(string $scalar, int $flags, array &$references = [], bool &$isQuotedString = null)
+ {
+ $isQuotedString = false;
+ $scalar = trim($scalar);
+
+ if (0 === strpos($scalar, '*')) {
+ if (false !== $pos = strpos($scalar, '#')) {
+ $value = substr($scalar, 1, $pos - 2);
+ } else {
+ $value = substr($scalar, 1);
+ }
+
+ // an unquoted *
+ if (false === $value || '' === $value) {
+ throw new ParseException('A reference must contain at least one character.', self::$parsedLineNumber + 1, $value, self::$parsedFilename);
+ }
+
+ if (!\array_key_exists($value, $references)) {
+ throw new ParseException(sprintf('Reference "%s" does not exist.', $value), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
+ }
+
+ return $references[$value];
+ }
+
+ $scalarLower = strtolower($scalar);
+
+ switch (true) {
+ case 'null' === $scalarLower:
+ case '' === $scalar:
+ case '~' === $scalar:
+ return null;
+ case 'true' === $scalarLower:
+ return true;
+ case 'false' === $scalarLower:
+ return false;
+ case '!' === $scalar[0]:
+ switch (true) {
+ case 0 === strpos($scalar, '!!str '):
+ $s = (string) substr($scalar, 6);
+
+ if (\in_array($s[0] ?? '', ['"', "'"], true)) {
+ $isQuotedString = true;
+ $s = self::parseQuotedScalar($s);
+ }
+
+ return $s;
+ case 0 === strpos($scalar, '! '):
+ return substr($scalar, 2);
+ case 0 === strpos($scalar, '!php/object'):
+ if (self::$objectSupport) {
+ if (!isset($scalar[12])) {
+ trigger_deprecation('symfony/yaml', '5.1', 'Using the !php/object tag without a value is deprecated.');
+
+ return false;
+ }
+
+ return unserialize(self::parseScalar(substr($scalar, 12)));
+ }
+
+ if (self::$exceptionOnInvalidType) {
+ throw new ParseException('Object support when parsing a YAML file has been disabled.', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
+ }
+
+ return null;
+ case 0 === strpos($scalar, '!php/const'):
+ if (self::$constantSupport) {
+ if (!isset($scalar[11])) {
+ trigger_deprecation('symfony/yaml', '5.1', 'Using the !php/const tag without a value is deprecated.');
+
+ return '';
+ }
+
+ $i = 0;
+ if (\defined($const = self::parseScalar(substr($scalar, 11), 0, null, $i, false))) {
+ return \constant($const);
+ }
+
+ throw new ParseException(sprintf('The constant "%s" is not defined.', $const), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
+ }
+ if (self::$exceptionOnInvalidType) {
+ throw new ParseException(sprintf('The string "%s" could not be parsed as a constant. Did you forget to pass the "Yaml::PARSE_CONSTANT" flag to the parser?', $scalar), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
+ }
+
+ return null;
+ case 0 === strpos($scalar, '!!float '):
+ return (float) substr($scalar, 8);
+ case 0 === strpos($scalar, '!!binary '):
+ return self::evaluateBinaryScalar(substr($scalar, 9));
+ }
+
+ throw new ParseException(sprintf('The string "%s" could not be parsed as it uses an unsupported built-in tag.', $scalar), self::$parsedLineNumber, $scalar, self::$parsedFilename);
+ case preg_match('/^(?:\+|-)?0o(?P[0-7_]++)$/', $scalar, $matches):
+ $value = str_replace('_', '', $matches['value']);
+
+ if ('-' === $scalar[0]) {
+ return -octdec($value);
+ }
+
+ return octdec($value);
+ // Optimize for returning strings.
+ case \in_array($scalar[0], ['+', '-', '.'], true) || is_numeric($scalar[0]):
+ if (Parser::preg_match('{^[+-]?[0-9][0-9_]*$}', $scalar)) {
+ $scalar = str_replace('_', '', $scalar);
+ }
+
+ switch (true) {
+ case ctype_digit($scalar):
+ if (preg_match('/^0[0-7]+$/', $scalar)) {
+ trigger_deprecation('symfony/yaml', '5.1', 'Support for parsing numbers prefixed with 0 as octal numbers. They will be parsed as strings as of 6.0. Use "%s" to represent the octal number.', '0o'.substr($scalar, 1));
+
+ return octdec($scalar);
+ }
+
+ $cast = (int) $scalar;
+
+ return ($scalar === (string) $cast) ? $cast : $scalar;
+ case '-' === $scalar[0] && ctype_digit(substr($scalar, 1)):
+ if (preg_match('/^-0[0-7]+$/', $scalar)) {
+ trigger_deprecation('symfony/yaml', '5.1', 'Support for parsing numbers prefixed with 0 as octal numbers. They will be parsed as strings as of 6.0. Use "%s" to represent the octal number.', '-0o'.substr($scalar, 2));
+
+ return -octdec(substr($scalar, 1));
+ }
+
+ $cast = (int) $scalar;
+
+ return ($scalar === (string) $cast) ? $cast : $scalar;
+ case is_numeric($scalar):
+ case Parser::preg_match(self::getHexRegex(), $scalar):
+ $scalar = str_replace('_', '', $scalar);
+
+ return '0x' === $scalar[0].$scalar[1] ? hexdec($scalar) : (float) $scalar;
+ case '.inf' === $scalarLower:
+ case '.nan' === $scalarLower:
+ return -log(0);
+ case '-.inf' === $scalarLower:
+ return log(0);
+ case Parser::preg_match('/^(-|\+)?[0-9][0-9_]*(\.[0-9_]+)?$/', $scalar):
+ return (float) str_replace('_', '', $scalar);
+ case Parser::preg_match(self::getTimestampRegex(), $scalar):
+ // When no timezone is provided in the parsed date, YAML spec says we must assume UTC.
+ $time = new \DateTime($scalar, new \DateTimeZone('UTC'));
+
+ if (Yaml::PARSE_DATETIME & $flags) {
+ return $time;
+ }
+
+ try {
+ if (false !== $scalar = $time->getTimestamp()) {
+ return $scalar;
+ }
+ } catch (\ValueError $e) {
+ // no-op
+ }
+
+ return $time->format('U');
+ }
+ }
+
+ return (string) $scalar;
+ }
+
+ private static function parseTag(string $value, int &$i, int $flags): ?string
+ {
+ if ('!' !== $value[$i]) {
+ return null;
+ }
+
+ $tagLength = strcspn($value, " \t\n[]{},", $i + 1);
+ $tag = substr($value, $i + 1, $tagLength);
+
+ $nextOffset = $i + $tagLength + 1;
+ $nextOffset += strspn($value, ' ', $nextOffset);
+
+ if ('' === $tag && (!isset($value[$nextOffset]) || \in_array($value[$nextOffset], [']', '}', ','], true))) {
+ throw new ParseException('Using the unquoted scalar value "!" is not supported. You must quote it.', self::$parsedLineNumber + 1, $value, self::$parsedFilename);
+ }
+
+ // Is followed by a scalar and is a built-in tag
+ if ('' !== $tag && (!isset($value[$nextOffset]) || !\in_array($value[$nextOffset], ['[', '{'], true)) && ('!' === $tag[0] || 'str' === $tag || 'php/const' === $tag || 'php/object' === $tag)) {
+ // Manage in {@link self::evaluateScalar()}
+ return null;
+ }
+
+ $i = $nextOffset;
+
+ // Built-in tags
+ if ('' !== $tag && '!' === $tag[0]) {
+ throw new ParseException(sprintf('The built-in tag "!%s" is not implemented.', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
+ }
+
+ if ('' !== $tag && !isset($value[$i])) {
+ throw new ParseException(sprintf('Missing value for tag "%s".', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
+ }
+
+ if ('' === $tag || Yaml::PARSE_CUSTOM_TAGS & $flags) {
+ return $tag;
+ }
+
+ throw new ParseException(sprintf('Tags support is not enabled. Enable the "Yaml::PARSE_CUSTOM_TAGS" flag to use "!%s".', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
+ }
+
+ public static function evaluateBinaryScalar(string $scalar): string
+ {
+ $parsedBinaryData = self::parseScalar(preg_replace('/\s/', '', $scalar));
+
+ if (0 !== (\strlen($parsedBinaryData) % 4)) {
+ throw new ParseException(sprintf('The normalized base64 encoded data (data without whitespace characters) length must be a multiple of four (%d bytes given).', \strlen($parsedBinaryData)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
+ }
+
+ if (!Parser::preg_match('#^[A-Z0-9+/]+={0,2}$#i', $parsedBinaryData)) {
+ throw new ParseException(sprintf('The base64 encoded data (%s) contains invalid characters.', $parsedBinaryData), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
+ }
+
+ return base64_decode($parsedBinaryData, true);
+ }
+
+ private static function isBinaryString(string $value): bool
+ {
+ return !preg_match('//u', $value) || preg_match('/[^\x00\x07-\x0d\x1B\x20-\xff]/', $value);
+ }
+
+ /**
+ * Gets a regex that matches a YAML date.
+ *
+ * @see http://www.yaml.org/spec/1.2/spec.html#id2761573
+ */
+ private static function getTimestampRegex(): string
+ {
+ return <<[0-9][0-9][0-9][0-9])
+ -(?P[0-9][0-9]?)
+ -(?P[0-9][0-9]?)
+ (?:(?:[Tt]|[ \t]+)
+ (?P[0-9][0-9]?)
+ :(?P[0-9][0-9])
+ :(?P[0-9][0-9])
+ (?:\.(?P[0-9]*))?
+ (?:[ \t]*(?PZ|(?P[-+])(?P[0-9][0-9]?)
+ (?::(?P[0-9][0-9]))?))?)?
+ $~x
+EOF;
+ }
+
+ /**
+ * Gets a regex that matches a YAML number in hexadecimal notation.
+ */
+ private static function getHexRegex(): string
+ {
+ return '~^0x[0-9a-f_]++$~i';
+ }
+}
diff --git a/vendor/symfony/yaml/LICENSE b/vendor/symfony/yaml/LICENSE
new file mode 100644
index 00000000..88bf75bb
--- /dev/null
+++ b/vendor/symfony/yaml/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2022 Fabien Potencier
+
+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/vendor/symfony/yaml/Parser.php b/vendor/symfony/yaml/Parser.php
new file mode 100644
index 00000000..2701a441
--- /dev/null
+++ b/vendor/symfony/yaml/Parser.php
@@ -0,0 +1,1305 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml;
+
+use Symfony\Component\Yaml\Exception\ParseException;
+use Symfony\Component\Yaml\Tag\TaggedValue;
+
+/**
+ * Parser parses YAML strings to convert them to PHP arrays.
+ *
+ * @author Fabien Potencier
+ *
+ * @final
+ */
+class Parser
+{
+ public const TAG_PATTERN = '(?P![\w!.\/:-]+)';
+ public const BLOCK_SCALAR_HEADER_PATTERN = '(?P\||>)(?P\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P +#.*)?';
+ public const REFERENCE_PATTERN = '#^&(?P[[^ ]++) *+(?P.*)#u';
+
+ private $filename;
+ private $offset = 0;
+ private $numberOfParsedLines = 0;
+ private $totalNumberOfLines;
+ private $lines = [];
+ private $currentLineNb = -1;
+ private $currentLine = '';
+ private $refs = [];
+ private $skippedLineNumbers = [];
+ private $locallySkippedLineNumbers = [];
+ private $refsBeingParsed = [];
+
+ /**
+ * Parses a YAML file into a PHP value.
+ *
+ * @param string $filename The path to the YAML file to be parsed
+ * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior
+ *
+ * @return mixed
+ *
+ * @throws ParseException If the file could not be read or the YAML is not valid
+ */
+ public function parseFile(string $filename, int $flags = 0)
+ {
+ if (!is_file($filename)) {
+ throw new ParseException(sprintf('File "%s" does not exist.', $filename));
+ }
+
+ if (!is_readable($filename)) {
+ throw new ParseException(sprintf('File "%s" cannot be read.', $filename));
+ }
+
+ $this->filename = $filename;
+
+ try {
+ return $this->parse(file_get_contents($filename), $flags);
+ } finally {
+ $this->filename = null;
+ }
+ }
+
+ /**
+ * Parses a YAML string to a PHP value.
+ *
+ * @param string $value A YAML string
+ * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior
+ *
+ * @return mixed
+ *
+ * @throws ParseException If the YAML is not valid
+ */
+ public function parse(string $value, int $flags = 0)
+ {
+ if (false === preg_match('//u', $value)) {
+ throw new ParseException('The YAML value does not appear to be valid UTF-8.', -1, null, $this->filename);
+ }
+
+ $this->refs = [];
+
+ $mbEncoding = null;
+
+ if (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) {
+ $mbEncoding = mb_internal_encoding();
+ mb_internal_encoding('UTF-8');
+ }
+
+ try {
+ $data = $this->doParse($value, $flags);
+ } finally {
+ if (null !== $mbEncoding) {
+ mb_internal_encoding($mbEncoding);
+ }
+ $this->refsBeingParsed = [];
+ $this->offset = 0;
+ $this->lines = [];
+ $this->currentLine = '';
+ $this->numberOfParsedLines = 0;
+ $this->refs = [];
+ $this->skippedLineNumbers = [];
+ $this->locallySkippedLineNumbers = [];
+ $this->totalNumberOfLines = null;
+ }
+
+ return $data;
+ }
+
+ private function doParse(string $value, int $flags)
+ {
+ $this->currentLineNb = -1;
+ $this->currentLine = '';
+ $value = $this->cleanup($value);
+ $this->lines = explode("\n", $value);
+ $this->numberOfParsedLines = \count($this->lines);
+ $this->locallySkippedLineNumbers = [];
+
+ if (null === $this->totalNumberOfLines) {
+ $this->totalNumberOfLines = $this->numberOfParsedLines;
+ }
+
+ if (!$this->moveToNextLine()) {
+ return null;
+ }
+
+ $data = [];
+ $context = null;
+ $allowOverwrite = false;
+
+ while ($this->isCurrentLineEmpty()) {
+ if (!$this->moveToNextLine()) {
+ return null;
+ }
+ }
+
+ // Resolves the tag and returns if end of the document
+ if (null !== ($tag = $this->getLineTag($this->currentLine, $flags, false)) && !$this->moveToNextLine()) {
+ return new TaggedValue($tag, '');
+ }
+
+ do {
+ if ($this->isCurrentLineEmpty()) {
+ continue;
+ }
+
+ // tab?
+ if ("\t" === $this->currentLine[0]) {
+ throw new ParseException('A YAML file cannot contain tabs as indentation.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
+ }
+
+ Inline::initialize($flags, $this->getRealCurrentLineNb(), $this->filename);
+
+ $isRef = $mergeNode = false;
+ if ('-' === $this->currentLine[0] && self::preg_match('#^\-((?P\s+)(?P.+))?$#u', rtrim($this->currentLine), $values)) {
+ if ($context && 'mapping' == $context) {
+ throw new ParseException('You cannot define a sequence item when in a mapping.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
+ }
+ $context = 'sequence';
+
+ if (isset($values['value']) && '&' === $values['value'][0] && self::preg_match(self::REFERENCE_PATTERN, $values['value'], $matches)) {
+ $isRef = $matches['ref'];
+ $this->refsBeingParsed[] = $isRef;
+ $values['value'] = $matches['value'];
+ }
+
+ if (isset($values['value'][1]) && '?' === $values['value'][0] && ' ' === $values['value'][1]) {
+ throw new ParseException('Complex mappings are not supported.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
+ }
+
+ // array
+ if (isset($values['value']) && 0 === strpos(ltrim($values['value'], ' '), '-')) {
+ // Inline first child
+ $currentLineNumber = $this->getRealCurrentLineNb();
+
+ $sequenceIndentation = \strlen($values['leadspaces']) + 1;
+ $sequenceYaml = substr($this->currentLine, $sequenceIndentation);
+ $sequenceYaml .= "\n".$this->getNextEmbedBlock($sequenceIndentation, true);
+
+ $data[] = $this->parseBlock($currentLineNumber, rtrim($sequenceYaml), $flags);
+ } elseif (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) {
+ $data[] = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, true) ?? '', $flags);
+ } elseif (null !== $subTag = $this->getLineTag(ltrim($values['value'], ' '), $flags)) {
+ $data[] = new TaggedValue(
+ $subTag,
+ $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, true), $flags)
+ );
+ } else {
+ if (
+ isset($values['leadspaces'])
+ && (
+ '!' === $values['value'][0]
+ || self::preg_match('#^(?P'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\{\[].*?) *\:(\s+(?P.+?))?\s*$#u', $this->trimTag($values['value']), $matches)
+ )
+ ) {
+ // this is a compact notation element, add to next block and parse
+ $block = $values['value'];
+ if ($this->isNextLineIndented()) {
+ $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + \strlen($values['leadspaces']) + 1);
+ }
+
+ $data[] = $this->parseBlock($this->getRealCurrentLineNb(), $block, $flags);
+ } else {
+ $data[] = $this->parseValue($values['value'], $flags, $context);
+ }
+ }
+ if ($isRef) {
+ $this->refs[$isRef] = end($data);
+ array_pop($this->refsBeingParsed);
+ }
+ } elseif (
+ self::preg_match('#^(?P(?:![^\s]++\s++)?(?:'.Inline::REGEX_QUOTED_STRING.'|(?:!?!php/const:)?[^ \'"\[\{!].*?)) *\:(( |\t)++(?P.+))?$#u', rtrim($this->currentLine), $values)
+ && (false === strpos($values['key'], ' #') || \in_array($values['key'][0], ['"', "'"]))
+ ) {
+ if ($context && 'sequence' == $context) {
+ throw new ParseException('You cannot define a mapping item when in a sequence.', $this->currentLineNb + 1, $this->currentLine, $this->filename);
+ }
+ $context = 'mapping';
+
+ try {
+ $key = Inline::parseScalar($values['key']);
+ } catch (ParseException $e) {
+ $e->setParsedLine($this->getRealCurrentLineNb() + 1);
+ $e->setSnippet($this->currentLine);
+
+ throw $e;
+ }
+
+ if (!\is_string($key) && !\is_int($key)) {
+ throw new ParseException((is_numeric($key) ? 'Numeric' : 'Non-string').' keys are not supported. Quote your evaluable mapping keys instead.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
+ }
+
+ // Convert float keys to strings, to avoid being converted to integers by PHP
+ if (\is_float($key)) {
+ $key = (string) $key;
+ }
+
+ if ('<<' === $key && (!isset($values['value']) || '&' !== $values['value'][0] || !self::preg_match('#^&(?P][[^ ]+)#u', $values['value'], $refMatches))) {
+ $mergeNode = true;
+ $allowOverwrite = true;
+ if (isset($values['value'][0]) && '*' === $values['value'][0]) {
+ $refName = substr(rtrim($values['value']), 1);
+ if (!\array_key_exists($refName, $this->refs)) {
+ if (false !== $pos = array_search($refName, $this->refsBeingParsed, true)) {
+ throw new ParseException(sprintf('Circular reference [%s] detected for reference "%s".', implode(', ', array_merge(\array_slice($this->refsBeingParsed, $pos), [$refName])), $refName), $this->currentLineNb + 1, $this->currentLine, $this->filename);
+ }
+
+ throw new ParseException(sprintf('Reference "%s" does not exist.', $refName), $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
+ }
+
+ $refValue = $this->refs[$refName];
+
+ if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $refValue instanceof \stdClass) {
+ $refValue = (array) $refValue;
+ }
+
+ if (!\is_array($refValue)) {
+ throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
+ }
+
+ $data += $refValue; // array union
+ } else {
+ if (isset($values['value']) && '' !== $values['value']) {
+ $value = $values['value'];
+ } else {
+ $value = $this->getNextEmbedBlock();
+ }
+ $parsed = $this->parseBlock($this->getRealCurrentLineNb() + 1, $value, $flags);
+
+ if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $parsed instanceof \stdClass) {
+ $parsed = (array) $parsed;
+ }
+
+ if (!\is_array($parsed)) {
+ throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
+ }
+
+ if (isset($parsed[0])) {
+ // If the value associated with the merge key is a sequence, then this sequence is expected to contain mapping nodes
+ // and each of these nodes is merged in turn according to its order in the sequence. Keys in mapping nodes earlier
+ // in the sequence override keys specified in later mapping nodes.
+ foreach ($parsed as $parsedItem) {
+ if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $parsedItem instanceof \stdClass) {
+ $parsedItem = (array) $parsedItem;
+ }
+
+ if (!\is_array($parsedItem)) {
+ throw new ParseException('Merge items must be arrays.', $this->getRealCurrentLineNb() + 1, $parsedItem, $this->filename);
+ }
+
+ $data += $parsedItem; // array union
+ }
+ } else {
+ // If the value associated with the key is a single mapping node, each of its key/value pairs is inserted into the
+ // current mapping, unless the key already exists in it.
+ $data += $parsed; // array union
+ }
+ }
+ } elseif ('<<' !== $key && isset($values['value']) && '&' === $values['value'][0] && self::preg_match(self::REFERENCE_PATTERN, $values['value'], $matches)) {
+ $isRef = $matches['ref'];
+ $this->refsBeingParsed[] = $isRef;
+ $values['value'] = $matches['value'];
+ }
+
+ $subTag = null;
+ if ($mergeNode) {
+ // Merge keys
+ } elseif (!isset($values['value']) || '' === $values['value'] || 0 === strpos($values['value'], '#') || (null !== $subTag = $this->getLineTag($values['value'], $flags)) || '<<' === $key) {
+ // hash
+ // if next line is less indented or equal, then it means that the current value is null
+ if (!$this->isNextLineIndented() && !$this->isNextLineUnIndentedCollection()) {
+ // Spec: Keys MUST be unique; first one wins.
+ // But overwriting is allowed when a merge node is used in current block.
+ if ($allowOverwrite || !isset($data[$key])) {
+ if (null !== $subTag) {
+ $data[$key] = new TaggedValue($subTag, '');
+ } else {
+ $data[$key] = null;
+ }
+ } else {
+ throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), $this->getRealCurrentLineNb() + 1, $this->currentLine);
+ }
+ } else {
+ // remember the parsed line number here in case we need it to provide some contexts in error messages below
+ $realCurrentLineNbKey = $this->getRealCurrentLineNb();
+ $value = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(), $flags);
+ if ('<<' === $key) {
+ $this->refs[$refMatches['ref']] = $value;
+
+ if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $value instanceof \stdClass) {
+ $value = (array) $value;
+ }
+
+ $data += $value;
+ } elseif ($allowOverwrite || !isset($data[$key])) {
+ // Spec: Keys MUST be unique; first one wins.
+ // But overwriting is allowed when a merge node is used in current block.
+ if (null !== $subTag) {
+ $data[$key] = new TaggedValue($subTag, $value);
+ } else {
+ $data[$key] = $value;
+ }
+ } else {
+ throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), $realCurrentLineNbKey + 1, $this->currentLine);
+ }
+ }
+ } else {
+ $value = $this->parseValue(rtrim($values['value']), $flags, $context);
+ // Spec: Keys MUST be unique; first one wins.
+ // But overwriting is allowed when a merge node is used in current block.
+ if ($allowOverwrite || !isset($data[$key])) {
+ $data[$key] = $value;
+ } else {
+ throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), $this->getRealCurrentLineNb() + 1, $this->currentLine);
+ }
+ }
+ if ($isRef) {
+ $this->refs[$isRef] = $data[$key];
+ array_pop($this->refsBeingParsed);
+ }
+ } elseif ('"' === $this->currentLine[0] || "'" === $this->currentLine[0]) {
+ if (null !== $context) {
+ throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
+ }
+
+ try {
+ return Inline::parse($this->lexInlineQuotedString(), $flags, $this->refs);
+ } catch (ParseException $e) {
+ $e->setParsedLine($this->getRealCurrentLineNb() + 1);
+ $e->setSnippet($this->currentLine);
+
+ throw $e;
+ }
+ } elseif ('{' === $this->currentLine[0]) {
+ if (null !== $context) {
+ throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
+ }
+
+ try {
+ $parsedMapping = Inline::parse($this->lexInlineMapping(), $flags, $this->refs);
+
+ while ($this->moveToNextLine()) {
+ if (!$this->isCurrentLineEmpty()) {
+ throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
+ }
+ }
+
+ return $parsedMapping;
+ } catch (ParseException $e) {
+ $e->setParsedLine($this->getRealCurrentLineNb() + 1);
+ $e->setSnippet($this->currentLine);
+
+ throw $e;
+ }
+ } elseif ('[' === $this->currentLine[0]) {
+ if (null !== $context) {
+ throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
+ }
+
+ try {
+ $parsedSequence = Inline::parse($this->lexInlineSequence(), $flags, $this->refs);
+
+ while ($this->moveToNextLine()) {
+ if (!$this->isCurrentLineEmpty()) {
+ throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
+ }
+ }
+
+ return $parsedSequence;
+ } catch (ParseException $e) {
+ $e->setParsedLine($this->getRealCurrentLineNb() + 1);
+ $e->setSnippet($this->currentLine);
+
+ throw $e;
+ }
+ } else {
+ // multiple documents are not supported
+ if ('---' === $this->currentLine) {
+ throw new ParseException('Multiple documents are not supported.', $this->currentLineNb + 1, $this->currentLine, $this->filename);
+ }
+
+ if ($deprecatedUsage = (isset($this->currentLine[1]) && '?' === $this->currentLine[0] && ' ' === $this->currentLine[1])) {
+ throw new ParseException('Complex mappings are not supported.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
+ }
+
+ // 1-liner optionally followed by newline(s)
+ if (\is_string($value) && $this->lines[0] === trim($value)) {
+ try {
+ $value = Inline::parse($this->lines[0], $flags, $this->refs);
+ } catch (ParseException $e) {
+ $e->setParsedLine($this->getRealCurrentLineNb() + 1);
+ $e->setSnippet($this->currentLine);
+
+ throw $e;
+ }
+
+ return $value;
+ }
+
+ // try to parse the value as a multi-line string as a last resort
+ if (0 === $this->currentLineNb) {
+ $previousLineWasNewline = false;
+ $previousLineWasTerminatedWithBackslash = false;
+ $value = '';
+
+ foreach ($this->lines as $line) {
+ $trimmedLine = trim($line);
+ if ('#' === ($trimmedLine[0] ?? '')) {
+ continue;
+ }
+ // If the indentation is not consistent at offset 0, it is to be considered as a ParseError
+ if (0 === $this->offset && !$deprecatedUsage && isset($line[0]) && ' ' === $line[0]) {
+ throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
+ }
+
+ if (false !== strpos($line, ': ')) {
+ throw new ParseException('Mapping values are not allowed in multi-line blocks.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
+ }
+
+ if ('' === $trimmedLine) {
+ $value .= "\n";
+ } elseif (!$previousLineWasNewline && !$previousLineWasTerminatedWithBackslash) {
+ $value .= ' ';
+ }
+
+ if ('' !== $trimmedLine && '\\' === substr($line, -1)) {
+ $value .= ltrim(substr($line, 0, -1));
+ } elseif ('' !== $trimmedLine) {
+ $value .= $trimmedLine;
+ }
+
+ if ('' === $trimmedLine) {
+ $previousLineWasNewline = true;
+ $previousLineWasTerminatedWithBackslash = false;
+ } elseif ('\\' === substr($line, -1)) {
+ $previousLineWasNewline = false;
+ $previousLineWasTerminatedWithBackslash = true;
+ } else {
+ $previousLineWasNewline = false;
+ $previousLineWasTerminatedWithBackslash = false;
+ }
+ }
+
+ try {
+ return Inline::parse(trim($value));
+ } catch (ParseException $e) {
+ // fall-through to the ParseException thrown below
+ }
+ }
+
+ throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
+ }
+ } while ($this->moveToNextLine());
+
+ if (null !== $tag) {
+ $data = new TaggedValue($tag, $data);
+ }
+
+ if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && 'mapping' === $context && !\is_object($data)) {
+ $object = new \stdClass();
+
+ foreach ($data as $key => $value) {
+ $object->$key = $value;
+ }
+
+ $data = $object;
+ }
+
+ return empty($data) ? null : $data;
+ }
+
+ private function parseBlock(int $offset, string $yaml, int $flags)
+ {
+ $skippedLineNumbers = $this->skippedLineNumbers;
+
+ foreach ($this->locallySkippedLineNumbers as $lineNumber) {
+ if ($lineNumber < $offset) {
+ continue;
+ }
+
+ $skippedLineNumbers[] = $lineNumber;
+ }
+
+ $parser = new self();
+ $parser->offset = $offset;
+ $parser->totalNumberOfLines = $this->totalNumberOfLines;
+ $parser->skippedLineNumbers = $skippedLineNumbers;
+ $parser->refs = &$this->refs;
+ $parser->refsBeingParsed = $this->refsBeingParsed;
+
+ return $parser->doParse($yaml, $flags);
+ }
+
+ /**
+ * Returns the current line number (takes the offset into account).
+ *
+ * @internal
+ */
+ public function getRealCurrentLineNb(): int
+ {
+ $realCurrentLineNumber = $this->currentLineNb + $this->offset;
+
+ foreach ($this->skippedLineNumbers as $skippedLineNumber) {
+ if ($skippedLineNumber > $realCurrentLineNumber) {
+ break;
+ }
+
+ ++$realCurrentLineNumber;
+ }
+
+ return $realCurrentLineNumber;
+ }
+
+ /**
+ * Returns the current line indentation.
+ */
+ private function getCurrentLineIndentation(): int
+ {
+ if (' ' !== ($this->currentLine[0] ?? '')) {
+ return 0;
+ }
+
+ return \strlen($this->currentLine) - \strlen(ltrim($this->currentLine, ' '));
+ }
+
+ /**
+ * Returns the next embed block of YAML.
+ *
+ * @param int|null $indentation The indent level at which the block is to be read, or null for default
+ * @param bool $inSequence True if the enclosing data structure is a sequence
+ *
+ * @throws ParseException When indentation problem are detected
+ */
+ private function getNextEmbedBlock(int $indentation = null, bool $inSequence = false): string
+ {
+ $oldLineIndentation = $this->getCurrentLineIndentation();
+
+ if (!$this->moveToNextLine()) {
+ return '';
+ }
+
+ if (null === $indentation) {
+ $newIndent = null;
+ $movements = 0;
+
+ do {
+ $EOF = false;
+
+ // empty and comment-like lines do not influence the indentation depth
+ if ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()) {
+ $EOF = !$this->moveToNextLine();
+
+ if (!$EOF) {
+ ++$movements;
+ }
+ } else {
+ $newIndent = $this->getCurrentLineIndentation();
+ }
+ } while (!$EOF && null === $newIndent);
+
+ for ($i = 0; $i < $movements; ++$i) {
+ $this->moveToPreviousLine();
+ }
+
+ $unindentedEmbedBlock = $this->isStringUnIndentedCollectionItem();
+
+ if (!$this->isCurrentLineEmpty() && 0 === $newIndent && !$unindentedEmbedBlock) {
+ throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
+ }
+ } else {
+ $newIndent = $indentation;
+ }
+
+ $data = [];
+
+ if ($this->getCurrentLineIndentation() >= $newIndent) {
+ $data[] = substr($this->currentLine, $newIndent ?? 0);
+ } elseif ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()) {
+ $data[] = $this->currentLine;
+ } else {
+ $this->moveToPreviousLine();
+
+ return '';
+ }
+
+ if ($inSequence && $oldLineIndentation === $newIndent && isset($data[0][0]) && '-' === $data[0][0]) {
+ // the previous line contained a dash but no item content, this line is a sequence item with the same indentation
+ // and therefore no nested list or mapping
+ $this->moveToPreviousLine();
+
+ return '';
+ }
+
+ $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem();
+ $isItComment = $this->isCurrentLineComment();
+
+ while ($this->moveToNextLine()) {
+ if ($isItComment && !$isItUnindentedCollection) {
+ $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem();
+ $isItComment = $this->isCurrentLineComment();
+ }
+
+ $indent = $this->getCurrentLineIndentation();
+
+ if ($isItUnindentedCollection && !$this->isCurrentLineEmpty() && !$this->isStringUnIndentedCollectionItem() && $newIndent === $indent) {
+ $this->moveToPreviousLine();
+ break;
+ }
+
+ if ($this->isCurrentLineBlank()) {
+ $data[] = substr($this->currentLine, $newIndent);
+ continue;
+ }
+
+ if ($indent >= $newIndent) {
+ $data[] = substr($this->currentLine, $newIndent);
+ } elseif ($this->isCurrentLineComment()) {
+ $data[] = $this->currentLine;
+ } elseif (0 == $indent) {
+ $this->moveToPreviousLine();
+
+ break;
+ } else {
+ throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
+ }
+ }
+
+ return implode("\n", $data);
+ }
+
+ private function hasMoreLines(): bool
+ {
+ return (\count($this->lines) - 1) > $this->currentLineNb;
+ }
+
+ /**
+ * Moves the parser to the next line.
+ */
+ private function moveToNextLine(): bool
+ {
+ if ($this->currentLineNb >= $this->numberOfParsedLines - 1) {
+ return false;
+ }
+
+ $this->currentLine = $this->lines[++$this->currentLineNb];
+
+ return true;
+ }
+
+ /**
+ * Moves the parser to the previous line.
+ */
+ private function moveToPreviousLine(): bool
+ {
+ if ($this->currentLineNb < 1) {
+ return false;
+ }
+
+ $this->currentLine = $this->lines[--$this->currentLineNb];
+
+ return true;
+ }
+
+ /**
+ * Parses a YAML value.
+ *
+ * @param string $value A YAML value
+ * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior
+ * @param string $context The parser context (either sequence or mapping)
+ *
+ * @return mixed
+ *
+ * @throws ParseException When reference does not exist
+ */
+ private function parseValue(string $value, int $flags, string $context)
+ {
+ if (0 === strpos($value, '*')) {
+ if (false !== $pos = strpos($value, '#')) {
+ $value = substr($value, 1, $pos - 2);
+ } else {
+ $value = substr($value, 1);
+ }
+
+ if (!\array_key_exists($value, $this->refs)) {
+ if (false !== $pos = array_search($value, $this->refsBeingParsed, true)) {
+ throw new ParseException(sprintf('Circular reference [%s] detected for reference "%s".', implode(', ', array_merge(\array_slice($this->refsBeingParsed, $pos), [$value])), $value), $this->currentLineNb + 1, $this->currentLine, $this->filename);
+ }
+
+ throw new ParseException(sprintf('Reference "%s" does not exist.', $value), $this->currentLineNb + 1, $this->currentLine, $this->filename);
+ }
+
+ return $this->refs[$value];
+ }
+
+ if (\in_array($value[0], ['!', '|', '>'], true) && self::preg_match('/^(?:'.self::TAG_PATTERN.' +)?'.self::BLOCK_SCALAR_HEADER_PATTERN.'$/', $value, $matches)) {
+ $modifiers = $matches['modifiers'] ?? '';
+
+ $data = $this->parseBlockScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), abs((int) $modifiers));
+
+ if ('' !== $matches['tag'] && '!' !== $matches['tag']) {
+ if ('!!binary' === $matches['tag']) {
+ return Inline::evaluateBinaryScalar($data);
+ }
+
+ return new TaggedValue(substr($matches['tag'], 1), $data);
+ }
+
+ return $data;
+ }
+
+ try {
+ if ('' !== $value && '{' === $value[0]) {
+ $cursor = \strlen(rtrim($this->currentLine)) - \strlen(rtrim($value));
+
+ return Inline::parse($this->lexInlineMapping($cursor), $flags, $this->refs);
+ } elseif ('' !== $value && '[' === $value[0]) {
+ $cursor = \strlen(rtrim($this->currentLine)) - \strlen(rtrim($value));
+
+ return Inline::parse($this->lexInlineSequence($cursor), $flags, $this->refs);
+ }
+
+ switch ($value[0] ?? '') {
+ case '"':
+ case "'":
+ $cursor = \strlen(rtrim($this->currentLine)) - \strlen(rtrim($value));
+ $parsedValue = Inline::parse($this->lexInlineQuotedString($cursor), $flags, $this->refs);
+
+ if (isset($this->currentLine[$cursor]) && preg_replace('/\s*(#.*)?$/A', '', substr($this->currentLine, $cursor))) {
+ throw new ParseException(sprintf('Unexpected characters near "%s".', substr($this->currentLine, $cursor)));
+ }
+
+ return $parsedValue;
+ default:
+ $lines = [];
+
+ while ($this->moveToNextLine()) {
+ // unquoted strings end before the first unindented line
+ if (0 === $this->getCurrentLineIndentation()) {
+ $this->moveToPreviousLine();
+
+ break;
+ }
+
+ $lines[] = trim($this->currentLine);
+ }
+
+ for ($i = 0, $linesCount = \count($lines), $previousLineBlank = false; $i < $linesCount; ++$i) {
+ if ('' === $lines[$i]) {
+ $value .= "\n";
+ $previousLineBlank = true;
+ } elseif ($previousLineBlank) {
+ $value .= $lines[$i];
+ $previousLineBlank = false;
+ } else {
+ $value .= ' '.$lines[$i];
+ $previousLineBlank = false;
+ }
+ }
+
+ Inline::$parsedLineNumber = $this->getRealCurrentLineNb();
+
+ $parsedValue = Inline::parse($value, $flags, $this->refs);
+
+ if ('mapping' === $context && \is_string($parsedValue) && '"' !== $value[0] && "'" !== $value[0] && '[' !== $value[0] && '{' !== $value[0] && '!' !== $value[0] && false !== strpos($parsedValue, ': ')) {
+ throw new ParseException('A colon cannot be used in an unquoted mapping value.', $this->getRealCurrentLineNb() + 1, $value, $this->filename);
+ }
+
+ return $parsedValue;
+ }
+ } catch (ParseException $e) {
+ $e->setParsedLine($this->getRealCurrentLineNb() + 1);
+ $e->setSnippet($this->currentLine);
+
+ throw $e;
+ }
+ }
+
+ /**
+ * Parses a block scalar.
+ *
+ * @param string $style The style indicator that was used to begin this block scalar (| or >)
+ * @param string $chomping The chomping indicator that was used to begin this block scalar (+ or -)
+ * @param int $indentation The indentation indicator that was used to begin this block scalar
+ */
+ private function parseBlockScalar(string $style, string $chomping = '', int $indentation = 0): string
+ {
+ $notEOF = $this->moveToNextLine();
+ if (!$notEOF) {
+ return '';
+ }
+
+ $isCurrentLineBlank = $this->isCurrentLineBlank();
+ $blockLines = [];
+
+ // leading blank lines are consumed before determining indentation
+ while ($notEOF && $isCurrentLineBlank) {
+ // newline only if not EOF
+ if ($notEOF = $this->moveToNextLine()) {
+ $blockLines[] = '';
+ $isCurrentLineBlank = $this->isCurrentLineBlank();
+ }
+ }
+
+ // determine indentation if not specified
+ if (0 === $indentation) {
+ $currentLineLength = \strlen($this->currentLine);
+
+ for ($i = 0; $i < $currentLineLength && ' ' === $this->currentLine[$i]; ++$i) {
+ ++$indentation;
+ }
+ }
+
+ if ($indentation > 0) {
+ $pattern = sprintf('/^ {%d}(.*)$/', $indentation);
+
+ while (
+ $notEOF && (
+ $isCurrentLineBlank ||
+ self::preg_match($pattern, $this->currentLine, $matches)
+ )
+ ) {
+ if ($isCurrentLineBlank && \strlen($this->currentLine) > $indentation) {
+ $blockLines[] = substr($this->currentLine, $indentation);
+ } elseif ($isCurrentLineBlank) {
+ $blockLines[] = '';
+ } else {
+ $blockLines[] = $matches[1];
+ }
+
+ // newline only if not EOF
+ if ($notEOF = $this->moveToNextLine()) {
+ $isCurrentLineBlank = $this->isCurrentLineBlank();
+ }
+ }
+ } elseif ($notEOF) {
+ $blockLines[] = '';
+ }
+
+ if ($notEOF) {
+ $blockLines[] = '';
+ $this->moveToPreviousLine();
+ } elseif (!$notEOF && !$this->isCurrentLineLastLineInDocument()) {
+ $blockLines[] = '';
+ }
+
+ // folded style
+ if ('>' === $style) {
+ $text = '';
+ $previousLineIndented = false;
+ $previousLineBlank = false;
+
+ for ($i = 0, $blockLinesCount = \count($blockLines); $i < $blockLinesCount; ++$i) {
+ if ('' === $blockLines[$i]) {
+ $text .= "\n";
+ $previousLineIndented = false;
+ $previousLineBlank = true;
+ } elseif (' ' === $blockLines[$i][0]) {
+ $text .= "\n".$blockLines[$i];
+ $previousLineIndented = true;
+ $previousLineBlank = false;
+ } elseif ($previousLineIndented) {
+ $text .= "\n".$blockLines[$i];
+ $previousLineIndented = false;
+ $previousLineBlank = false;
+ } elseif ($previousLineBlank || 0 === $i) {
+ $text .= $blockLines[$i];
+ $previousLineIndented = false;
+ $previousLineBlank = false;
+ } else {
+ $text .= ' '.$blockLines[$i];
+ $previousLineIndented = false;
+ $previousLineBlank = false;
+ }
+ }
+ } else {
+ $text = implode("\n", $blockLines);
+ }
+
+ // deal with trailing newlines
+ if ('' === $chomping) {
+ $text = preg_replace('/\n+$/', "\n", $text);
+ } elseif ('-' === $chomping) {
+ $text = preg_replace('/\n+$/', '', $text);
+ }
+
+ return $text;
+ }
+
+ /**
+ * Returns true if the next line is indented.
+ */
+ private function isNextLineIndented(): bool
+ {
+ $currentIndentation = $this->getCurrentLineIndentation();
+ $movements = 0;
+
+ do {
+ $EOF = !$this->moveToNextLine();
+
+ if (!$EOF) {
+ ++$movements;
+ }
+ } while (!$EOF && ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()));
+
+ if ($EOF) {
+ return false;
+ }
+
+ $ret = $this->getCurrentLineIndentation() > $currentIndentation;
+
+ for ($i = 0; $i < $movements; ++$i) {
+ $this->moveToPreviousLine();
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Returns true if the current line is blank or if it is a comment line.
+ */
+ private function isCurrentLineEmpty(): bool
+ {
+ return $this->isCurrentLineBlank() || $this->isCurrentLineComment();
+ }
+
+ /**
+ * Returns true if the current line is blank.
+ */
+ private function isCurrentLineBlank(): bool
+ {
+ return '' === $this->currentLine || '' === trim($this->currentLine, ' ');
+ }
+
+ /**
+ * Returns true if the current line is a comment line.
+ */
+ private function isCurrentLineComment(): bool
+ {
+ //checking explicitly the first char of the trim is faster than loops or strpos
+ $ltrimmedLine = '' !== $this->currentLine && ' ' === $this->currentLine[0] ? ltrim($this->currentLine, ' ') : $this->currentLine;
+
+ return '' !== $ltrimmedLine && '#' === $ltrimmedLine[0];
+ }
+
+ private function isCurrentLineLastLineInDocument(): bool
+ {
+ return ($this->offset + $this->currentLineNb) >= ($this->totalNumberOfLines - 1);
+ }
+
+ /**
+ * Cleanups a YAML string to be parsed.
+ *
+ * @param string $value The input YAML string
+ */
+ private function cleanup(string $value): string
+ {
+ $value = str_replace(["\r\n", "\r"], "\n", $value);
+
+ // strip YAML header
+ $count = 0;
+ $value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#u', '', $value, -1, $count);
+ $this->offset += $count;
+
+ // remove leading comments
+ $trimmedValue = preg_replace('#^(\#.*?\n)+#s', '', $value, -1, $count);
+ if (1 === $count) {
+ // items have been removed, update the offset
+ $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
+ $value = $trimmedValue;
+ }
+
+ // remove start of the document marker (---)
+ $trimmedValue = preg_replace('#^\-\-\-.*?\n#s', '', $value, -1, $count);
+ if (1 === $count) {
+ // items have been removed, update the offset
+ $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
+ $value = $trimmedValue;
+
+ // remove end of the document marker (...)
+ $value = preg_replace('#\.\.\.\s*$#', '', $value);
+ }
+
+ return $value;
+ }
+
+ /**
+ * Returns true if the next line starts unindented collection.
+ */
+ private function isNextLineUnIndentedCollection(): bool
+ {
+ $currentIndentation = $this->getCurrentLineIndentation();
+ $movements = 0;
+
+ do {
+ $EOF = !$this->moveToNextLine();
+
+ if (!$EOF) {
+ ++$movements;
+ }
+ } while (!$EOF && ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()));
+
+ if ($EOF) {
+ return false;
+ }
+
+ $ret = $this->getCurrentLineIndentation() === $currentIndentation && $this->isStringUnIndentedCollectionItem();
+
+ for ($i = 0; $i < $movements; ++$i) {
+ $this->moveToPreviousLine();
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Returns true if the string is un-indented collection item.
+ */
+ private function isStringUnIndentedCollectionItem(): bool
+ {
+ return '-' === rtrim($this->currentLine) || 0 === strpos($this->currentLine, '- ');
+ }
+
+ /**
+ * A local wrapper for "preg_match" which will throw a ParseException if there
+ * is an internal error in the PCRE engine.
+ *
+ * This avoids us needing to check for "false" every time PCRE is used
+ * in the YAML engine
+ *
+ * @throws ParseException on a PCRE internal error
+ *
+ * @see preg_last_error()
+ *
+ * @internal
+ */
+ public static function preg_match(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0): int
+ {
+ if (false === $ret = preg_match($pattern, $subject, $matches, $flags, $offset)) {
+ switch (preg_last_error()) {
+ case \PREG_INTERNAL_ERROR:
+ $error = 'Internal PCRE error.';
+ break;
+ case \PREG_BACKTRACK_LIMIT_ERROR:
+ $error = 'pcre.backtrack_limit reached.';
+ break;
+ case \PREG_RECURSION_LIMIT_ERROR:
+ $error = 'pcre.recursion_limit reached.';
+ break;
+ case \PREG_BAD_UTF8_ERROR:
+ $error = 'Malformed UTF-8 data.';
+ break;
+ case \PREG_BAD_UTF8_OFFSET_ERROR:
+ $error = 'Offset doesn\'t correspond to the begin of a valid UTF-8 code point.';
+ break;
+ default:
+ $error = 'Error.';
+ }
+
+ throw new ParseException($error);
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Trim the tag on top of the value.
+ *
+ * Prevent values such as "!foo {quz: bar}" to be considered as
+ * a mapping block.
+ */
+ private function trimTag(string $value): string
+ {
+ if ('!' === $value[0]) {
+ return ltrim(substr($value, 1, strcspn($value, " \r\n", 1)), ' ');
+ }
+
+ return $value;
+ }
+
+ private function getLineTag(string $value, int $flags, bool $nextLineCheck = true): ?string
+ {
+ if ('' === $value || '!' !== $value[0] || 1 !== self::preg_match('/^'.self::TAG_PATTERN.' *( +#.*)?$/', $value, $matches)) {
+ return null;
+ }
+
+ if ($nextLineCheck && !$this->isNextLineIndented()) {
+ return null;
+ }
+
+ $tag = substr($matches['tag'], 1);
+
+ // Built-in tags
+ if ($tag && '!' === $tag[0]) {
+ throw new ParseException(sprintf('The built-in tag "!%s" is not implemented.', $tag), $this->getRealCurrentLineNb() + 1, $value, $this->filename);
+ }
+
+ if (Yaml::PARSE_CUSTOM_TAGS & $flags) {
+ return $tag;
+ }
+
+ throw new ParseException(sprintf('Tags support is not enabled. You must use the flag "Yaml::PARSE_CUSTOM_TAGS" to use "%s".', $matches['tag']), $this->getRealCurrentLineNb() + 1, $value, $this->filename);
+ }
+
+ private function lexInlineQuotedString(int &$cursor = 0): string
+ {
+ $quotation = $this->currentLine[$cursor];
+ $value = $quotation;
+ ++$cursor;
+
+ $previousLineWasNewline = true;
+ $previousLineWasTerminatedWithBackslash = false;
+ $lineNumber = 0;
+
+ do {
+ if (++$lineNumber > 1) {
+ $cursor += strspn($this->currentLine, ' ', $cursor);
+ }
+
+ if ($this->isCurrentLineBlank()) {
+ $value .= "\n";
+ } elseif (!$previousLineWasNewline && !$previousLineWasTerminatedWithBackslash) {
+ $value .= ' ';
+ }
+
+ for (; \strlen($this->currentLine) > $cursor; ++$cursor) {
+ switch ($this->currentLine[$cursor]) {
+ case '\\':
+ if ("'" === $quotation) {
+ $value .= '\\';
+ } elseif (isset($this->currentLine[++$cursor])) {
+ $value .= '\\'.$this->currentLine[$cursor];
+ }
+
+ break;
+ case $quotation:
+ ++$cursor;
+
+ if ("'" === $quotation && isset($this->currentLine[$cursor]) && "'" === $this->currentLine[$cursor]) {
+ $value .= "''";
+ break;
+ }
+
+ return $value.$quotation;
+ default:
+ $value .= $this->currentLine[$cursor];
+ }
+ }
+
+ if ($this->isCurrentLineBlank()) {
+ $previousLineWasNewline = true;
+ $previousLineWasTerminatedWithBackslash = false;
+ } elseif ('\\' === $this->currentLine[-1]) {
+ $previousLineWasNewline = false;
+ $previousLineWasTerminatedWithBackslash = true;
+ } else {
+ $previousLineWasNewline = false;
+ $previousLineWasTerminatedWithBackslash = false;
+ }
+
+ if ($this->hasMoreLines()) {
+ $cursor = 0;
+ }
+ } while ($this->moveToNextLine());
+
+ throw new ParseException('Malformed inline YAML string.');
+ }
+
+ private function lexUnquotedString(int &$cursor): string
+ {
+ $offset = $cursor;
+ $cursor += strcspn($this->currentLine, '[]{},: ', $cursor);
+
+ if ($cursor === $offset) {
+ throw new ParseException('Malformed unquoted YAML string.');
+ }
+
+ return substr($this->currentLine, $offset, $cursor - $offset);
+ }
+
+ private function lexInlineMapping(int &$cursor = 0): string
+ {
+ return $this->lexInlineStructure($cursor, '}');
+ }
+
+ private function lexInlineSequence(int &$cursor = 0): string
+ {
+ return $this->lexInlineStructure($cursor, ']');
+ }
+
+ private function lexInlineStructure(int &$cursor, string $closingTag): string
+ {
+ $value = $this->currentLine[$cursor];
+ ++$cursor;
+
+ do {
+ $this->consumeWhitespaces($cursor);
+
+ while (isset($this->currentLine[$cursor])) {
+ switch ($this->currentLine[$cursor]) {
+ case '"':
+ case "'":
+ $value .= $this->lexInlineQuotedString($cursor);
+ break;
+ case ':':
+ case ',':
+ $value .= $this->currentLine[$cursor];
+ ++$cursor;
+ break;
+ case '{':
+ $value .= $this->lexInlineMapping($cursor);
+ break;
+ case '[':
+ $value .= $this->lexInlineSequence($cursor);
+ break;
+ case $closingTag:
+ $value .= $this->currentLine[$cursor];
+ ++$cursor;
+
+ return $value;
+ case '#':
+ break 2;
+ default:
+ $value .= $this->lexUnquotedString($cursor);
+ }
+
+ if ($this->consumeWhitespaces($cursor)) {
+ $value .= ' ';
+ }
+ }
+
+ if ($this->hasMoreLines()) {
+ $cursor = 0;
+ }
+ } while ($this->moveToNextLine());
+
+ throw new ParseException('Malformed inline YAML string.');
+ }
+
+ private function consumeWhitespaces(int &$cursor): bool
+ {
+ $whitespacesConsumed = 0;
+
+ do {
+ $whitespaceOnlyTokenLength = strspn($this->currentLine, ' ', $cursor);
+ $whitespacesConsumed += $whitespaceOnlyTokenLength;
+ $cursor += $whitespaceOnlyTokenLength;
+
+ if (isset($this->currentLine[$cursor])) {
+ return 0 < $whitespacesConsumed;
+ }
+
+ if ($this->hasMoreLines()) {
+ $cursor = 0;
+ }
+ } while ($this->moveToNextLine());
+
+ return 0 < $whitespacesConsumed;
+ }
+}
diff --git a/vendor/symfony/yaml/README.md b/vendor/symfony/yaml/README.md
new file mode 100644
index 00000000..ac25024b
--- /dev/null
+++ b/vendor/symfony/yaml/README.md
@@ -0,0 +1,13 @@
+Yaml Component
+==============
+
+The Yaml component loads and dumps YAML files.
+
+Resources
+---------
+
+ * [Documentation](https://symfony.com/doc/current/components/yaml.html)
+ * [Contributing](https://symfony.com/doc/current/contributing/index.html)
+ * [Report issues](https://github.com/symfony/symfony/issues) and
+ [send Pull Requests](https://github.com/symfony/symfony/pulls)
+ in the [main Symfony repository](https://github.com/symfony/symfony)
diff --git a/vendor/symfony/yaml/Resources/bin/yaml-lint b/vendor/symfony/yaml/Resources/bin/yaml-lint
new file mode 100755
index 00000000..0ad73d71
--- /dev/null
+++ b/vendor/symfony/yaml/Resources/bin/yaml-lint
@@ -0,0 +1,45 @@
+#!/usr/bin/env php
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Runs the Yaml lint command.
+ *
+ * @author Jan Schädlich
+ */
+
+use Symfony\Component\Console\Application;
+use Symfony\Component\Yaml\Command\LintCommand;
+
+function includeIfExists(string $file): bool
+{
+ return file_exists($file) && include $file;
+}
+
+if (
+ !includeIfExists(__DIR__ . '/../../../../autoload.php') &&
+ !includeIfExists(__DIR__ . '/../../vendor/autoload.php') &&
+ !includeIfExists(__DIR__ . '/../../../../../../vendor/autoload.php')
+) {
+ fwrite(STDERR, 'Install dependencies using Composer.'.PHP_EOL);
+ exit(1);
+}
+
+if (!class_exists(Application::class)) {
+ fwrite(STDERR, 'You need the "symfony/console" component in order to run the Yaml linter.'.PHP_EOL);
+ exit(1);
+}
+
+(new Application())->add($command = new LintCommand())
+ ->getApplication()
+ ->setDefaultCommand($command->getName(), true)
+ ->run()
+;
diff --git a/vendor/symfony/yaml/Tag/TaggedValue.php b/vendor/symfony/yaml/Tag/TaggedValue.php
new file mode 100644
index 00000000..4ea34061
--- /dev/null
+++ b/vendor/symfony/yaml/Tag/TaggedValue.php
@@ -0,0 +1,38 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml\Tag;
+
+/**
+ * @author Nicolas Grekas ]
+ * @author Guilhem N.
+ */
+final class TaggedValue
+{
+ private $tag;
+ private $value;
+
+ public function __construct(string $tag, $value)
+ {
+ $this->tag = $tag;
+ $this->value = $value;
+ }
+
+ public function getTag(): string
+ {
+ return $this->tag;
+ }
+
+ public function getValue()
+ {
+ return $this->value;
+ }
+}
diff --git a/vendor/symfony/yaml/Unescaper.php b/vendor/symfony/yaml/Unescaper.php
new file mode 100644
index 00000000..d1ef0412
--- /dev/null
+++ b/vendor/symfony/yaml/Unescaper.php
@@ -0,0 +1,132 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml;
+
+use Symfony\Component\Yaml\Exception\ParseException;
+
+/**
+ * Unescaper encapsulates unescaping rules for single and double-quoted
+ * YAML strings.
+ *
+ * @author Matthew Lewinski
+ *
+ * @internal
+ */
+class Unescaper
+{
+ /**
+ * Regex fragment that matches an escaped character in a double quoted string.
+ */
+ public const REGEX_ESCAPED_CHARACTER = '\\\\(x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8}|.)';
+
+ /**
+ * Unescapes a single quoted string.
+ *
+ * @param string $value A single quoted string
+ */
+ public function unescapeSingleQuotedString(string $value): string
+ {
+ return str_replace('\'\'', '\'', $value);
+ }
+
+ /**
+ * Unescapes a double quoted string.
+ *
+ * @param string $value A double quoted string
+ */
+ public function unescapeDoubleQuotedString(string $value): string
+ {
+ $callback = function ($match) {
+ return $this->unescapeCharacter($match[0]);
+ };
+
+ // evaluate the string
+ return preg_replace_callback('/'.self::REGEX_ESCAPED_CHARACTER.'/u', $callback, $value);
+ }
+
+ /**
+ * Unescapes a character that was found in a double-quoted string.
+ *
+ * @param string $value An escaped character
+ */
+ private function unescapeCharacter(string $value): string
+ {
+ switch ($value[1]) {
+ case '0':
+ return "\x0";
+ case 'a':
+ return "\x7";
+ case 'b':
+ return "\x8";
+ case 't':
+ return "\t";
+ case "\t":
+ return "\t";
+ case 'n':
+ return "\n";
+ case 'v':
+ return "\xB";
+ case 'f':
+ return "\xC";
+ case 'r':
+ return "\r";
+ case 'e':
+ return "\x1B";
+ case ' ':
+ return ' ';
+ case '"':
+ return '"';
+ case '/':
+ return '/';
+ case '\\':
+ return '\\';
+ case 'N':
+ // U+0085 NEXT LINE
+ return "\xC2\x85";
+ case '_':
+ // U+00A0 NO-BREAK SPACE
+ return "\xC2\xA0";
+ case 'L':
+ // U+2028 LINE SEPARATOR
+ return "\xE2\x80\xA8";
+ case 'P':
+ // U+2029 PARAGRAPH SEPARATOR
+ return "\xE2\x80\xA9";
+ case 'x':
+ return self::utf8chr(hexdec(substr($value, 2, 2)));
+ case 'u':
+ return self::utf8chr(hexdec(substr($value, 2, 4)));
+ case 'U':
+ return self::utf8chr(hexdec(substr($value, 2, 8)));
+ default:
+ throw new ParseException(sprintf('Found unknown escape character "%s".', $value));
+ }
+ }
+
+ /**
+ * Get the UTF-8 character for the given code point.
+ */
+ private static function utf8chr(int $c): string
+ {
+ if (0x80 > $c %= 0x200000) {
+ return \chr($c);
+ }
+ if (0x800 > $c) {
+ return \chr(0xC0 | $c >> 6).\chr(0x80 | $c & 0x3F);
+ }
+ if (0x10000 > $c) {
+ return \chr(0xE0 | $c >> 12).\chr(0x80 | $c >> 6 & 0x3F).\chr(0x80 | $c & 0x3F);
+ }
+
+ return \chr(0xF0 | $c >> 18).\chr(0x80 | $c >> 12 & 0x3F).\chr(0x80 | $c >> 6 & 0x3F).\chr(0x80 | $c & 0x3F);
+ }
+}
diff --git a/vendor/symfony/yaml/Yaml.php b/vendor/symfony/yaml/Yaml.php
new file mode 100644
index 00000000..ea130452
--- /dev/null
+++ b/vendor/symfony/yaml/Yaml.php
@@ -0,0 +1,100 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml;
+
+use Symfony\Component\Yaml\Exception\ParseException;
+
+/**
+ * Yaml offers convenience methods to load and dump YAML.
+ *
+ * @author Fabien Potencier
+ *
+ * @final
+ */
+class Yaml
+{
+ public const DUMP_OBJECT = 1;
+ public const PARSE_EXCEPTION_ON_INVALID_TYPE = 2;
+ public const PARSE_OBJECT = 4;
+ public const PARSE_OBJECT_FOR_MAP = 8;
+ public const DUMP_EXCEPTION_ON_INVALID_TYPE = 16;
+ public const PARSE_DATETIME = 32;
+ public const DUMP_OBJECT_AS_MAP = 64;
+ public const DUMP_MULTI_LINE_LITERAL_BLOCK = 128;
+ public const PARSE_CONSTANT = 256;
+ public const PARSE_CUSTOM_TAGS = 512;
+ public const DUMP_EMPTY_ARRAY_AS_SEQUENCE = 1024;
+ public const DUMP_NULL_AS_TILDE = 2048;
+
+ /**
+ * Parses a YAML file into a PHP value.
+ *
+ * Usage:
+ *
+ * $array = Yaml::parseFile('config.yml');
+ * print_r($array);
+ *
+ * @param string $filename The path to the YAML file to be parsed
+ * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior
+ *
+ * @return mixed
+ *
+ * @throws ParseException If the file could not be read or the YAML is not valid
+ */
+ public static function parseFile(string $filename, int $flags = 0)
+ {
+ $yaml = new Parser();
+
+ return $yaml->parseFile($filename, $flags);
+ }
+
+ /**
+ * Parses YAML into a PHP value.
+ *
+ * Usage:
+ *
+ * $array = Yaml::parse(file_get_contents('config.yml'));
+ * print_r($array);
+ *
+ *
+ * @param string $input A string containing YAML
+ * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior
+ *
+ * @return mixed
+ *
+ * @throws ParseException If the YAML is not valid
+ */
+ public static function parse(string $input, int $flags = 0)
+ {
+ $yaml = new Parser();
+
+ return $yaml->parse($input, $flags);
+ }
+
+ /**
+ * Dumps a PHP value to a YAML string.
+ *
+ * The dump method, when supplied with an array, will do its best
+ * to convert the array into friendly YAML.
+ *
+ * @param mixed $input The PHP value
+ * @param int $inline The level where you switch to inline YAML
+ * @param int $indent The amount of spaces to use for indentation of nested nodes
+ * @param int $flags A bit field of DUMP_* constants to customize the dumped YAML string
+ */
+ public static function dump($input, int $inline = 2, int $indent = 4, int $flags = 0): string
+ {
+ $yaml = new Dumper($indent);
+
+ return $yaml->dump($input, $inline, 0, $flags);
+ }
+}
diff --git a/vendor/symfony/yaml/composer.json b/vendor/symfony/yaml/composer.json
new file mode 100644
index 00000000..7fa6e2cc
--- /dev/null
+++ b/vendor/symfony/yaml/composer.json
@@ -0,0 +1,42 @@
+{
+ "name": "symfony/yaml",
+ "type": "library",
+ "description": "Loads and dumps YAML files",
+ "keywords": [],
+ "homepage": "https://symfony.com",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "require-dev": {
+ "symfony/console": "^5.3|^6.0"
+ },
+ "conflict": {
+ "symfony/console": "<5.3"
+ },
+ "suggest": {
+ "symfony/console": "For validating YAML files using the lint command"
+ },
+ "autoload": {
+ "psr-4": { "Symfony\\Component\\Yaml\\": "" },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "bin": [
+ "Resources/bin/yaml-lint"
+ ],
+ "minimum-stability": "dev"
+}