Compare commits

...

40 Commits

Author SHA1 Message Date
Kode
43f9b76ff3 Merge branch '2.x' into 2.5.0 2022-03-18 16:42:02 +00:00
KodeStar
85c68c1f46 Merge pull request #783 from xavier-GitHub76/2.x
Update app.php (French translations Fix) + version app (2.4.4)
2022-03-18 16:40:10 +00:00
Kode
ffcfef8d1c Merge branch '2.x' into 2.5.0 2022-03-18 16:36:30 +00:00
Kode
fc2191b8db Fix preview image 2022-03-18 16:36:05 +00:00
Kode
03edaea99a Initial start of adding an API 2022-03-18 16:33:46 +00:00
xavier-GitHub76
ee36a0cfae Update app.php
Update version app to 2.4.4
2022-03-18 14:32:15 +01:00
Kode
a868a6cac1 Fix for creating tags not setting home dashboard as default 2022-03-18 10:10:00 +00:00
xavier-GitHub76
574756b236 Update app.php
French translate fix
2022-03-17 22:43:05 +01:00
Kode
f9599079e5 Update app.php 2022-03-17 19:04:39 +00:00
Kode
10afffb71d Fix test button 2022-03-17 19:03:06 +00:00
KodeStar
79d53af339 Update app.php 2022-03-17 13:42:07 +00:00
KodeStar
8cc6a9cc63 Pull missing apps on update apps list 2022-03-17 13:41:50 +00:00
KodeStar
18001fbdd0 Get app regardless of if it's enhanced (might be a search provider) 2022-03-17 12:56:51 +00:00
KodeStar
41c2983312 Add warning about http being needed in url 2022-03-17 10:55:52 +00:00
KodeStar
e52bc9c6b2 Update supportedapps.json 2022-03-17 10:23:15 +00:00
KodeStar
a16233ee10 Fix for displaying svg icons correctly 2022-03-17 10:21:24 +00:00
Kode
5b177f1127 Merge branch '2.3' into 2.x 2022-03-16 20:16:04 +00:00
Kode
f7633b6a5f Update mix-manifest.json 2022-03-16 20:15:22 +00:00
Kode
d58e6cb560 Fix for #774 2022-03-16 20:13:16 +00:00
Kode
87fe9c1771 Move setLocale out of vie composer so it's available everywhere
Fixes #776
2022-03-16 20:07:43 +00:00
Kode
95d9e9edb9 Update app.php 2022-03-16 19:43:03 +00:00
Kode
f7b2c51f9d Fix for old apps and icon selector 2022-03-16 19:41:01 +00:00
Kode
72c70e27f2 Remove refresh button for now as update code isn't ready yet 2022-03-16 18:39:47 +00:00
Kode
becbe5ab96 More work on apps 2022-03-16 18:35:40 +00:00
Kode
f5bce95808 Add missing lang string, fixed #773 2022-03-16 18:34:48 +00:00
KodeStar
1e2b807e05 Lots of work on apps 2022-03-16 15:49:44 +00:00
Kode
ed3dbf2f14 More work on enhanced apps 2022-03-15 20:09:22 +00:00
Kode
1e35f83fed Changes to the tooltips 2022-03-15 19:08:10 +00:00
KodeStar
8499d100ff More work on apps 2022-03-15 18:19:01 +00:00
KodeStar
bdeae6a722 Add missing files 2022-03-15 11:30:21 +00:00
Kode
4c63b66dbf Initial start of replacing apps list to use github generated list 2022-03-14 15:56:36 +00:00
Kode
371f52f92e Fixes #469 2022-03-14 12:25:20 +00:00
KodeStar
6daaf94974 Add details for search providers 2022-03-14 10:34:37 +00:00
Kode
b8e5a22648 Update app.php 2022-03-14 07:56:41 +00:00
Kode
e821edf01a Fix tags url
Fixes #763
2022-03-14 07:56:02 +00:00
Kode
188316df47 Fix search using incorrect value
fixes #764
2022-03-14 07:55:26 +00:00
Kode
dd14ce8738 Update app.php 2022-03-13 19:31:30 +00:00
Kode
d8e4053ce4 Merge branch 'master' of https://github.com/linuxserver/Heimdall 2022-03-13 19:30:27 +00:00
Kode
f73b78f292 Add search providers as an editable yaml file + allow searching tiles 2022-03-13 19:30:24 +00:00
Kode
96ec1e0b08 Fixes #435 2022-03-13 16:13:36 +00:00
68 changed files with 8144 additions and 253 deletions

View File

@@ -39,23 +39,86 @@ class Application extends Model
public function class()
{
$name = $this->name;
$name = preg_replace('/\PL/u', '', $name);
$name = preg_replace('/[^\p{L}\p{N}]/u', '', $name);
$class = '\App\SupportedApps\\'.$name.'\\'.$name;
return $class;
}
public static function classFromName($name)
{
$name = preg_replace('/[^\p{L}\p{N}]/u', '', $name);
$class = '\App\SupportedApps\\'.$name.'\\'.$name;
return $class;
}
public static function apps()
{
$json = json_decode(file_get_contents(storage_path('app/supportedapps.json'))) ?? [];
$apps = collect($json->apps);
$sorted = $apps->sortBy('name', SORT_NATURAL|SORT_FLAG_CASE);
return $sorted;
}
public static function autocomplete()
{
$apps = self::apps();
$list = [];
foreach($apps as $app) {
$list[] = (object)[
'label' => $app->name,
'value' => $app->appid
];
}
return $list;
}
public static function getApp($appid)
{
$localapp = Application::where('appid', $appid)->first();
$app = self::single($appid);
$application = ($localapp) ? $localapp : new Application;
if(!file_exists(app_path('SupportedApps/'.className($app->name)))) {
SupportedApps::getFiles($app);
SupportedApps::saveApp($app, $application);
} else {
// check if there has been an update for this app
if($localapp) {
if($localapp->sha !== $app->sha) {
SupportedApps::getFiles($app);
$app = SupportedApps::saveApp($app, $application);
}
} else {
SupportedApps::getFiles($app);
$app = SupportedApps::saveApp($app, $application);
}
}
return $app;
}
public static function single($appid)
{
$apps = self::apps();
$app = $apps->where('appid', $appid)->first();
if ($app === null) return null;
$classname = preg_replace('/[^\p{L}\p{N}]/u', '', $app->name);
$app->class = '\App\SupportedApps\\'.$classname.'\\'.$classname;
return $app;
}
public static function applist()
{
$list = [];
$all = self::orderBy('name')->get()->sortBy('name', SORT_NATURAL|SORT_FLAG_CASE);
$list['null'] = 'None';
foreach($all as $app) {
$name = $app->name;
// $name = preg_replace('/\PL/u', '', $name);
$name = preg_replace('/[^\p{L}\p{N}]/u', '', $name);
$list['\App\SupportedApps\\'.$name.'\\'.$name] = $app->name;
$apps = self::apps();
foreach($apps as $app) {
$list[$app->appid] = $app->name;
}
return $list;
}

View File

@@ -73,7 +73,7 @@ function getLinkTargetAttribute()
function className($name)
{
$name = preg_replace('/\PL/u', '', $name);
$name = preg_replace('/[^\p{L}\p{N}]/u', '', $name);
return $name;
}

View File

@@ -0,0 +1,105 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Item;
use App\SettingUser;
use App\User;
class ApiItemController extends Controller
{
protected $api_key;
protected $user;
function __construct(Request $request) {
$this->middleware('apikey');
$key = $request->input('api_key');
if ($key) {
$details = SettingUser::where('setting_id', 12)->where('uservalue', $key)->first();
$this->api_key = $key;
$this->user = User::find($details->user_id);
}
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return $this->user->items;
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$request->merge([
'user_id' => $this->user->id
]);
// die(print_r($request->all()));
Item::create($request->all());
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}

View File

@@ -15,6 +15,11 @@ use App\Jobs\ProcessApps;
use App\Search;
use Illuminate\Support\Facades\Route;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
use Illuminate\Support\Facades\Log;
class ItemController extends Controller
{
public function __construct()
@@ -140,20 +145,41 @@ class ItemController extends Controller
//
$data['tags'] = Item::ofType('tag')->orderBy('title', 'asc')->pluck('title', 'id');
$data['tags']->prepend(__('app.dashboard'), 0);
$data['current_tags'] = collect([0 => __('app.dashboard')]);
$data['current_tags'] = '0';
return view('items.create', $data);
}
/**
* Store a newly created resource in storage.
* Show the form for editing the specified resource.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
public function edit($id)
{
//
// Get the item
$item = Item::find($id);
if($item->appid === null && $item->class !== null) { // old apps wont have an app id so set it
$app = Application::where('class', $item->class)->first();
if($app) {
$item->appid = $app->appid;
}
}
$data['item'] = $item;
$data['tags'] = Item::ofType('tag')->orderBy('title', 'asc')->pluck('title', 'id');
$data['tags']->prepend(__('app.dashboard'), 0);
$data['current_tags'] = $data['item']->tags();
//$data['current_tags'] = $data['item']->parent;
//die(print_r($data['current_tags']));
// show the edit form and pass the nerd
return view('items.edit', $data);
}
public function storelogic($request, $id = null)
{
$application = Application::single($request->input('appid'));
$validatedData = $request->validate([
'title' => 'required|max:255',
'url' => 'required',
@@ -164,6 +190,22 @@ class ItemController extends Controller
$request->merge([
'icon' => $path
]);
} elseif(strpos($request->input('icon'), 'http') === 0) {
$contents = file_get_contents($request->input('icon'));
if ($application) {
$icon = $application->icon;
} else {
$file = $request->input('icon');
$path_parts = pathinfo($file);
$icon = md5($contents);
$icon .= '.'.$path_parts['extension'];
}
$path = 'icons/'.$icon;
Storage::disk('public')->put($path, $contents);
$request->merge([
'icon' => $path
]);
}
$config = Item::checkConfig($request->input('config'));
@@ -173,21 +215,40 @@ class ItemController extends Controller
'user_id' => $current_user->id
]);
if($request->input('class') === 'null') {
if($request->input('appid') === 'null') {
$request->merge([
'class' => null,
]);
} else {
$request->merge([
'class' => Application::classFromName($application->name),
]);
}
//die(print_r($request->input('config')));
$item = Item::create($request->all());
if($id === null) {
$item = Item::create($request->all());
} else {
$item = Item::find($id);
$item->update($request->all());
}
//Search::storeSearchProvider($request->input('class'), $item);
$item->parents()->sync($request->tags);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$this->storelogic($request);
$route = route('dash', []);
return redirect($route)
->with('success', __('app.alert.success.item_created'));
@@ -204,24 +265,6 @@ class ItemController extends Controller
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
// Get the item
$data['item'] = Item::find($id);
$data['tags'] = Item::ofType('tag')->orderBy('title', 'asc')->pluck('title', 'id');
$data['tags']->prepend(__('app.dashboard'), 0);
$data['current_tags'] = $data['item']->tags();
//$data['current_tags'] = $data['item']->parent;
//die(print_r($data['current_tags']));
// show the edit form and pass the nerd
return view('items.edit', $data);
}
/**
* Update the specified resource in storage.
@@ -232,39 +275,7 @@ class ItemController extends Controller
*/
public function update(Request $request, $id)
{
$validatedData = $request->validate([
'title' => 'required|max:255',
'url' => 'required',
]);
//die(print_r($request->all()));
if($request->hasFile('file')) {
$path = $request->file('file')->store('icons');
$request->merge([
'icon' => $path
]);
}
$config = Item::checkConfig($request->input('config'));
$current_user = User::currentUser();
$request->merge([
'description' => $config,
'user_id' => $current_user->id
]);
if($request->input('class') === 'null') {
$request->merge([
'class' => null,
]);
}
$item = Item::find($id);
$item->update($request->all());
//Search::storeSearchProvider($request->input('class'), $item);
$item->parents()->sync($request->tags);
$this->storelogic($request, $id);
$route = route('dash', []);
return redirect($route)
->with('success',__('app.alert.success.item_updated'));
@@ -319,7 +330,10 @@ class ItemController extends Controller
public function appload(Request $request)
{
$output = [];
$appname = $request->input('app');
$appid = $request->input('app');
if($appid === "null") return null;
/*$appname = $request->input('app');
//die($appname);
$app_details = Application::where('name', $appname)->firstOrFail();
@@ -338,8 +352,28 @@ class ItemController extends Controller
$output['config'] = className($app_details->name).'.config';
} else {
$output['config'] = null;
}*/
$output['config'] = null;
$output['custom'] = null;
$app = Application::single($appid);
$output = (array)$app;
$appdetails = Application::getApp($appid);
if((boolean)$app->enhanced === true) {
// if(!isset($app->config)) { // class based config
$output['custom'] = className($appdetails->name).'.config';
// }
}
$output['colour'] = ($app->tile_background == 'light') ? '#fafbfc' : '#161b1f';
$output['iconview'] = config('app.appsource').'icons/' . $app->icon;
;
return json_encode($output);
}
@@ -347,14 +381,49 @@ class ItemController extends Controller
{
$data = $request->input('data');
//$url = $data[array_search('url', array_column($data, 'name'))]['value'];
$app = $data['type'];
$single = Application::single($data['type']);
$app = $single->class;
$app_details = new $app();
$app_details->config = (object)$data;
$app_details->test();
}
public function execute($url, $attrs = [], $overridevars=false)
{
$res = null;
$vars = ($overridevars !== false) ?
$overridevars : [
'http_errors' => false,
'timeout' => 15,
'connect_timeout' => 15,
'verify' => false
];
$client = new Client($vars);
$method = 'GET';
try {
return $client->request($method, $url, $attrs);
} catch (\GuzzleHttp\Exception\ConnectException $e) {
Log::error("Connection refused");
Log::debug($e->getMessage());
} catch (\GuzzleHttp\Exception\ServerException $e) {
Log::debug($e->getMessage());
}
return $res;
}
public function websitelookup($url)
{
$url = \base64_decode($url);
$data = $this->execute($url);
return $data->getBody();
}
public function getStats($id)
{
$item = Item::find($id);

View File

@@ -16,7 +16,7 @@ class SearchController extends Controller
$provider = Search::providerDetails($requestprovider);
if($provider->type == 'standard') {
return redirect($provider->url.'?'.$provider->var.'='.urlencode($query));
return redirect($provider->url.'?'.$provider->query.'='.urlencode($query));
} elseif($provider->type == 'external') {
$class = new $provider->class;
//print_r($provider);

View File

@@ -8,6 +8,7 @@ use App\SettingGroup;
use App\User;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Support\Str;
class SettingsController extends Controller
{
@@ -77,7 +78,8 @@ class SettingsController extends Controller
$path = $request->file('value')->store('backgrounds');
$setting_value = $path;
}
} elseif ($setting->type == 'apikey') {
$setting_value = Str::random(40);
} else {
$setting_value = $data->value;
}

View File

@@ -58,5 +58,6 @@ class Kernel extends HttpKernel
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'apikey' => \App\Http\Middleware\UserApiKey::class,
];
}

View File

@@ -0,0 +1,30 @@
<?php
namespace App\Http\Middleware;
use Closure;
use \App\SettingUser;
class UserApiKey
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$key = $request->input('api_key');
$details = SettingUser::where('setting_id', 12)->where('uservalue', $key)->first();
// die(var_dump($details));
if($details === null) {
return response()->json([
'status' => 401,
'message' => 'invalid api key'
], 401);
}
return $next($request);
}
}

View File

@@ -30,7 +30,7 @@ class Item extends Model
//
protected $fillable = [
'title', 'url', 'colour', 'icon', 'description', 'pinned', 'order', 'type', 'class', 'user_id'
'title', 'url', 'colour', 'icon', 'appdescription', 'description', 'pinned', 'order', 'type', 'class', 'user_id', 'appid'
];
/**
@@ -53,22 +53,10 @@ class Item extends Model
public static function checkConfig($config)
{
// die(print_r($config));
if(empty($config)) {
$config = null;
} else {
$store = false;
//die(var_dump($config));
foreach($config as $key => $check) {
if($key == 'type') continue;
if($key == 'dataonly') continue;
if(!empty($check) && $check != '0') {
$store = true;
break;
}
}
//die(var_dump($store))
$config['enabled'] = ($store) ? true : false;
$config = json_encode($config);
}
return $config;
@@ -106,7 +94,7 @@ class Item extends Model
public function getLinkAttribute()
{
if((int)$this->type === 1) {
return env('APP_URL').'/tag/'.$this->url;
return url('tag/'.$this->url);
} else {
return $this->url;
}
@@ -173,12 +161,13 @@ class Item extends Model
public function enhanced()
{
if(isset($this->class) && !empty($this->class)) {
/*if(isset($this->class) && !empty($this->class)) {
$app = new $this->class;
} else {
return false;
}
return (bool)($app instanceof \App\EnhancedApps);
return (bool)($app instanceof \App\EnhancedApps);*/
return $this->description !== null;
}
public static function isEnhanced($class)
@@ -207,12 +196,12 @@ class Item extends Model
public function getconfig()
{
$explode = explode('\\', $this->class);
// $explode = explode('\\', $this->class);
if(!isset($this->description) || empty($this->description)) {
$config = new \stdClass;
$config->name = end($explode);
// $config->name = end($explode);
$config->enabled = false;
$config->override_url = null;
$config->apikey = null;
@@ -223,7 +212,7 @@ class Item extends Model
$config = json_decode($this->description);
$config->name = end($explode);
// $config->name = end($explode);
$config->url = $this->url;

View File

@@ -7,8 +7,10 @@ use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\Storage;
use App\Application;
use App\SupportedApps;
use App\Item;
class ProcessApps implements ShouldQueue
{
@@ -31,36 +33,23 @@ class ProcessApps implements ShouldQueue
*/
public function handle()
{
$localapps = Application::all();
$list = json_decode(SupportedApps::getList()->getBody());
$validapps = [];
foreach($list->apps as $app) {
$validapps[] = $app->appid;
$localapp = $localapps->where('appid', $app->appid)->first();
$localapps = Application::whereNull('class')->get();
$json = SupportedApps::getList()->getBody();
$application = ($localapp) ? $localapp : new Application;
Storage::disk('local')->put('supportedapps.json', $json);
if(!file_exists(app_path('SupportedApps/'.className($app->name)))) {
SupportedApps::getFiles($app);
SupportedApps::saveApp($app, $application);
} else {
// check if there has been an update for this app
$localapp = $localapps->where('appid', $app->appid)->first();
if($localapp) {
if($localapp->sha !== $app->sha) {
SupportedApps::getFiles($app);
SupportedApps::saveApp($app, $application);
}
} else {
SupportedApps::getFiles($app);
SupportedApps::saveApp($app, $application);
}
foreach($localapps as $app) {
$app->class = $app->class();
$app->save();
}
$items = Item::whereNotNull('class')->get();
foreach($items as $item) {
if(!file_exists(app_path('SupportedApps/'.Item::nameFromClass($item->class)))) {
$app = Application::where('class', $item->class)->first();
Application::getApp($app->appid);
}
}
//$delete = Application::whereNotIn('appid', $validapps)->delete(); // delete any apps not in list
// removed the delete so local apps can be added
}
}

View File

@@ -52,6 +52,10 @@ class AppServiceProvider extends ServiceProvider
Artisan::call('storage:link');
\Session::put('current_user', null);
}
$lang = Setting::fetch('language');
\App::setLocale($lang);
$applications = Application::all();
if($applications->count() <= 0) {
@@ -97,8 +101,6 @@ class AppServiceProvider extends ServiceProvider
if($bg_image = Setting::fetch('background_image')) {
$alt_bg = ' style="background-image: url(storage/'.$bg_image.')"';
}
$lang = Setting::fetch('language');
\App::setLocale($lang);
$allusers = User::all();
$current_user = User::currentUser();

View File

@@ -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 .= '<div id="search-container" class="input-container">';
$output .= '<select name="provider">';
foreach(self::providers() as $key => $searchprovider) {
$selected = ($key === $user_search_provider) ? ' selected="selected"' : '';
if (is_numeric($key)) {
$output .= '<option value="'.$key.'"'.$selected.'>'.$searchprovider['title'].'</option>';
} else {
$output .= '<option value="'.$key.'"'.$selected.'>'.__('app.options.'.$key).'</option>';
}
$selected = ((string)$key === (string)$user_search_provider) ? ' selected="selected"' : '';
$output .= '<option value="'.$key.'"'.$selected.'>'.$searchprovider['name'].'</option>';
}
$output .= '</select>';
$output .= Form::text('q', null, ['class' => 'homesearch', 'autofocus' => 'autofocus', 'placeholder' => __('app.settings.search').'...']);

View File

@@ -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,13 +125,24 @@ 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);
}
$value = Form::select('value', $options, null, ['class' => 'form-control']);
break;
case 'textarea':
$value = Form::textarea('value', null, ['class' => 'form-control', 'cols' => '44', 'rows' => '15']);
$value = Form::textarea('value', null, ['class' => 'form-control', 'cols' => '44', 'rows' => '15', 'style' => 'width: 100%;']);
break;
case 'apikey':
if (isset($this->value) && !empty($this->value)) {
$value = Form::text('value', null, ['class' => 'form-control']);
} else {
$value = '<div>'.$current.'</div>';
}
$value .= '<small style="margin-top: 10px; display: block">'.__('app.settings.click_generate').'</small>';
break;
default:
$value = Form::text('value', null, ['class' => 'form-control']);

View File

@@ -107,7 +107,8 @@ abstract class SupportedApps
public static function getList()
{
$list_url = 'https://apps.heimdall.site/list';
// $list_url = 'https://apps.heimdall.site/list';
$list_url = config('app.appsource').'list.json';
$client = new Client(['http_errors' => false, 'timeout' => 15, 'connect_timeout' => 15]);
return $client->request('GET', $list_url);
}
@@ -121,7 +122,8 @@ abstract class SupportedApps
public static function getFiles($app)
{
$zipurl = $app->files;
$zipurl = config('app.appsource').'files/'.$app->sha.'.zip';
$client = new Client(['http_errors' => false, 'timeout' => 60, 'connect_timeout' => 15]);
$res = $client->request('GET', $zipurl);
@@ -138,35 +140,28 @@ abstract class SupportedApps
$zip->extractTo(app_path('SupportedApps')); // place in the directory with same name
$zip->close();
unlink($src); //Deleting the Zipped file
} else {
var_dump($x);
}
}
public static function saveApp($details, $app)
{
if(!file_exists(storage_path('app/public/icons'))) {
mkdir(storage_path('app/public/icons'), 0777, true);
}
$img_src = app_path('SupportedApps/'.className($details->name).'/'.$details->icon);
$img_dest = storage_path('app/public/icons/'.$details->icon);
//die("i: ".$img_src);
@copy($img_src, $img_dest);
{
$app->appid = $details->appid;
$app->name = $details->name;
$app->sha = $details->sha ?? null;
$app->icon = 'icons/'.$details->icon;
$app->website = $details->website;
$app->license = $details->license;
$app->description = $details->description;
$appclass = $app->class();
$application = new $appclass;
$enhanced = (bool)($application instanceof \App\EnhancedApps);
$app->class = $appclass;
$app->enhanced = $enhanced;
$app->tile_background = $details->tile_background;
$app->save();
return $app;
}
}

View File

@@ -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",

79
composer.lock generated
View File

@@ -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,7 +8151,7 @@
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
"php": ">=7.1.3"
"php": ">=7.2.5"
},
"platform-dev": [],
"plugin-api-version": "2.2.0"

View File

@@ -14,7 +14,7 @@ return [
*/
'name' => env('APP_NAME', 'Heimdall'),
'version' => '2.3.0',
'version' => '2.5.0-beta1',
/*
|--------------------------------------------------------------------------
@@ -54,6 +54,8 @@ return [
*/
'url' => env('APP_URL', 'http://localhost'),
'appsource' => env('APP_SOURCE', 'https://appslist.heimdall.site/'),
/*
|--------------------------------------------------------------------------
@@ -228,6 +230,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,

View File

@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddAppidToItems extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('items', function (Blueprint $table) {
$table->string('appid')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('items', function (Blueprint $table) {
$table->dropColumn(['appid']);
});
}
}

View File

@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddClassToApplication extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('applications', function (Blueprint $table) {
$table->string('class')->nullable()->index();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('applications', function (Blueprint $table) {
$table->dropColumn(['class']);
});
}
}

View File

@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddAppDescriptionToItems extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('items', function (Blueprint $table) {
$table->text('appdescription')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('items', function (Blueprint $table) {
//
});
}
}

View File

@@ -237,6 +237,22 @@ class SettingsSeeder extends Seeder
$setting->save();
}
if(!$setting = Setting::find(12)) {
$setting = new Setting;
$setting->id = 12;
$setting->group_id = 1;
$setting->key = 'api_key';
$setting->type = 'apikey';
$setting->label = 'app.settings.apikey';
$setting->value = '';
$setting->save();
} else {
$setting->type = 'apikey';
$setting->group_id = 1;
$setting->label = 'app.settings.apikey';
$setting->save();
}
if(!$home_tag = \App\Item::find(0)) {
$home_tag = new \App\Item;
$home_tag->id = 0;

2068
public/css/app.css vendored

File diff suppressed because one or more lines are too long

749
public/js/app.js vendored

File diff suppressed because one or more lines are too long

View File

@@ -480,6 +480,7 @@ function define(prefix, icons) {
/* fas icons */
var icons = {
"arrow-alt-to-right": [448, 512, [], "f34c", "M448 88v336c0 13.3-10.7 24-24 24h-24c-13.3 0-24-10.7-24-24V88c0-13.3 10.7-24 24-24h24c13.3 0 24 10.7 24 24zM24 320h136v87.7c0 17.8 21.5 26.7 34.1 14.1l152.2-152.2c7.5-7.5 7.5-19.8 0-27.3L194.1 90.1c-12.6-12.6-34.1-3.7-34.1 14.1V192H24c-13.3 0-24 10.7-24 24v80c0 13.3 10.7 24 24 24z"],
"arrow-rotate-right": [512, 512, [8635, "arrow-right-rotate", "arrow-rotate-forward", "redo"], "f01e", "M496 48V192c0 17.69-14.31 32-32 32H320c-17.69 0-32-14.31-32-32s14.31-32 32-32h63.39c-29.97-39.7-77.25-63.78-127.6-63.78C167.7 96.22 96 167.9 96 256s71.69 159.8 159.8 159.8c34.88 0 68.03-11.03 95.88-31.94c14.22-10.53 34.22-7.75 44.81 6.375c10.59 14.16 7.75 34.22-6.375 44.81c-39.03 29.28-85.36 44.86-134.2 44.86C132.5 479.9 32 379.4 32 256s100.5-223.9 223.9-223.9c69.15 0 134 32.47 176.1 86.12V48c0-17.69 14.31-32 32-32S496 30.31 496 48z"],
"ban": [512, 512, [], "f05e", "M256 8C119.034 8 8 119.033 8 256s111.034 248 248 248 248-111.034 248-248S392.967 8 256 8zm130.108 117.892c65.448 65.448 70 165.481 20.677 235.637L150.47 105.216c70.204-49.356 170.226-44.735 235.638 20.676zM125.892 386.108c-65.448-65.448-70-165.481-20.677-235.637L361.53 406.784c-70.203 49.356-170.226 44.736-235.638-20.676z"],
"check": [512, 512, [], "f00c", "M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z"],
"cloud-download": [640, 512, [], "f0ed", "M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4zm-139.9 93L305 412.3c-9.4 9.4-24.6 9.4-33.9 0l-92.7-92.7c-9.4-9.4-9.4-24.6 0-33.9l10.8-10.8c9.6-9.6 25.2-9.3 34.5.5l32.4 34.5V184c0-13.3 10.7-24 24-24h16c13.3 0 24 10.7 24 24v125.9l32.4-34.5c9.3-9.9 24.9-10.1 34.5-.5l10.8 10.8c9.2 9.3 9.2 24.5-.1 33.9z"],

View File

@@ -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=ad45b1705b7f7906db0b",
"/js/app.js": "/js/app.js?id=5446aeb4aa754e641c77"
}

View File

@@ -55,6 +55,15 @@ There is also a multi-arch Docker which supports x86-64, armhf and arm64, instru
## Updating
To update your instance, simply clone this repository or download the zip/tar file with the new version and copy it over the old installation.
## Search Providers
v2.3.0 added the ability for users to customise the search options.
Options are stored in `/storage/app/searchproviders.yaml` (`/config/www/searchproviders.yaml` on docker installs), feel free to rearrange the options, add new ones, delete ones you don't use, etc.
Consider contributing to https://github.com/linuxserver/Heimdall/discussions/categories/search-providers to help others add new ones.
The item at the top of the list `Tiles` allows you to search for apps on your dashboard by name, helpful when you have lots of icons.
## New background image not being set
If you are using the docker image or a default php install you may find images over 2MB wont get set as the background image, you just need to change the `upload_max_filesize` in the php.ini.

View File

@@ -128,7 +128,49 @@ $.when( $.ready ).then(function() {
});
$('#sortable').sortable('disable');
$('#sortable').on('mouseenter', '.item', function () {
$(this).siblings('.tooltip').addClass('active')
$('.refresh', this).addClass('active')
}).on('mouseleave', '.item', function () {
$(this).siblings('.tooltip').removeClass('active')
$('.refresh', this).removeClass('active')
})
$('#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();
@@ -163,7 +205,7 @@ $.when( $.ready ).then(function() {
e.preventDefault();
var apiurl = $('#create input[name=url]').val();
var override_url = $('#create input[name="config[override_url]"]').val();
var override_url = $('#sapconfig input[name="config[override_url]"]').val();
if(override_url.length && override_url != '') {
apiurl = override_url;
}

View File

@@ -47,6 +47,66 @@ body {
}
}
}
#tile-preview {
align-items: center;
}
.create {
.textarea {
width: 100%;
margin: 0px 20px;
textarea{
width: 100%;
border: 1px solid #dedfe2;
padding: 15px;
border-radius: 6px;
height: 100px;
font-size: 14px;
}
label:not(.switch) {
width: 100%;
font-size: 13px;
color: lighten($app-text, 40%);
margin-bottom: 15px;
display: block;
font-weight: 300;
}
}
}
.appoptions {
display: flex;
flex-direction: column;
padding: 20px;
gap: 5px;
.optdetails {
display: flex;
.input {
margin: 0 20px;
width: 200px;
}
}
.optvalue {
display: flex;
align-items: center;
opacity: 0;
width: 0;
height: 0;
overflow: hidden;
&.active {
opacity: 1;
width: auto;
height: auto;
overflow: visible;
}
}
button.dark {
background: #1b1b1b;
border: none;
padding: 12px 15px;
border-radius: 4px;
color: white;
min-width: 240px;
}
}
#app {
display: flex;
min-height: 100vh;
@@ -200,6 +260,59 @@ body {
text-align: center;
line-height: 30px;
display: none;
z-index: 1;
}
.tooltip {
padding: 25px;
border-radius: 5px;
background: #000000c8;
color: white;
position: absolute;
bottom: 120px;
left: 0;
right: 0;
font-size: 13px;
backdrop-filter: blur(8px);
z-index: 0;
opacity: 0;
transform: translateY(-20px);
transition: all 0.3s;
&.active {
transform: translateY(0);
opacity: 1;
z-index: 4;
}
}
}
.tile-actions {
position: absolute;
top: 0px;
left: 0;
padding: 7px;
background: #000000d9;
font-size: 12px;
line-height: 1;
border-radius: 6px;
width: 80px;
height: 90px;
display: flex;
opacity: 0;
align-items: center;
justify-content: center;
transition: all 0.3s;
flex-direction: column;
text-align: center;
cursor: pointer;
&.active {
opacity: 1;
}
}
.refresh {
z-index: 3;
.icon {
font-size: 20px;
margin-bottom: 5px;
}
}
.black {
@@ -511,6 +624,15 @@ body {
}
}
}
.input {
position: relative;
.help {
position: absolute;
bottom: -22px;
left: 10px;
color: #c00;
}
}
div.create {
padding: 30px 15px;
display: flex;
@@ -534,10 +656,19 @@ div.create {
}
}
}
.app-icon-container {
width: 60px;
height: 60px;
display: flex;
justify-content: center;
align-items: center;
margin-right: 15px;
flex: 0 0 60px;
}
.app-icon {
max-width: 60px;
margin-right: 15px;
display: block;
max-height: 60px;
}
.sidenav {
@@ -576,6 +707,41 @@ div.create {
color: #91a1b3;
margin-left: 20px;
}
#websiteiconoptions {
display: flex;
flex-direction: column;
padding: 20px;
.results {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
}
.header {
display: flex;
justify-content: space-between;
align-items: center;
gap: 10px;
padding: 10px 0;
}
.selectclose {
cursor: pointer;
}
}
.iconbutton {
width: 160px;
height: 160px;
display: flex;
align-items: center;
justify-content: center;
border: 1px solid #ccc;
border-radius: 4px;
cursor: pointer;
}
.selecticon {
max-width: 120px;
height: auto;
}
.switch {
position: relative;
@@ -694,6 +860,8 @@ div.create {
position: relative;
width: 100%;
max-width: 620px;
position: relative;
z-index: 4;
form {
width: 100%;
}
@@ -784,7 +952,7 @@ div.create {
#appimage {
img {
max-width: 95px;
width: 95px;
}
}

View File

@@ -39,6 +39,9 @@ return [
'settings.custom_css' => 'Custom CSS',
'settings.custom_js' => 'Custom JavaScript',
'settings.apikey' => 'API Key',
'settings.click_generate' => 'Clicking the save button will generate a new API key.',
'options.none' => '- not set -',
'options.google' => 'Google',
'options.ddg' => 'DuckDuckGo',
@@ -83,7 +86,11 @@ return [
'apps.override' => 'If different to main url',
'apps.preview' => 'Preview',
'apps.apptype' => 'Application Type',
'apps.website' => 'Website',
'apps.description' => 'Description',
'apps.only_admin_account' => 'Only if you have admin-account!',
'apps.autologin_url' => 'Auto login url',
'apps.show_deleted' => 'Showing Deleted Applications',
'dashboard' => 'Home dashboard',

View File

@@ -6,6 +6,7 @@ return array (
'settings.miscellaneous' => 'Divers',
'settings.support' => 'Support',
'settings.donate' => 'Contribuer',
'settings.advanced' => 'Options avancées',
'settings.version' => 'Version',
'settings.background_image' => 'Image d\'arrière-plan',
@@ -71,6 +72,8 @@ return array (
'apps.preview' => 'Aperçu',
'apps.apptype' => 'Type d\'application ',
'apps.only_admin_account' => 'Seulement si vous avez un compte administrateur!',
'apps.autologin_url' => 'URL de connexion automatique',
'apps.show_deleted' => 'Afficher les applications supprimées',
'dashboard' => 'Tableau de bord',

View File

@@ -1,18 +1,30 @@
<section class="item-container{{ $app->droppable }}" data-id="{{ $app->id }}">
<section class="item-container{{ $app->droppable }}" data-name="{{ $app->title }}" data-id="{{ $app->id }}">
<div class="item" style="background-color: {{ $app->colour }}">
@if($app->icon)
<img class="app-icon" src="{{ asset('/storage/'.str_replace('supportedapps', 'icons', $app->icon)) }}" />
@else
<img class="app-icon" src="{{ asset('/img/heimdall-icon-small.png') }}" />
@endif
<div class="app-icon-container">
@if($app->icon)
<img class="app-icon" src="{{ asset('/storage/'.str_replace('supportedapps', 'icons', $app->icon)) }}" />
@else
<img class="app-icon" src="{{ asset('/img/heimdall-icon-small.png') }}" />
@endif
</div>
<div class="details">
<div class="title{{ title_color($app->colour) }}">{{ $app->title }}</div>
@if($app->enabled())
<div data-id="{{ $app->id }}" data-dataonly="{{ $app->getconfig()->dataonly ?? '0' }}" class="livestats-container{{ title_color($app->colour) }}"></div>
@endif
</div>
<a rel="noopener noreferrer" title="{{ App\Item::getApplicationDescription($app->class) }}" class="link{{ title_color($app->colour) }}"{!! $app->link_target !!} href="{{ $app->link }}"><i class="fas {{ $app->link_icon }}"></i></a>
<a rel="noopener noreferrer" class="link{{ title_color($app->colour) }}"{!! $app->link_target !!} href="{{ $app->link }}"><i class="fas {{ $app->link_icon }}"></i></a>
<?php /*
@if($app->enhanced() === true && (bool)$app->getConfig()->enabled === true)
<div class="tile-actions refresh">
<div class="icon">
<i class="fas fa-arrow-rotate-right"></i>
</div>
Refresh Stats
</div>
@endif
*/ ?>
</div>
<a class="item-edit" href="{{ route($app->link_type.'.edit', [ $app->id ]) }}"><i class="fas fa-pencil"></i></a>
@if((string)$app->appdescription !== '')<div class="tooltip">{{ $app->appdescription }}</div>@endif
</section>

View File

@@ -1,6 +1,6 @@
<section class="module-container">
<header>
<div class="section-title">{{ __('app.apps.add_application') }}</div>
<div class="section-title">{{ __('app.apps.preview') }}</div>
<div class="module-actions">
<div class="toggleinput">
<label class="name">{{ __('app.apps.pinned') }}</label>
@@ -19,25 +19,56 @@
<a href="{{ route('items.index', []) }}" class="button"><i class="fa fa-ban"></i><span>{{ __('app.buttons.cancel') }}</span></a>
</div>
</header>
<div id="create" class="create">
<div id="tile-preview" class="create">
<div class="">
@include('items.preview')
</div>
<div class="appoptions">
<div class="optdetails">
<div><button class="dark">{{ __('app.apps.apptype') }}</button></div>
<div class="optvalue">
<div class="input">
{!! Form::select('appid', App\Application::applist(), null, array('class' => 'form-control config-item', 'id' => 'apptype', 'data-config' => 'type')) !!}
</div>
</div>
</div>
<div id="searchwebsite" class="optdetails">
<div><button class="dark">{{ __('app.apps.website') }}</button></div>
<div class="optvalue">
<div class="input">
{!! Form::text('website', $item->url ?? null, array('placeholder' => __('app.apps.website'), 'id' => 'website', 'class' => 'form-control')) !!}
<small class="help">Don't forget http(s)://</small>
</div>
<div><button class="btn">Go</button></div>
</div>
</div>
</div>
<div id="websiteiconoptions"></div>
</div>
<header style="border-top: 1px solid #dbdce3;">
<div class="section-title">{{ __('app.apps.add_application') }}</div>
</header>
<div id="create" class="create">
{!! csrf_field() !!}
<div class="input">
<label>{{ __('app.apps.application_name') }} *</label>
{!! Form::text('title', null, array('placeholder' => __('app.apps.title'), 'id' => 'appname', 'class' => 'form-control')) !!}
</div>
<div class="input">
<label>{{ __('app.apps.apptype') }} *</label>
{!! Form::select('class', App\Application::applist(), null, array('class' => 'form-control config-item', 'id' => 'apptype', 'data-config' => 'type')) !!}
</div>
<div class="input">
<label>{{ __('app.apps.colour') }} *</label>
{!! Form::text('colour', null, array('placeholder' => __('app.apps.hex'), 'id' => 'appcolour', 'class' => 'form-control color-picker set-bg-elem')) !!}
{!! Form::text('colour', $item->colour ?? '#161b1f', array('placeholder' => __('app.apps.hex'), 'id' => 'appcolour', 'class' => 'form-control color-picker set-bg-elem')) !!}
</div>
<div class="input">
<label>{{ strtoupper(__('app.url')) }}</label>
{!! Form::text('url', null, array('placeholder' => __('app.url'), 'id' => 'appurl', 'class' => 'form-control')) !!}
{!! Form::text('url', $item->url ?? null, array('placeholder' => __('app.url'), 'id' => 'appurl', 'class' => 'form-control')) !!}
<small class="help">Don't forget http(s)://</small>
</div>
<div class="input">
@@ -65,16 +96,14 @@
</div>
</div>
</div>
</div>
<div class="newblock" style="display: block;">
<h2>Preview</h2>
</div>
<div id="tile-preview" class="input">
@include('items.preview')
<header style="border-top: 1px solid #dbdce3; width: 100%;">
<div class="section-title">{{ __('app.apps.description') }}</div>
</header>
<div class="create">
<div class="textarea">
<textarea name="appdescription" id="appdescription">{{ $item->appdescription ?? '' }}</textarea>
</div>
@@ -84,7 +113,7 @@
<div id="sapconfig" style="display: block;">
@if(isset($item))
@include('SupportedApps::'.$item->getconfig()->name.'.config')
@include('SupportedApps::'.App\Item::nameFromClass($item->class).'.config')
@endif
</div>

View File

@@ -3,11 +3,13 @@
?>
<section class="item-container" data-id="">
<div class="item set-bg-elem" style="background-color: {{ $item->colour ?? '#222' }}">
@if(isset($item->icon) && !empty($item->icon))
<img class="app-icon" src="{{ asset('/storage/'.$item->icon) }}" />
@else
<img class="app-icon" src="{{ asset('/img/heimdall-icon-small.png') }}" />
@endif
<div class="app-icon-container">
@if(isset($item->icon) && !empty($item->icon))
<img class="app-icon" src="{{ asset('/storage/'.$item->icon) }}" />
@else
<img class="app-icon" src="{{ asset('/img/heimdall-icon-small.png') }}" />
@endif
</div>
<div class="details">
<div class="title{{ title_color($item->colour) ?? 'white' }}">{{ $item->title ?? '' }}</div>
@if($item->enhanced())

View File

@@ -19,13 +19,15 @@
});
})
var availableTags = @json(App\Application::all()->pluck('name'));
var availableTags = @json(App\Application::autocomplete());
console.log(availableTags)
$( "#appname" ).autocomplete({
source: availableTags,
select: function( event, ui ) {
var appvalue = ui.item.value;
appload(appvalue);
event.preventDefault();
// appload(ui.item.value);
$( "#appname" ).val(ui.item.label)
$('#apptype').val(ui.item.value).change()
}
});
// initial load
@@ -38,30 +40,147 @@
$('#tile-preview .title').html($(this).val());
})
$('#apptype').on('change', function(e) {
appload($(this).find('option:selected').text());
appload($(this).find('option:selected').val());
});
$('#appcolour').on('change', function(e) {
$('#tile-preview .item').css('backgroundColor', $(this).val());
})
$('#websiteiconoptions').on('click', '.iconbutton', function (e) {
const src = $('.selecticon', this).attr('src')
$('#appimage').html("<img src='"+src+"' /><input type='hidden' name='icon' value='"+src+"' />");
$('#tile-preview .app-icon').attr('src', src);
}).on('click', '.selectclose', function () {
$('#websiteiconoptions').html('')
})
$('.tags').select2();
if($('#appurl').val() !== '') {
if ($('#appurl').val().indexOf("://") !== -1) {
$('#appurl').parent().find('.help').hide()
}
}
if($('#website').val() !== '') {
if ($('#website').val().indexOf("://") !== -1) {
$('#website').parent().find('.help').hide()
}
}
$('#appurl, #website').on('input', function () {
if ($(this).val().indexOf("://") !== -1) {
$(this).parent().find('.help').hide()
}
})
$('#searchwebsite').on('click', 'button.btn', function (e) {
e.preventDefault()
let websiteurl = $('#searchwebsite input').val()
website = btoa(websiteurl)
$.get(base + 'items/websitelookup/' + website, function (data) {
const url = new URL(websiteurl)
const websitedata = {}
const parser = new DOMParser()
const document = parser.parseFromString(data, 'text/html')
const links = document.getElementsByTagName('link')
websitedata.title = document.getElementsByTagName('title')[0].innerText
const metas = document.getElementsByTagName('meta')
const icons = []
for (let i = 0; i < metas.length; i++) {
if (metas[i].getAttribute('name') === 'description') {
websitedata.description = metas[i].getAttribute('content')
}
}
for (let i = 0; i < links.length; i++) {
const link = links[i]
const rel = link.getAttribute('rel')
if (rel) {
if (rel.toLowerCase().indexOf('icon') > -1) {
const href = link.getAttribute('href')
// Make sure href is not null / undefined
if (href) {
if (href.toLowerCase().indexOf('https:') === -1 && href.toLowerCase().indexOf('http:') === -1 && href.indexOf('//') !== 0) {
let finalBase = ''
if (websiteurl.endsWith('/')) {
const baseurl = websiteurl.split('/')
baseurl.pop()
finalBase = baseurl.join('/')
} else {
finalBase = websiteurl
}
let absoluteHref = finalBase
if (href.indexOf('/') === 0) {
absoluteHref += href
} else {
const path = url.pathname.split('/')
path.pop()
const finalPath = path.join('/')
absoluteHref += finalPath + '/' + href
}
icons.push(encodeURI(absoluteHref))
} else if (href.indexOf('//') === 0) {
// Absolute url with no protocol
const absoluteUrl = url.protocol + href
icons.push(encodeURI(absoluteUrl))
} else {
// Absolute
icons.push(encodeURI(href))
}
}
}
}
}
websitedata.icons = icons
if ($('#appname').val() === '') $('#appname').val(websitedata.title)
if ($('#appurl').val() === '') $('#appurl').val(websiteurl)
$('input[name=pinned]').prop('checked', true);
// $('#appimage').html("<img src='"+websitedata.icons[0]+"' /><input type='hidden' name='icon' value='"+websitedata.icons[0]+"' />");
$('#tile-preview .app-icon').attr('src', $('#appimage img').attr('src'));
$('#tile-preview .title').text($('#appname').val());
$('#websiteiconoptions').html('<div class="header"><span>Select Icon</span><span class="selectclose">Close</span></div><div class="results"></div>')
icons.forEach(icon => {
$('#websiteiconoptions .results').append('<div class="iconbutton"><img class="selecticon" src="' + icon + '" /></div>')
})
console.log(websitedata)
})
console.log(website)
})
$('.optdetails button.dark').on('click', function (e) {
e.preventDefault()
$(this).parent().next().toggleClass('active')
})
function appload(appvalue) {
if(appvalue == 'None') {
if(appvalue == 'null') {
$('#sapconfig').html('').hide();
$('#tile-preview .app-icon').attr('src', '/img/heimdall-icon-small.png');
$('#appimage').html("<img src='/img/heimdall-icon-small.png' />");
$('#sapconfig').html('').hide();
} else {
$.post('{{ route('appload') }}', { app: appvalue }, function(data) {
// Main details
$('#appimage').html("<img src='"+data.iconview+"' /><input type='hidden' name='icon' value='"+data.icon+"' />");
$('#appimage').html("<img src='"+data.iconview+"' /><input type='hidden' name='icon' value='"+data.iconview+"' />");
$('input[name=colour]').val(data.colour);
$('select[name=class]').val(data.class);
$('select[name=appid]').val(data.appid);
hueb.setColor( data.colour );
$('input[name=pinned]').prop('checked', true);
// Preview details
$('#tile-preview .app-icon').attr('src', data.iconview);
$('#tile-preview .title').html(data.name);
if(data.config != null) {
$.get(base+'view/'+data.config, function(getdata) {
$('#appdescription').val(data.description);
if($('#appname').val() === '') {
$('#appname').val(data.name)
}
$('#tile-preview .title').html($('#appname').val());
if(data.custom != null) {
$.get(base+'view/'+data.custom, function(getdata) {
$('#sapconfig').html(getdata).show();
});
} else {

View File

@@ -4,7 +4,7 @@
<section class="module-container">
<header>
<div class="section-title">
Showing Deleted Applications
{{ __('app.apps.show_deleted') }}
</div>
<div class="module-actions">
<a href="{{ route('items.index', []) }}" title="" class="button"><i class="fa fa-ban"></i><span>{{ __('app.buttons.cancel') }}</span></a>

View File

@@ -48,6 +48,7 @@
@foreach($all_apps as $app)
<?php
$active = ((bool)$app->pinned === true) ? 'active' : '';
if($app->title == 'app.dashboard') continue;
?>
<li>{{ $app->title }}<a class="{{ $active }}" data-tag="{{ $tag ?? 0 }}" data-id="{{ $app->id }}" href="{{ route('items.pintoggle', [$app->id]) }}"><i class="fas fa-thumbtack"></i></a></li>

View File

@@ -13,7 +13,7 @@
{!! Form::select('supported', \App\Item::supportedOptions(), array('placeholder' => 'Title','class' => 'form-control')) !!}
</div>*/ ?>
<div class="input">
<div class="input" style="width: 100%">
{!! $setting->edit_value !!}
</div>

View File

@@ -30,7 +30,7 @@
@foreach($apps as $app)
<tr>
<td>{{ $app->title }}</td>
<td><a{{ $app->target }} href="{{ env('APP_URL') }}/tag/{{ $app->url }}">{{ $app->link }}</a></td>
<td><a{{ $app->target }} href="{{ url('tag/'.$app->link) }}">{{ $app->link }}</a></td>
<td class="text-center"><a href="{!! route('tags.edit', [$app->id]) !!}" title="{{ __('app.settings.edit') }} {!! $app->title !!}"><i class="fas fa-edit"></i></a></td>
<td class="text-center">
{!! Form::open(['method' => 'DELETE','route' => ['tags.destroy', $app->id],'style'=>'display:inline']) !!}

View File

@@ -13,3 +13,4 @@ use Illuminate\Http\Request;
|
*/
Route::resource('items', 'ApiItemController');

View File

@@ -23,6 +23,9 @@ Route::get('/autologin/{uuid}', 'Auth\LoginController@autologin')->name('user.au
Route::get('/', 'ItemController@dash')->name('dash');
Route::get('check_app_list', 'ItemController@checkAppList')->name('applist');
Route::get('single/{appid}', function($appid) {
return json_encode(\App\Application::single($appid));
})->name('single');
Route::resources([
'items' => 'ItemController',
@@ -35,7 +38,7 @@ Route::get('tag/{slug}', 'TagController@show')->name('tags.show');
Route::get('tag/add/{tag}/{item}', 'TagController@add')->name('tags.add');
Route::get('tag/restore/{id}', 'TagController@restore')->name('tags.restore');
Route::get('items/websitelookup/{url}', 'ItemController@websitelookup')->name('items.lookup');
Route::get('items/pin/{id}', 'ItemController@pin')->name('items.pin');
Route::get('items/restore/{id}', 'ItemController@restore')->name('items.restore');
Route::get('items/unpin/{id}', 'ItemController@unpin')->name('items.unpin');

View File

@@ -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

File diff suppressed because one or more lines are too long

1
vendor/bin/yaml-lint vendored Symbolic link
View File

@@ -0,0 +1 @@
../symfony/yaml/Resources/bin/yaml-lint

View File

@@ -149,7 +149,7 @@ class ClassLoader
/**
* @return string[] Array of classname => path
* @psalm-return array<string, string>
* @psalm-var array<string, string>
*/
public function getClassMap()
{

View File

@@ -43,6 +43,328 @@ 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\\CUPS\\CUPS' => $baseDir . '/app/SupportedApps/CUPS/CUPS.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\\Munin\\Munin' => $baseDir . '/app/SupportedApps/Munin/Munin.php',
'App\\SupportedApps\\MusicBrainz\\MusicBrainz' => $baseDir . '/app/SupportedApps/MusicBrainz/MusicBrainz.php',
'App\\SupportedApps\\Mylar\\Mylar' => $baseDir . '/app/SupportedApps/Mylar/Mylar.php',
'App\\SupportedApps\\NAS\\NAS' => $baseDir . '/app/SupportedApps/NAS/NAS.php',
'App\\SupportedApps\\NZBHydra\\NZBHydra' => $baseDir . '/app/SupportedApps/NZBHydra/NZBHydra.php',
'App\\SupportedApps\\Nagios\\Nagios' => $baseDir . '/app/SupportedApps/Nagios/Nagios.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\\OmadaSDNController\\OmadaSDNController' => $baseDir . '/app/SupportedApps/OmadaSDNController/OmadaSDNController.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\\Scrutiny\\Scrutiny' => $baseDir . '/app/SupportedApps/Scrutiny/Scrutiny.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\\SupermicroIPMI\\SupermicroIPMI' => $baseDir . '/app/SupportedApps/SupermicroIPMI/SupermicroIPMI.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\\TechnitiumDNS\\TechnitiumDNS' => $baseDir . '/app/SupportedApps/TechnitiumDNS/TechnitiumDNS.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\\UptimeKuma\\UptimeKuma' => $baseDir . '/app/SupportedApps/UptimeKuma/UptimeKuma.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\\WLED\\WLED' => $baseDir . '/app/SupportedApps/WLED/WLED.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\\Whoogle\\Whoogle' => $baseDir . '/app/SupportedApps/Whoogle/Whoogle.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\\Yacht\\Yacht' => $baseDir . '/app/SupportedApps/Yacht/Yacht.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\\ntopng\\ntopng' => $baseDir . '/app/SupportedApps/ntopng/ntopng.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 +4940,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',

View File

@@ -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',

View File

@@ -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'),

View File

@@ -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;
}
}

View File

@@ -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,328 @@ 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\\CUPS\\CUPS' => __DIR__ . '/../..' . '/app/SupportedApps/CUPS/CUPS.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\\Munin\\Munin' => __DIR__ . '/../..' . '/app/SupportedApps/Munin/Munin.php',
'App\\SupportedApps\\MusicBrainz\\MusicBrainz' => __DIR__ . '/../..' . '/app/SupportedApps/MusicBrainz/MusicBrainz.php',
'App\\SupportedApps\\Mylar\\Mylar' => __DIR__ . '/../..' . '/app/SupportedApps/Mylar/Mylar.php',
'App\\SupportedApps\\NAS\\NAS' => __DIR__ . '/../..' . '/app/SupportedApps/NAS/NAS.php',
'App\\SupportedApps\\NZBHydra\\NZBHydra' => __DIR__ . '/../..' . '/app/SupportedApps/NZBHydra/NZBHydra.php',
'App\\SupportedApps\\Nagios\\Nagios' => __DIR__ . '/../..' . '/app/SupportedApps/Nagios/Nagios.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\\OmadaSDNController\\OmadaSDNController' => __DIR__ . '/../..' . '/app/SupportedApps/OmadaSDNController/OmadaSDNController.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\\Scrutiny\\Scrutiny' => __DIR__ . '/../..' . '/app/SupportedApps/Scrutiny/Scrutiny.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\\SupermicroIPMI\\SupermicroIPMI' => __DIR__ . '/../..' . '/app/SupportedApps/SupermicroIPMI/SupermicroIPMI.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\\TechnitiumDNS\\TechnitiumDNS' => __DIR__ . '/../..' . '/app/SupportedApps/TechnitiumDNS/TechnitiumDNS.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\\UptimeKuma\\UptimeKuma' => __DIR__ . '/../..' . '/app/SupportedApps/UptimeKuma/UptimeKuma.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\\WLED\\WLED' => __DIR__ . '/../..' . '/app/SupportedApps/WLED/WLED.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\\Whoogle\\Whoogle' => __DIR__ . '/../..' . '/app/SupportedApps/Whoogle/Whoogle.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\\Yacht\\Yacht' => __DIR__ . '/../..' . '/app/SupportedApps/Yacht/Yacht.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\\ntopng\\ntopng' => __DIR__ . '/../..' . '/app/SupportedApps/ntopng/ntopng.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 +5489,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',

View File

@@ -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",

View File

@@ -1,11 +1,11 @@
<?php return array(
'root' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'pretty_version' => '2.3.x-dev',
'version' => '2.3.9999999.9999999-dev',
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
'reference' => 'f9a19fce91446a34aa433bb1426491fbb2005611',
'reference' => 'ed3dbf2f1420e720c7bdcf0c8b36830bf6368c6d',
'name' => 'laravel/laravel',
'dev' => true,
),
@@ -374,12 +374,12 @@
'dev_requirement' => false,
),
'laravel/laravel' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'pretty_version' => '2.3.x-dev',
'version' => '2.3.9999999.9999999-dev',
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
'reference' => 'f9a19fce91446a34aa433bb1426491fbb2005611',
'reference' => 'ed3dbf2f1420e720c7bdcf0c8b36830bf6368c6d',
'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',

237
vendor/symfony/yaml/CHANGELOG.md vendored Normal file
View File

@@ -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 = <<<YAML
null: null key
true: boolean true
2.0: float key
YAML;
Yaml::parse($yaml);
```
After:
```php
$yaml = <<<YAML
"null": null key
"true": boolean true
"2.0": float key
YAML;
Yaml::parse($yaml);
```
* Omitted mapping values will be parsed as `null`.
* Omitting the key of a mapping is deprecated and will throw a `ParseException` in Symfony 4.0.
* Added support for dumping empty PHP arrays as YAML sequences:
```php
Yaml::dump([], 0, 0, Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE);
```
3.2.0
-----
* Mappings with a colon (`:`) that is not followed by a whitespace are deprecated
when the mapping key is not quoted and will lead to a `ParseException` in
Symfony 4.0 (e.g. `foo:bar` must be `foo: bar`).
* Added support for parsing PHP constants:
```php
Yaml::parse('!php/const:PHP_INT_MAX', Yaml::PARSE_CONSTANT);
```
* Support for silently ignoring duplicate mapping keys in YAML has been
deprecated and will lead to a `ParseException` in Symfony 4.0.
3.1.0
-----
* Added support to dump `stdClass` and `ArrayAccess` objects as YAML mappings
through the `Yaml::DUMP_OBJECT_AS_MAP` flag.
* Strings that are not UTF-8 encoded will be dumped as base64 encoded binary
data.
* Added support for dumping multi line strings as literal blocks.
* Added support for parsing base64 encoded binary data when they are tagged
with the `!!binary` tag.
* Added support for parsing timestamps as `\DateTime` objects:
```php
Yaml::parse('2001-12-15 21:59:43.10 -5', Yaml::PARSE_DATETIME);
```
* `\DateTime` and `\DateTimeImmutable` objects are dumped as YAML timestamps.
* Deprecated usage of `%` at the beginning of an unquoted string.
* Added support for customizing the YAML parser behavior through an optional bit field:
```php
Yaml::parse('{ "foo": "bar", "fiz": "cat" }', Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE | Yaml::PARSE_OBJECT | Yaml::PARSE_OBJECT_FOR_MAP);
```
* Added support for customizing the dumped YAML string through an optional bit field:
```php
Yaml::dump(['foo' => 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)

View File

@@ -0,0 +1,289 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* 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 <lyrixx@lyrixx.info>
* @author Robin Chalas <robin.chalas@gmail.com>
*/
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(<<<EOF
The <info>%command.name%</info> command lints a YAML file and outputs to STDOUT
the first encountered syntax error.
You can validates YAML contents passed from STDIN:
<info>cat filename | php %command.full_name% -</info>
You can also validate the syntax of a file:
<info>php %command.full_name% filename</info>
Or of a whole directory:
<info>php %command.full_name% dirname</info>
<info>php %command.full_name% dirname --format=json</info>
You can also exclude one or more specific files:
<info>php %command.full_name% dirname --exclude="dirname/foo.yaml" --exclude="dirname/bar.yaml"</info>
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('<info>OK</info>'.($info['file'] ? sprintf(' in %s', $info['file']) : ''));
} elseif (!$info['valid']) {
++$erroredFiles;
$io->text('<error> ERROR </error>'.($info['file'] ? sprintf(' in %s', $info['file']) : ''));
$io->text(sprintf('<error> >> %s</error>', $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']);
}
}
}

140
vendor/symfony/yaml/Dumper.php vendored Normal file
View File

@@ -0,0 +1,140 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* 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 <fabien@symfony.com>
*
* @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;
}
}

95
vendor/symfony/yaml/Escaper.php vendored Normal file
View File

@@ -0,0 +1,95 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* 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 <matthew@lewinski.org>
*
* @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));
}
}

View File

@@ -0,0 +1,21 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* 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 <fabien@symfony.com>
*/
class DumpException extends RuntimeException
{
}

View File

@@ -0,0 +1,21 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* 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 <fabien@symfony.com>
*/
interface ExceptionInterface extends \Throwable
{
}

View File

@@ -0,0 +1,132 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* 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 <fabien@symfony.com>
*/
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 .= '.';
}
}
}

View File

@@ -0,0 +1,21 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* 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 <imprec@gmail.com>
*/
class RuntimeException extends \RuntimeException implements ExceptionInterface
{
}

812
vendor/symfony/yaml/Inline.php vendored Normal file
View File

@@ -0,0 +1,812 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* 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 <fabien@symfony.com>
*
* @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<value>[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 <<<EOF
~^
(?P<year>[0-9][0-9][0-9][0-9])
-(?P<month>[0-9][0-9]?)
-(?P<day>[0-9][0-9]?)
(?:(?:[Tt]|[ \t]+)
(?P<hour>[0-9][0-9]?)
:(?P<minute>[0-9][0-9])
:(?P<second>[0-9][0-9])
(?:\.(?P<fraction>[0-9]*))?
(?:[ \t]*(?P<tz>Z|(?P<tz_sign>[-+])(?P<tz_hour>[0-9][0-9]?)
(?::(?P<tz_minute>[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';
}
}

19
vendor/symfony/yaml/LICENSE vendored Normal file
View File

@@ -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.

1305
vendor/symfony/yaml/Parser.php vendored Normal file

File diff suppressed because it is too large Load Diff

13
vendor/symfony/yaml/README.md vendored Normal file
View File

@@ -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)

45
vendor/symfony/yaml/Resources/bin/yaml-lint vendored Executable file
View File

@@ -0,0 +1,45 @@
#!/usr/bin/env php
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* 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 <jan.schaedlich@sensiolabs.de>
*/
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()
;

38
vendor/symfony/yaml/Tag/TaggedValue.php vendored Normal file
View File

@@ -0,0 +1,38 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* 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 <p@tchwork.com>
* @author Guilhem N. <egetick@gmail.com>
*/
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;
}
}

132
vendor/symfony/yaml/Unescaper.php vendored Normal file
View File

@@ -0,0 +1,132 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* 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 <matthew@lewinski.org>
*
* @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);
}
}

100
vendor/symfony/yaml/Yaml.php vendored Normal file
View File

@@ -0,0 +1,100 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* 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 <fabien@symfony.com>
*
* @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:
* <code>
* $array = Yaml::parse(file_get_contents('config.yml'));
* print_r($array);
* </code>
*
* @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);
}
}

42
vendor/symfony/yaml/composer.json vendored Normal file
View File

@@ -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"
}