delay();
$action = (string) filter_input(\INPUT_GET, 'action', \FILTER_DEFAULT);
if ( ! $action) {
return;
}
// for php54
foreach ([
'Poll\\PollAction',
'Script\\ScriptAction',
'Style\\StyleAction',
'Ping\\PingAction',
'ServerInfo\\ServerInfoPublicIpv4Action',
'ServerInfo\\ServerInfoPublicIpv6Action',
'PhpInfo\\PhpInfoLatestPhpVersionAction',
'PhpInfoDetail\\PhpInfoDetailAction',
'Updater\\UpdaterActionVersion',
'Updater\\UpdaterActionUpdate',
'ServerBenchmark\\ServerBenchmarkPerformanceAction',
'ServerBenchmark\\ServerBenchmarkServersAction',
'Location\\LocationIpv4Action',
'Nodes\\NodesAction',
'BrowserBenchmark\\BrowserBenchmarkBrowsersAction',
] as $fn) {
$class = "\\InnStudio\\Prober\\Components\\{$fn}";
(new $class())->render($action);
}
(new RestResponse())
->setStatus(StatusCode::BAD_REQUEST)
->end();
}
}
namespace InnStudio\Prober\Components\PhpInfo;
class PhpInfoConstants
{
const ID = 'phpInfo';
}
namespace InnStudio\Prober\Components\PhpInfo;
use InnStudio\Prober\Components\Config\ConfigApi;
use InnStudio\Prober\Components\Rest\RestResponse;
use InnStudio\Prober\Components\Rest\StatusCode;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
final class PhpInfoLatestPhpVersionAction
{
public function render($action)
{
$id = PhpInfoConstants::ID;
if ('latestPhpVersion' !== $action) {
return;
}
$response = new RestResponse();
if (UserConfigApi::isDisabled($id)) {
$response
->setStatus(StatusCode::FORBIDDEN)
->end();
}
$content = file_get_contents('https://www.php.net/releases/?json');
if ( ! $content) {
$response
->setStatus(StatusCode::NO_CONTENT)
->end();
}
$versions = json_decode($content, true);
if ( ! $versions) {
$response
->setStatus(StatusCode::NO_CONTENT)
->end();
}
$version = isset($versions[ConfigApi::$config['LATEST_PHP_STABLE_VERSION']]['version']) ? $versions[ConfigApi::$config['LATEST_PHP_STABLE_VERSION']]['version'] : '';
if ( ! $version) {
$response
->setStatus(StatusCode::NO_CONTENT)
->end();
}
$response
->setData([
'version' => $version,
'date' => $versions[ConfigApi::$config['LATEST_PHP_STABLE_VERSION']]['date'],
])
->end();
}
}
namespace InnStudio\Prober\Components\PhpInfo;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
final class PhpInfoPoll
{
public function render()
{
$id = PhpInfoConstants::ID;
if (UserConfigApi::isDisabled($id)) {
return [
$id => null,
];
}
return [
$id => [
'phpVersion' => \PHP_VERSION,
'sapi' => \PHP_SAPI,
'displayErrors' => (bool) \ini_get('display_errors'),
'errorReporting' => (int) \ini_get('error_reporting'),
'memoryLimit' => (string) \ini_get('memory_limit'),
'postMaxSize' => (string) \ini_get('post_max_size'),
'uploadMaxFilesize' => (string) \ini_get('upload_max_filesize'),
'maxInputVars' => (int) \ini_get('max_input_vars'),
'maxExecutionTime' => (int) \ini_get('max_execution_time'),
'defaultSocketTimeout' => (int) \ini_get('default_socket_timeout'),
'allowUrlFopen' => (bool) \ini_get('allow_url_fopen'),
'smtp' => (bool) \ini_get('SMTP'),
'disableFunctions' => UserConfigApi::isDisabled('phpDisabledFunctions') ? [] : array_filter(explode(',', (string) \ini_get('disable_functions'))),
'disableClasses' => UserConfigApi::isDisabled('phpDisabledClasses') ? [] : array_filter(explode(',', (string) \ini_get('disable_classes'))),
],
];
}
}
namespace InnStudio\Prober\Components\Events;
final class EventsApi
{
private static $events = [];
private static $PRIORITY_ID = 'priority';
private static $CALLBACK_ID = 'callback';
public static function on($name, $callback, $priority = 10)
{
if ( ! isset(self::$events[$name])) {
self::$events[$name] = [];
}
self::$events[$name][] = [
self::$PRIORITY_ID => $priority,
self::$CALLBACK_ID => $callback,
];
}
public static function emit()
{
$args = \func_get_args();
$name = $args[0];
$return = isset($args[1]) ? $args[1] : null;
unset($args[0], $args[1]);
$events = isset(self::$events[$name]) ? self::$events[$name] : false;
if ( ! $events) {
return $return;
}
$sortArr = [];
foreach ($events as $k => $filter) {
$sortArr[$k] = $filter[self::$PRIORITY_ID];
}
array_multisort($sortArr, $events);
foreach ($events as $filter) {
$return = \call_user_func_array($filter[self::$CALLBACK_ID], [$return, $args]);
}
return $return;
}
}
namespace InnStudio\Prober\Components\PhpInfoDetail;
use InnStudio\Prober\Components\Rest\RestResponse;
use InnStudio\Prober\Components\Rest\StatusCode;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
final class PhpInfoDetailAction
{
public function render($action)
{
$id = PhpInfoDetailConstants::ID;
if ($action !== $id) {
return;
}
if (UserConfigApi::isDisabled($id)) {
(new RestResponse())
->setStatus(StatusCode::FORBIDDEN)
->end();
}
phpinfo();
exit;
}
}
namespace InnStudio\Prober\Components\PhpInfoDetail;
class PhpInfoDetailConstants
{
const ID = 'phpInfoDetail';
}
namespace InnStudio\Prober\Components\Ping;
class PingConstants
{
const ID = 'ping';
}
namespace InnStudio\Prober\Components\Ping;
use InnStudio\Prober\Components\Rest\RestResponse;
use InnStudio\Prober\Components\Rest\StatusCode;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
final class PingAction
{
public function render($action)
{
$id = PingConstants::ID;
if ($action !== $id) {
return;
}
$response = new RestResponse();
if (UserConfigApi::isDisabled($id)) {
$response
->setStatus(StatusCode::NOT_IMPLEMENTED)
->end();
}
$response
->setData([
'id' => (string) microtime(true),
'time' => \defined('XPROBER_TIMER') ? microtime(true) - XPROBER_TIMER : 0,
])
->end();
}
}
namespace InnStudio\Prober\Components\Ping;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
final class PingPoll
{
public function render()
{
$id = PingConstants::ID;
if (UserConfigApi::isDisabled($id)) {
return [
$id => null,
];
}
return [
$id => true,
];
}
}
namespace InnStudio\Prober\Components\PhpExtensions;
class PhpExtensionsConstants
{
const ID = 'phpExtensions';
}
namespace InnStudio\Prober\Components\PhpExtensions;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
final class PhpExtensionsPoll
{
public function render()
{
$id = PhpExtensionsConstants::ID;
if (UserConfigApi::isDisabled($id)) {
return [
$id => null,
];
}
$jitEnabled = false;
if (\function_exists('opcache_get_status')) {
$status = opcache_get_status();
if (isset($status['jit']['enabled']) && true === $status['jit']['enabled']) {
$jitEnabled = true;
}
}
return [
$id => [
'redis' => \extension_loaded('redis') && class_exists('Redis'),
'sqlite3' => \extension_loaded('sqlite3') && class_exists('Sqlite3'),
'memcache' => \extension_loaded('memcache') && class_exists('Memcache'),
'memcached' => \extension_loaded('memcached') && class_exists('Memcached'),
'opcache' => \function_exists('opcache_get_status'),
'opcacheEnabled' => $this->isOpcEnabled(),
'opcacheJitEnabled' => $jitEnabled,
'swoole' => \extension_loaded('swoole') && \function_exists('swoole_version'),
'imagick' => \extension_loaded('imagick') && class_exists('Imagick'),
'gmagick' => \extension_loaded('gmagick'),
'exif' => \extension_loaded('exif') && \function_exists('exif_imagetype'),
'fileinfo' => \extension_loaded('fileinfo'),
'simplexml' => \extension_loaded('simplexml'),
'sockets' => \extension_loaded('sockets') && \function_exists('socket_accept'),
'mysqli' => \extension_loaded('mysqli') && class_exists('mysqli'),
'zip' => \extension_loaded('zip') && class_exists('ZipArchive'),
'mbstring' => \extension_loaded('mbstring') && \function_exists('mb_substr'),
'phalcon' => \extension_loaded('phalcon'),
'xdebug' => \extension_loaded('xdebug'),
'zendOptimizer' => \function_exists('zend_optimizer_version'),
'ionCube' => \extension_loaded('ioncube loader'),
'sourceGuardian' => \extension_loaded('sourceguardian'),
'ldap' => \function_exists('ldap_connect'),
'curl' => \function_exists('curl_init'),
'loadedExtensions' => UserConfigApi::isDisabled('phpExtensionsLoaded') ? [] : get_loaded_extensions(),
],
];
}
private function isOpcEnabled()
{
$isOpcEnabled = \function_exists('opcache_get_configuration');
if ($isOpcEnabled) {
$isOpcEnabled = opcache_get_configuration();
$isOpcEnabled = isset($isOpcEnabled['directives']['opcache.enable']) && true === $isOpcEnabled['directives']['opcache.enable'];
}
return $isOpcEnabled;
}
}
namespace InnStudio\Prober\Components\Footer;
use InnStudio\Prober\Components\Events\EventsApi;
final class Footer
{
private $ID = 'footer';
public function __construct()
{
EventsApi::on('conf', function (array $conf) {
$conf[$this->ID] = [
'memUsage' => memory_get_usage(),
'time' => microtime(true) - (\defined('XPROBER_TIMER') ? XPROBER_TIMER : 0),
];
return $conf;
}, \PHP_INT_MAX);
}
}
namespace InnStudio\Prober\Components\DiskUsage;
class DiskUsageConstants
{
const ID = 'diskUsage';
}
namespace InnStudio\Prober\Components\DiskUsage;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
use InnStudio\Prober\Components\Utils\UtilsDisk;
final class DiskUsagePoll
{
public function render()
{
$id = DiskUsageConstants::ID;
if (UserConfigApi::isDisabled($id)) {
return [
$id => null,
];
}
return [
$id => [
'items' => UtilsDisk::getItems(),
],
];
}
}
namespace InnStudio\Prober\Components\Location;
class LocationConstants
{
const ID = 'locationIpv4';
const FEATURE_LOCATION = 'locationIpv4';
}
namespace InnStudio\Prober\Components\Location;
use InnStudio\Prober\Components\Rest\RestResponse;
use InnStudio\Prober\Components\Rest\StatusCode;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
use InnStudio\Prober\Components\Utils\UtilsLocation;
final class LocationIpv4Action
{
public function render($action)
{
if (LocationConstants::ID !== $action) {
return;
}
$response = new RestResponse();
if (UserConfigApi::isDisabled(LocationConstants::FEATURE_LOCATION)) {
$response
->setStatus(StatusCode::FORBIDDEN)
->end();
}
$ip = filter_input(\INPUT_GET, 'ip', \FILTER_VALIDATE_IP, [
'flags' => \FILTER_FLAG_IPV4,
]);
if ( ! $ip) {
$response
->setStatus(StatusCode::BAD_REQUEST)
->end();
}
$response
->setData(UtilsLocation::getLocation($ip))
->end();
}
}
namespace InnStudio\Prober\Components\ServerStatus;
class ServerStatusConstants
{
const ID = 'serverStatus';
}
namespace InnStudio\Prober\Components\ServerStatus;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
use InnStudio\Prober\Components\Utils\UtilsCpu;
use InnStudio\Prober\Components\Utils\UtilsMemory;
final class ServerStatusPoll
{
public function render()
{
$id = ServerStatusConstants::ID;
if (UserConfigApi::isDisabled($id)) {
return [
$id => null,
];
}
return [
$id => [
'sysLoad' => UtilsCpu::getLoadAvg(),
'cpuUsage' => UtilsCpu::getUsage(),
'memRealUsage' => [
'value' => UtilsMemory::getMemoryUsage('MemRealUsage'),
'max' => UtilsMemory::getMemoryUsage('MemTotal'),
],
'memBuffers' => [
'value' => UtilsMemory::getMemoryUsage('Buffers'),
'max' => UtilsMemory::getMemoryUsage('MemUsage'),
],
'memCached' => [
'value' => UtilsMemory::getMemoryUsage('Cached'),
'max' => UtilsMemory::getMemoryUsage('MemUsage'),
],
'swapUsage' => [
'value' => UtilsMemory::getMemoryUsage('SwapUsage'),
'max' => UtilsMemory::getMemoryUsage('SwapTotal'),
],
'swapCached' => [
'value' => UtilsMemory::getMemoryUsage('SwapCached'),
'max' => UtilsMemory::getMemoryUsage('SwapUsage'),
],
],
];
}
}
namespace InnStudio\Prober\Components\Timezone;
final class Timezone
{
public function __construct()
{
if ( ! \ini_get('date.timezone')) {
date_default_timezone_set('GMT');
}
}
}
namespace InnStudio\Prober\Components\Rest;
final class RestResponse
{
private $data;
private $headers = [];
private $status = StatusCode::OK;
public function __construct($data = null, $status = StatusCode::OK, array $headers = [])
{
$this->setData($data);
$this->setStatus($status);
$this->setHeaders($headers);
}
public function setHeader($key, $value, $replace = true)
{
if ($replace || ! isset($this->headers[$key])) {
$this->headers[$key] = $value;
} else {
$this->headers[$key] .= ", {$value}";
}
}
public function setHeaders(array $headers)
{
$this->headers = $headers;
}
public function getHeaders()
{
return $this->headers;
}
public function setStatus($status)
{
$this->status = $status;
return $this;
}
public function getStatus()
{
return $this->status;
}
public function setData($data)
{
$this->data = $data;
return $this;
}
public function getData()
{
return $this->data;
}
public function json()
{
// header('Content-Type: application/json');
// header('Expires: 0');
// header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
// header('Cache-Control: no-store, no-cache, must-revalidate');
// header('Pragma: no-cache');
// echo $this->toJson();
return $this;
}
public function end()
{
$this->httpResponseCode($this->status);
header('Content-Type: application/json');
header('Expires: 0');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Pragma: no-cache');
if (null !== $this->data) {
echo $this->toJson();
}
exit;
}
private function toJson()
{
$data = $this->getData();
if (null === $data) {
return '';
}
return json_encode($data, \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES);
}
private function httpResponseCode($code)
{
if (\function_exists('http_response_code')) {
return http_response_code($code);
}
$statusCode = [
100 => 'Continue',
101 => 'Switching Protocols',
102 => 'Processing',
200 => 'OK',
201 => 'Created',
202 => 'Accepted',
203 => 'Non-Authoritative Information',
204 => 'No Content',
205 => 'Reset Content',
206 => 'Partial Content',
207 => 'Multi-Status',
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
306 => '(Unused)',
307 => 'Temporary Redirect',
308 => 'Permanent Redirect',
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
403 => 'Forbidden',
404 => 'Not Found',
405 => 'Method Not Allowed',
406 => 'Not Acceptable',
407 => 'Proxy Authentication Required',
408 => 'Request Timeout',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Request Entity Too Large',
414 => 'Request-URI Too Long',
415 => 'Unsupported Media Type',
416 => 'Requested Range Not Satisfiable',
417 => 'Expectation Failed',
418 => "I'm a teapot",
419 => 'Authentication Timeout',
420 => 'Enhance Your Calm',
422 => 'Unprocessable Entity',
423 => 'Locked',
424 => 'Failed Dependency',
424 => 'Method Failure',
425 => 'Unordered Collection',
426 => 'Upgrade Required',
428 => 'Precondition Required',
429 => 'Too Many Requests',
431 => 'Request Header Fields Too Large',
444 => 'No Response',
449 => 'Retry With',
450 => 'Blocked by Windows Parental Controls',
451 => 'Unavailable For Legal Reasons',
494 => 'Request Header Too Large',
495 => 'Cert Error',
496 => 'No Cert',
497 => 'HTTP to HTTPS',
499 => 'Client Closed Request',
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway',
503 => 'Service Unavailable',
504 => 'Gateway Timeout',
505 => 'HTTP Version Not Supported',
506 => 'Variant Also Negotiates',
507 => 'Insufficient Storage',
508 => 'Loop Detected',
509 => 'Bandwidth Limit Exceeded',
510 => 'Not Extended',
511 => 'Network Authentication Required',
598 => 'Network read timeout error',
599 => 'Network connect timeout error',
];
$msg = isset($statusCode[$code]) ? $statusCode[$code] : 'Unknow error';
$protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');
header("{$protocol} {$code} {$msg}");
}
}
namespace InnStudio\Prober\Components\Rest;
final class StatusCode
{
const CONTINUE = 100;
const SWITCHING_PROTOCOLS = 101;
const PROCESSING = 102; // WEBDAV;_RFC_2518
const OK = 200;
const CREATED = 201;
const ACCEPTED = 202;
const NON_AUTHORITATIVE_INFORMATION = 203; // SINCE_HTTP/1.1
const NO_CONTENT = 204;
const RESET_CONTENT = 205;
const PARTIAL_CONTENT = 206;
const MULTI_STATUS = 207; // WEBDAV;_RFC_4918
const ALREADY_REPORTED = 208; // WEBDAV;_RFC_5842
const IM_USED = 226; // RFC_3229
const MULTIPLE_CHOICES = 300;
const MOVED_PERMANENTLY = 301;
const FOUND = 302;
const SEE_OTHER = 303; // SINCE_HTTP/1.1
const NOT_MODIFIED = 304;
const USE_PROXY = 305; // SINCE_HTTP/1.1
const SWITCH_PROXY = 306;
const TEMPORARY_REDIRECT = 307; // SINCE_HTTP/1.1
const PERMANENT_REDIRECT = 308; // APPROVED_AS_EXPERIMENTAL_RFC
const BAD_REQUEST = 400;
const UNAUTHORIZED = 401;
const PAYMENT_REQUIRED = 402;
const FORBIDDEN = 403;
const NOT_FOUND = 404;
const METHOD_NOT_ALLOWED = 405;
const NOT_ACCEPTABLE = 406;
const PROXY_AUTHENTICATION_REQUIRED = 407;
const REQUEST_TIMEOUT = 408;
const CONFLICT = 409;
const GONE = 410;
const LENGTH_REQUIRED = 411;
const PRECONDITION_FAILED = 412;
const REQUEST_ENTITY_TOO_LARGE = 413;
const REQUEST_URI_TOO_LONG = 414;
const UNSUPPORTED_MEDIA_TYPE = 415;
const REQUESTED_RANGE_NOT_SATISFIABLE = 416;
const EXPECTATION_FAILED = 417;
const I_AM_A_TEAPOT = 418;
const AUTHENTICATION_TIMEOUT = 419; // NOT_IN_RFC_2616
const ENHANCE_YOUR_CALM = 420; // TWITTER
const METHOD_FAILURE = 420; // SPRING_FRAMEWORK
const UNPROCESSABLE_ENTITY = 422; // WEBDAV;_RFC_4918
const LOCKED = 423; // WEBDAV;_RFC_4918
const FAILED_DEPENDENCY = 424; // WEBDAV
const UNORDERED_COLLECTION = 425; // INTERNET_DRAFT
const UPGRADE_REQUIRED = 426; // RFC_2817
const PRECONDITION_REQUIRED = 428; // RFC_6585
const TOO_MANY_REQUESTS = 429; // RFC_6585
const REQUEST_HEADER_FIELDS_TOO_LARGE = 431; // RFC_6585
const NO_RESPONSE = 444; // NGINX
const RETRY_WITH = 449; // MICROSOFT
const BLOCKED_BY_WINDOWS_PARENTAL_CONTROLS = 450; // MICROSOFT
const REDIRECT = 451; // MICROSOFT
const UNAVAILABLE_FOR_LEGAL_REASONS = 451; // INTERNET_DRAFT
const REQUEST_HEADER_TOO_LARGE = 494; // NGINX
const CERT_ERROR = 495; // NGINX
const NO_CERT = 496; // NGINX
const HTTP_TO_HTTPS = 497; // NGINX
const CLIENT_CLOSED_REQUEST = 499; // NGINX
const INTERNAL_SERVER_ERROR = 500;
const NOT_IMPLEMENTED = 501;
const BAD_GATEWAY = 502;
const SERVICE_UNAVAILABLE = 503;
const GATEWAY_TIMEOUT = 504;
const HTTP_VERSION_NOT_SUPPORTED = 505;
const VARIANT_ALSO_NEGOTIATES = 506; // RFC_2295
const INSUFFICIENT_STORAGE = 507; // WEBDAV;_RFC_4918
const LOOP_DETECTED = 508; // WEBDAV;_RFC_5842
const BANDWIDTH_LIMIT_EXCEEDED = 509; // APACHE_BW/LIMITED_EXTENSION
const NOT_EXTENDED = 510; // RFC_2774
const NETWORK_AUTHENTICATION_REQUIRED = 511; // RFC_6585
const NETWORK_READ_TIMEOUT_ERROR = 598; // UNKNOWN
const NETWORK_CONNECT_TIMEOUT_ERROR = 599; // Unknown
}
namespace InnStudio\Prober\Components\Poll;
use InnStudio\Prober\Components\Rest\RestResponse;
final class PollAction extends PoolConstants
{
public function render($action)
{
if (PoolConstants::ID !== $action) {
return;
}
$data = [];
foreach ([
'Config\\ConfigPoll',
'UserConfig\\UserConfigPoll',
'PhpInfo\\PhpInfoPoll',
'Database\\DatabasePoll',
'MyInfo\\MyInfoPoll',
'DiskUsage\\DiskUsagePoll',
'PhpExtensions\\PhpExtensionsPoll',
'NetworkStats\\NetworkStatsPoll',
'ServerStatus\\ServerStatusPoll',
'ServerInfo\\ServerInfoPoll',
'Nodes\\NodesPoll',
'TemperatureSensor\\TemperatureSensorPoll',
'ServerBenchmark\\ServerBenchmarkPoll',
'BrowserBenchmark\\BrowserBenchmarkPoll',
'Ping\\PingPoll',
] as $fn) {
$class = "\\InnStudio\\Prober\\Components\\{$fn}";
$data = array_merge($data, (new $class())->render());
}
(new RestResponse())
->setData($data)
->end();
}
}
namespace InnStudio\Prober\Components\Poll;
class PoolConstants
{
const ID = 'poll';
}
namespace InnStudio\Prober\Components\MyInfo;
class MyInfoConstants
{
const ID = 'myInfo';
}
namespace InnStudio\Prober\Components\MyInfo;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
use InnStudio\Prober\Components\Utils\UtilsClientIp;
final class MyInfoPoll
{
public function render()
{
$id = MyInfoConstants::ID;
if (UserConfigApi::isDisabled($id)) {
return [
$id => null,
];
}
return [
$id => [
'phpLanguage' => isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : '-',
'ipv4' => UtilsClientIp::getV4(),
'ipv6' => UtilsClientIp::getV6(),
],
];
}
}
namespace InnStudio\Prober\Components\Bootstrap;
use InnStudio\Prober\Components\Action\Action;
use InnStudio\Prober\Components\Timezone\Timezone;
final class Bootstrap
{
public static $dir;
public function __construct($dir)
{
error_reporting(\E_ALL);
self::$dir = $dir;
new Timezone();
new Action();
new Render();
}
}
namespace InnStudio\Prober\Components\Bootstrap;
class BootstrapConstants
{
const ID = 'bootstrap';
}
namespace InnStudio\Prober\Components\Bootstrap;
use InnStudio\Prober\Components\Config\ConfigApi;
use InnStudio\Prober\Components\WindowConfig\WindowConfigApi;
final class Render
{
public function __construct()
{
if (\defined('XPROBER_IS_DEV') && XPROBER_IS_DEV) {
return;
}
$appName = ConfigApi::$config['APP_NAME'];
$version = ConfigApi::$config['APP_VERSION'];
$loadScript = \defined('XPROBER_IS_DEV') && XPROBER_IS_DEV ? '' : "";
$loadStyle = \defined('XPROBER_IS_DEV') && XPROBER_IS_DEV ? '' : "";
$globalConfig = WindowConfigApi::getGlobalConfig();
echo <<
{$appName} {$version}
{$globalConfig}
{$loadScript}
{$loadStyle}
Loading...
HTML;
}
}
namespace InnStudio\Prober\Components\Style;
use InnStudio\Prober\Components\Utils\UtilsApi;
final class StyleAction
{
public function render($action)
{
if ('style' !== $action) {
return;
}
$this->output();
}
private function output()
{
UtilsApi::setFileCacheHeader();
header('Content-type: text/css');
echo <<<'CODE'
@charset "UTF-8";:root{--x-max-width: 1680px;--x-radius: .5rem;--x-fg: hsl(0, 0%, 20%);--x-bg: hsl(0, 0%, 97%);--x-text-font-family: Verdana, Geneva, Tahoma, sans-serif;--x-code-font-family: monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New";--x-app-border-color: var(--x-fg);--x-app-bg: var(--x-bg);--x-star-me-fg: var(--x-bg);--x-star-me-bg: var(--x-fg);--x-star-me-hover-fg: hsl(0, 0%, 100%);--x-star-me-hover-bg: var(--x-fg);--x-star-me-border-color: linear-gradient(90deg, transparent, hsl(0, 0%, 100%), transparent);--x-status-ok-fg: hsl(0, 0%, 100%);--x-status-ok-bg: linear-gradient(hsl(120, 100%, 30%), hsl(120, 100%, 45%));--x-status-error-fg: hsl(0, 0%, 100%);--x-status-error-bg: linear-gradient(hsl(0, 0%, 50%), hsl(0, 0%, 73%));--x-network-node-fg: var(--x-fg);--x-network-node-bg: hsla(132, 4%, 23%, .1);--x-network-node-border-color: var(--x-card-split-color);--x-network-node-row-bg: linear-gradient(to right, transparent, hsla(0, 0%, 100%, .5), transparent)}:root{--x-gutter: 1rem;--x-gutter-sm: .5rem}@media (prefers-color-scheme: dark){:root{--x-fg: hsl(0, 0%, 80%);--x-bg: hsl(0, 0%, 0%);--x-app-border-color: var(--x-bg);--x-app-bg: hsl(0, 0%, 13%);--x-star-me-fg: var(--x-fg);--x-star-me-bg: var(--x-bg);--x-star-me-hover-fg: hsl(0, 0%, 100%);--x-star-me-hover-bg: var(--x-bg);--x-star-me-border-color: linear-gradient(90deg, transparent, hsl(0, 0%, 100%), transparent);--x-status-ok-fg: hsl(0, 0%, 100%);--x-status-ok-bg: linear-gradient(hsl(120, 100%, 20%), hsl(120, 100%, 25%));--x-status-error-fg: hsl(0, 0%, 100%);--x-status-error-bg: linear-gradient(hsl(0, 0%, 27%), hsl(0, 0%, 33%));--x-network-node-fg: var(--x-fg);--x-network-node-bg: hsla(0, 0%, 100%, .05);--x-network-node-border-color: var(--x-card-split-color);--x-network-node-row-bg: var(--x-card-bg-hover)}}:root{--x-footer-bg: hsl(0 0% 0% / .05);--x-footer-fg: hsl(0 0% 0% / .5)}@media (prefers-color-scheme: dark){:root{--x-footer-bg: hsl(0 0% 100% / .1);--x-footer-fg: hsl(0 0% 100% / .5)}}._main_17cch_12{width:100%;color:var(--x-footer-fg);text-align:center;word-break:normal}._main_17cch_12 a,._main_17cch_12 a:hover{color:var(--x-footer-fg)}:root{--x-header-fg: hsl(0 0% 0% / .9);--x-header-bg: transparent;--x-header-link-bg: hsl(0 0% 0% / .1);--x-header-link-bg-hover: hsl(0 0% 0% / .15)}@media (prefers-color-scheme: dark){:root{--x-header-fg: hsl(0 0% 100% / .9);--x-header-bg: hsl(0 0% 100% / .1);--x-header-link-bg: hsl(0 0% 100% / .1);--x-header-link-bg-hover: hsl(0 0% 100% / .15)}}._main_1jpdc_16{display:flex;justify-content:center;padding-top:var(--x-gutter)}:root{--x-link-fg: hsl(0 0% 95% / .95);--x-link-bg: hsl(0 0% 15% / .95);--x-link-bg-hover: hsl(0 0% 20% / .95);--x-link-bg-active: hsl(0 0% 25% / .95)}@media (prefers-color-scheme: dark){:root{--x-link-fg: hsl(0 0% 100% / .95);--x-link-bg: hsl(0 0% 10% / .95);--x-link-bg-hover: hsl(0 0% 15% / .95);--x-link-bg-active: hsl(0 0% 20% / .95)}}._main_p5526_16{display:flex;align-items:center;gap:var(--x-gutter-sm);cursor:pointer;border:none;border-radius:10rem;background:var(--x-link-bg);padding:var(--x-gutter-sm) var(--x-gutter);color:var(--x-link-fg);text-decoration:none}._main_p5526_16:hover{background:var(--x-link-bg-hover);color:var(--x-link-fg);text-decoration:none}._main_p5526_16:active{background:var(--x-link-bg-active);color:var(--x-link-fg);text-decoration:none}._main_1k8xz_1{font-weight:400;font-size:1rem}._name_1k8xz_6{font-weight:700}._version_1k8xz_10{opacity:.75;font-weight:400;font-size:.8em}:root{--x-toast-fg: hsl(0 0% 100% / .95);--x-toast-bg: hsl(0 0% 0% / .75)}@media (prefers-color-scheme: dark){:root{--x-toast-fg: hsl(0 0% 100% / .95);--x-toast-bg: hsl(0 0% 100% / .15)}}._main_17sik_12{position:fixed;bottom:4rem;left:50%;transform:translate(-50%);z-index:20;backdrop-filter:blur(5px);cursor:pointer;border:none;border-radius:var(--x-gutter);background:var(--x-toast-bg);padding:var(--x-gutter);max-width:80vw;color:var(--x-toast-fg);text-align:justify}:root{--x-fg: hsl(0 0% 10%);--x-body-fg: hsl(0 0% 10%);--x-body-bg: hsl(0 0% 90%)}@media (prefers-color-scheme: dark){:root{--x-fg: hsl(0 0% 90%);--x-body-fg: hsl(0 0% 90%);--x-body-bg: hsl(0 0% 0%)}}*{box-sizing:border-box;margin:0;padding:0;word-break:break-word}html{scroll-behavior:smooth;font-size:85%}body{display:grid;place-content:safe center;vertical-align:middle;gap:var(--x-gutter);margin:0;background:var(--x-body-bg);padding:0;color:var(--x-body-fg);line-height:1.5;font-family:var(--x-code-font-family)}a{cursor:pointer;color:var(--x-fg);text-decoration:none}a:hover,a:active{color:var(--x-fg);text-decoration:underline}._container_30sck_1{display:grid;gap:var(--x-gutter);max-width:1200px}:root{--x-card-legend-arrow-fg: var(--x-card-legend-fg);--x-card-legend-arrow-bg-hover: hsl(0 0% 0% / .05);--x-card-legend-arrow-bg-active: hsl(0 0% 0% / .1)}@media (prefers-color-scheme: dark){:root{--x-card-legend-arrow-fg: var(--x-card-legend-fg);--x-card-legend-arrow-bg-hover: hsl(0 0% 100% / .05);--x-card-legend-arrow-bg-active: hsl(0 0% 100% / .1)}}._arrow_1qtu9_14{display:flex;align-items:center;cursor:pointer;border:none;border-radius:var(--x-radius);background:transparent;padding:var(--x-gutter-sm);color:var(--x-card-legend-arrow-fg)}._arrow_1qtu9_14:hover{background:var(--x-card-legend-arrow-bg-hover);color:var(--x-card-legend-arrow-fg)}._arrow_1qtu9_14:active{background:var(--x-card-legend-arrow-bg-active);color:var(--x-card-legend-arrow-fg)}._arrow_1qtu9_14[data-disabled],._arrow_1qtu9_14[data-disabled]:hover{opacity:.5;cursor:not-allowed}._arrow_1qtu9_14 svg{width:1rem;height:1rem}:root{--x-module-bg: hsl(0 0% 0% / .95);--x-module-header-bg: hsl(0 0% 100% / .75);--x-module-header-fg: hsl(0 0% 0%);--x-module-header-title-fg: hsl(0 0% 0% / .7);--x-module-header-title-bg: hsl(0 0% 0% / .1);--x-module-body-bg: var(--x-module-header-bg);--x-module-box-shadow: hsla(0 0% 20% .3) 0px -1px 0px hsl(0 0% 100%) 0px 1px 0px inset, hsla(0 0% 20% .3) 0px -1px 0px inset hsl(0 0% 100%) 0px 1px 0px}@media (prefers-color-scheme: dark){:root{--x-module-bg: hsl(0 0% 15% / .95);--x-module-header-bg: hsl(0 0% 100% / .1);--x-module-header-fg: hsl(0 0% 100% / .7);--x-module-header-title-fg: hsl(0 0% 100% / .7);--x-module-header-title-bg: hsl(0 0% 100% / .1);--x-module-body-bg: var(--x-module-header-bg);--x-module-box-shadow: 0px 0px 0px 1px hsl(0 0% 0%) inset}}._main_60fl9_23{position:relative;flex-grow:1;scroll-margin-top:0}._header_60fl9_29{display:flex;align-items:center;border-radius:var(--x-radius) var(--x-radius) 0 0;background:var(--x-module-header-bg);padding:1px;width:fit-content;color:var(--x-module-header-fg);font-size:1rem;white-space:nowrap}._title_60fl9_41{font-weight:400}._body_60fl9_45{display:grid;gap:var(--x-gutter-sm);border-radius:0 var(--x-radius) var(--x-radius) var(--x-radius);background:var(--x-module-body-bg);padding:var(--x-gutter)}:root{--x-card-des-fg: var(--x-fg);--x-card-des-bg: hsl(0 0% 100% / .1);--x-card-des-accent: hsl(0 0% 0% / .5)}@media (prefers-color-scheme: dark){:root{--x-card-des-fg: var(--x-fg);--x-card-des-bg: hsl(0 0% 100% / .1);--x-card-des-accent: hsl(209, 100%, 63%)}}._main_1hf64_14{display:grid;border-radius:var(--x-radius);color:var(--x-card-des-fg);font-family:var(--x-text-font-family);list-style-type:none}._item_1hf64_22{display:flex;align-items:center;gap:var(--x-gutter-sm)}._item_1hf64_22:before{border-radius:var(--x-radius);background:var(--x-card-des-accent);width:2px;height:50%;content:""}:root{--x-placeholder-bg: linear-gradient(to right, hsl(0 0% 0% / .1) 46%, hsl(0 0% 0% / .15) 50%, hsl(0 0% 0% / .1) 54%) 50% 50%}@media (prefers-color-scheme: dark){:root{--x-placeholder-bg: linear-gradient( to right, hsl(0 0% 100% / .1) 46%, hsl(0 0% 100% / .15) 50%, hsl(0 0% 100% / .1) 54% ) 50% 50%}}@keyframes _animation_vvbro_1{0%{transform:translate3d(-30%,0,0)}to{transform:translate3d(30%,0,0)}}._main_vvbro_25{position:relative;border-radius:var(--x-radius);overflow:hidden}._main_vvbro_25:before{position:absolute;inset:0 0 0 50%;z-index:1;animation:_animation_vvbro_1 1s linear infinite;margin-left:-250%;background:var(--x-placeholder-bg);width:500%;pointer-events:none;content:" "}:root{--x-error-fg: hsl(0 100% 50%);--x-error-bg: hsl(0 100% 30%);--x-error-icon-fg: hsl(0 100% 50%);--x-error-icon-bg: hsl(0 100% 97%)}@media (prefers-color-scheme: dark){:root{--x-error-fg: hsl(0 0% 100% / .9);--x-error-bg: hsl(0, 100%, 50%);--x-error-icon-fg: var(--x-error-bg);--x-error-icon-bg: hsl(0 0% 100% / .5)}}._main_1ogv8_16{display:flex;position:relative;align-items:center;gap:var(--x-gutter-sm);border-radius:var(--x-radius);color:var(--x-error-fg);font-family:var(--x-text-font-family)}._main_1ogv8_16:before{border-radius:var(--x-radius);background:var(--x-error-bg);width:2px;height:50%;content:""}:root{--x-benchmark-ruby-bg: hsl(0 0% 0% / .05);--x-benchmark-ruby-bg-hover: hsl(0 0% 0% / .05)}@media (prefers-color-scheme: dark){:root{--x-benchmark-ruby-bg: hsl(0 0% 100% / .05);--x-benchmark-ruby-bg-hover: hsl(0 0% 100% / .1)}}._main_1j8ow_12 rt{opacity:.5;font-weight:400;font-size:1rem}._main_1j8ow_12[data-is-result]{font-weight:700}._main_1p71d_13{display:grid;gap:var(--x-gutter-sm);border-radius:var(--x-radius);background:var(--x-server-benchmark-bg);padding:var(--x-gutter-sm);text-align:center}._header_1p71d_22{display:flex;justify-content:center;align-items:center}._link_1p71d_28{opacity:.75;cursor:pointer;border:none;border-radius:var(--x-radius);background:none;padding:0 var(--x-gutter-sm)}._link_1p71d_28:hover,._link_1p71d_28:active{opacity:1;background:var(--x-server-benchmark-link-bg);text-decoration:none}._link_1p71d_28 svg{width:1rem;height:1rem}._marks_1p71d_46{display:flex;justify-content:center;align-items:center;gap:var(--x-gutter-sm);cursor:pointer;border:none;border-radius:var(--x-radius);background:transparent;color:var(--x-server-benchmark-link-fg);font-size:1.25rem}._marks_1p71d_46:hover{background:var(--x-server-benchmark-link-bg)}._sign_1p71d_62{opacity:.5}:root{--x-meter-height: 2px;--x-meter-bar-bg: hsl(0 0% 0% / .1);--x-meter-value-bg: hsl(120 100% 40%);--x-meter-value-optimum-bg: hsl(120 100% 30%);--x-meter-value-suboptimum-bg: hsl(36 77% 64%);--x-meter-value-even-less-good-bg: hsl(12 100% 39%)}@media (prefers-color-scheme: dark){:root{--x-meter-bar-bg: hsl(0 0% 100% / .1);--x-meter-value-optimum-bg: hsl(120 100% 30%);--x-meter-value-suboptimum-bg: hsl(36 77% 54%);--x-meter-value-even-less-good-bg: hsl(12 100% 39%)}}._main_1isor_18{display:grid;grid-template-columns:1fr auto;grid-template-areas:"x-meter-name x-meter-percent" "x-meter-name x-meter-overview" "x-meter-core x-meter-core ";gap:var(--x-gutter-sm)}._percent_1isor_25{grid-area:x-meter-percent;text-align:right}._name_1isor_30{display:flex;grid-area:x-meter-name;align-items:center;border:none;background:none;color:var(--x-bg-fg);font-weight:700;text-align:center}._nameText_1isor_41{display:-webkit-box;-webkit-box-orient:vertical;max-width:15rem;-webkit-line-clamp:2;overflow:hidden}._overview_1isor_49{grid-area:x-meter-overview}._core_1isor_53{grid-area:x-meter-core;background:none;width:100%;height:var(--x-meter-height)}._core_1isor_53::-webkit-meter-bar{border-radius:10rem;background:var(--x-meter-bar-bg);height:var(--x-meter-height)}._core_1isor_53::-webkit-meter-optimum-value{border-radius:10rem;background:var(--x-meter-value-optimum-bg)}._core_1isor_53::-webkit-meter-suboptimum-value{border-radius:10rem;background:var(--x-meter-value-suboptimum-bg)}._core_1isor_53::-webkit-meter-even-less-good-value{border-radius:10rem;background:var(--x-meter-value-even-less-good-bg)}._btn_9r2wb_1{display:block}._browsersLoading_9r2wb_5{display:grid;justify-content:center;align-items:center;height:5rem}._browsers_9r2wb_5{display:grid;grid-template-columns:repeat(auto-fill,minmax(25rem,1fr));gap:var(--x-gutter-sm)}:root{--x-button-fg: var(--x-fg);--x-button-bg: hsl(0 0% 0% / .1);--x-button-fg-hover: var(--x-fg);--x-button-bg-hover: hsl(0 0% 0% / .15);--x-button-fg-active: var(--x-fg);--x-button-bg-active: hsl(0 0% 0% / .2)}@media (prefers-color-scheme: dark){:root{--x-button-fg: var(--x-fg);--x-button-bg: hsl(0 0% 100% / .1);--x-button-fg-hover: var(--x-fg);--x-button-bg-hover: hsl(0 0% 100% / .15);--x-button-fg-active: var(--x-fg);--x-button-bg-active: hsl(0 0% 100% / .2)}}@keyframes _spin_1shxn_1{to{transform:rotate(360deg)}}._button_1shxn_25{display:flex;align-items:center;gap:.25em;cursor:pointer;border:none;border-radius:var(--x-radius);background:var(--x-button-bg);padding:0 var(--x-gutter-sm);color:var(--x-button-fg);font-family:var(--x-text-font-family);text-decoration:none}._button_1shxn_25:hover{background:var(--x-button-bg-hover);color:var(--x-button-fg-hover);text-decoration:none}._button_1shxn_25:active{background:var(--x-button-bg-active);color:var(--x-button-fg-active);text-decoration:none}._icon_1shxn_49{display:grid;place-content:center;aspect-ratio:1/1;width:1rem}._icon_1shxn_49 svg{width:1rem;height:1rem}._icon_1shxn_49[data-status=loading]{animation:_spin_1shxn_1 1s linear infinite}:root{--x-nav-fg: hsl(0 0% 100% / .9);--x-nav-bg: hsl(0 0% 15% / .95);--x-nav-bg-hover: hsl(0 0% 100% / .05);--x-nav-bg-active: hsl(0 0% 100% / .1);--x-nav-border-color: hsl(0 0% 100% / .05)}@media (prefers-color-scheme: dark){:root{--x-nav-fg: hsl(0 0% 95% / .95);--x-nav-bg: hsl(0 0% 20% / .95);--x-nav-bg-hover: hsl(0 0% 25% / .95);--x-nav-bg-active: hsl(0 0% 30% / .95);--x-nav-border-color: hsl(0 0% 100% / .05)}}._main_1ygx7_18{display:flex;position:sticky;bottom:0;justify-content:flex-start;align-items:center;z-index:10;background:var(--x-nav-bg);overflow-x:auto}@media (min-width: 768px){._main_1ygx7_18{justify-content:center;border-radius:var(--x-radius) var(--x-radius) 0 0}}._link_1ygx7_35{position:relative;border-right:1px solid var(--x-nav-border-color);padding:var(--x-gutter);color:var(--x-nav-fg);white-space:nowrap}._link_1ygx7_35:hover{background:var(--x-nav-bg-hover);color:var(--x-nav-fg);text-decoration:none}._link_1ygx7_35:focus,._link_1ygx7_35:active,._link_1ygx7_35[data-active]{background:var(--x-nav-bg-active);color:var(--x-nav-fg);text-decoration:none}._link_1ygx7_35:last-child{border-right:0}:root{--x-card-group-label-fg: var(--x-fg);--x-card-group-split-color: hsl(0 0% 0% / .1);--x-card-group-bg-hover: hsl(0 0% 0% / .05)}@media (prefers-color-scheme: dark){:root{--x-card-group-label-fg: var(--x-fg);--x-card-group-split-color: hsl(0 0% 100% / .1);--x-card-group-bg-hover: hsl(0 0% 100% / .05)}}._main_11zmy_14{display:grid;grid-template-columns:minmax(var(--min-width),var(--max-width)) 1fr;gap:var(--x-gutter-sm);border-radius:var(--x-radius)}._main_11zmy_14:hover{background:var(--x-card-group-bg-hover)}._label_11zmy_24{color:var(--x-card-group-label-fg);font-family:var(--x-text-font-family);text-align:right;word-break:normal}._label_11zmy_24:after{content:":"}._content_11zmy_34{display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--x-gutter-sm)}._main_z8p86_1{display:grid;grid-template-columns:repeat(auto-fill,minmax(var(--min-width),1fr));gap:var(--x-gutter-sm)}._main_xo4z4_2{display:inline-flex;border-radius:var(--x-radius);align-items:center;justify-content:center;font-family:Arial Black,sans-serif;font-weight:bolder;min-width:2em;padding:0 .5rem;white-space:nowrap;cursor:pointer;text-shadow:0 1px 1px #000}._main_xo4z4_2:active{transform:scale3d(.95,.95,1)}._main_xo4z4_2[data-ok]{background:var(--x-status-ok-bg);color:var(--x-status-ok-fg)}._main_xo4z4_2[data-error]{background:var(--x-status-error-bg);color:var(--x-status-error-fg)}._main_xo4z4_2[data-ok][data-icon]:before{content:"✓"}._main_xo4z4_2[data-error][data-icon]:before{content:"×"}._main_b4lx8_1{display:grid;grid-template-columns:repeat(auto-fill,minmax(25rem,1fr));gap:var(--x-gutter)}._main_mc2kq_1{display:grid;gap:var(--x-gutter-sm)}._container_1i47d_2{display:grid;grid-template-columns:repeat(auto-fill,minmax(25rem,1fr));gap:var(--x-gutter)}._item_1i47d_8{display:grid}._id_1i47d_12{text-align:center;text-decoration:underline}._idRow_1i47d_17{display:grid;align-items:center}._dataContainer_1i47d_22{display:flex;justify-content:center;align-items:center;text-align:center}._data_1i47d_22{flex:0 0 50%}._data_1i47d_22[data-rx]{color:var(--x-network-stats-rx-fg)}._data_1i47d_22[data-tx]{color:var(--x-network-stats-tx-fg)}._rate_1i47d_39{font-family:Arial Black,sans-serif}._rate_1i47d_39:before{margin-right:.5rem}._rateRx_1i47d_46:before{content:"▼"}._rateTx_1i47d_50:before{content:"▲"}:root{--x-network-stats-tx-fg: hsl(23 100% 38%);--x-network-stats-tx-bg: hsl(23 100% 38% / .1);--x-network-stats-rx-fg: hsl(120 100% 23%);--x-network-stats-rx-bg: hsl(120 100% 23% / .1)}@media (prefers-color-scheme: dark){:root{--x-network-stats-tx-fg: hsl(23 100% 58%);--x-network-stats-tx-bg: hsl(23 100% 58% /.15);--x-network-stats-rx-fg: hsl(120 100% 43%);--x-network-stats-rx-bg: hsl(120 100% 43% / .15)}}._main_1cyw0_17{display:grid;grid-template-areas:"network-stats-item-id network-stats-item-id" "network-stats-item-rx network-stats-item-tx";gap:1px;font-family:Arial Black,sans-serif}._id_1cyw0_24{grid-area:network-stats-item-id;text-align:center}._type_1cyw0_29:before{opacity:.5;content:"▼";font-size:1rem}._rx_1cyw0_35,._tx_1cyw0_36{display:grid;position:relative;grid-area:network-stats-item-rx;border-radius:var(--x-radius) 0 0 var(--x-radius);background:var(--x-network-stats-rx-bg);padding:var(--x-gutter-sm);color:var(--x-network-stats-rx-fg);text-align:center}._tx_1cyw0_36{grid-area:network-stats-item-tx;border-radius:0 var(--x-radius) var(--x-radius) 0;background:var(--x-network-stats-tx-bg);color:var(--x-network-stats-tx-fg)}._tx_1cyw0_36 ._type_1cyw0_29:before{content:"▲"}._rateRx_1cyw0_57,._rateTx_1cyw0_58{font-weight:700;font-size:1.5rem}._main_zmhfm_1{display:grid;grid-template-columns:repeat(auto-fill,minmax(20rem,1fr));gap:var(--x-gutter)}._groupId_zmhfm_7{display:block;margin-bottom:calc(var(--x-gutter) * .5);text-align:center;text-decoration:underline}._groupId_zmhfm_7:hover{text-decoration:none}._group_zmhfm_7{margin-bottom:calc(var(--x-gutter) * .5)}._groupMsg_zmhfm_21{display:flex;justify-content:center}._groupNetworks_zmhfm_26{margin-bottom:var(--x-gutter);border-radius:var(--x-radius);background:var(--x-network-node-bg);padding:var(--x-gutter);color:var(--x-network-node-fg)}._groupNetwork_zmhfm_26{margin-bottom:calc(var(--x-gutter) * .5);border-bottom:1px dashed var(--x-network-node-border-color);padding-bottom:calc(var(--x-gutter) * .5)}._groupNetwork_zmhfm_26:last-child{margin-bottom:0;border-bottom:0;padding-bottom:0}._groupNetwork_zmhfm_26:hover{background:var(--x-network-node-row-bg)}:root{--x-sys-load-fg: var(--x-fg);--x-sys-load-bg: transparent;--x-sys-load-interval-bg: hsl(0 0% 0% / .1)}@media (prefers-color-scheme: dark){:root{--x-sys-load-fg: var(--x-fg);--x-sys-load-interval-bg: hsl(0 0% 100% / .1)}}._main_1xqpo_13{display:grid;grid-template-columns:1fr auto;grid-template-areas:"x-server-stats-system-load-label x-server-stats-system-load-usage" "x-server-stats-system-load-label x-server-stats-system-load-group" "x-server-stats-system-load-meter x-server-stats-system-load-meter";gap:var(--x-gutter-sm)}._label_1xqpo_20{display:grid;grid-area:x-server-stats-system-load-label;align-items:center;font-weight:700}._meter_1xqpo_27{display:grid;grid-template-areas:"x-meter-core";grid-area:x-server-stats-system-load-meter}._usage_1xqpo_33{grid-area:x-server-stats-system-load-usage;text-align:right}._group_1xqpo_38{display:flex;grid-area:x-server-stats-system-load-group;align-items:center;gap:var(--x-gutter-sm)}._groupItem_1xqpo_45{border-radius:var(--x-radius);background:var(--x-sys-load-interval-bg);padding:0 var(--x-gutter);color:var(--x-sys-load-fg);font-weight:700;font-family:Arial Black,sans-serif,monospace}._sysLoad_mqy5s_1{display:flex;gap:var(--x-gutter-sm)}._main_66xvd_1{display:grid;grid-template-columns:1fr auto;grid-template-areas:"x-nodes-usage-label x-nodes-usage-label" "x-nodes-usage-overview x-nodes-usage-percent" "x-nodes-usage-meter x-nodes-usage-meter";column-gap:var(--x-gutter-sm);row-gap:0;gap:var(--x-gutter-sm)}._meter_66xvd_10{display:flex;grid-area:x-nodes-usage-meter;height:var(--x-meter-height)}._label_66xvd_16{grid-area:x-nodes-usage-label}._overview_66xvd_20{display:flex;grid-area:x-nodes-usage-overview;gap:var(--x-gutter-sm)}._chart_66xvd_26{display:none;grid-area:x-nodes-usage-chart}._percent_66xvd_31{grid-area:x-nodes-usage-percent}._main_1gdd5_1{display:grid;gap:var(--x-gutter-sm);container-type:inline-size;max-height:calc(100px + var(--x-gutter-sm));overflow-y:auto;overscroll-behavior:contain;scroll-snap-type:y mandatory;scrollbar-color:hsla(0,0%,50%,.5) transparent}._item_1gdd5_12{scroll-snap-align:start}._main_mc2kq_1,._main_18siw_1{display:grid;gap:var(--x-gutter-sm)}._name_18siw_6{text-align:center}._loading_18siw_10{display:grid;place-content:center center;height:10rem}:root{--x-search-fg: var(--x-fg);--x-search-bg: hsl(0 0% 0% / .1);--x-search-bg-hover: hsl(0 0% 0% / .15);--x-search-bg-active: hsl(0 0% 0% / .2)}@media (prefers-color-scheme: dark){:root{--x-search-fg: var(--x-fg);--x-search-bg: hsl(0 0% 100% / .1);--x-search-bg-hover: hsl(0 0% 100% / .15);--x-search-bg-active: hsl(0 0% 100% / .2)}}._main_uj7jp_16{border-radius:var(--x-radius);background:var(--x-search-bg);padding:calc(var(--x-gutter-sm) * .5) var(--x-gutter-sm);color:var(--x-search-fg);font-family:monospace}._main_uj7jp_16:hover{background:var(--x-search-bg-hover);text-decoration:none}._main_uj7jp_16:active{background:var(--x-search-bg-active)}:root{--x-ping-result-scrollbar-bg: hsl(0 0% 0% / .5);--x-ping-item-bg: hsl(0 0% 0% / .1)}@media (prefers-color-scheme: dark){:root{--x-ping-result-scrollbar-bg: hsl(0 0% 100% / .5);--x-ping-item-bg: hsl(0 0% 100% / .1)}}._itemContainer_y6c35_12{display:grid;grid-template-columns:repeat(auto-fill,minmax(5rem,1fr));grid-auto-flow:row;flex-grow:1;gap:.15em;border-radius:var(--x-radius);background:var(--x-ping-item-bg);padding:var(--x-gutter-sm) var(--x-gutter);height:7rem;overflow-y:auto;scrollbar-color:var(--x-ping-result-scrollbar-bg) transparent;list-style-type:none}._resultContainer_y6c35_27{display:grid;flex-grow:1;gap:var(--x-gutter-sm)}._result_y6c35_27{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}._btn_1dtle_1{display:block}._serversLoading_1dtle_5{display:grid;justify-content:center;align-items:center;height:5rem}._servers_1dtle_5{display:grid;grid-template-columns:repeat(auto-fill,minmax(25rem,1fr));gap:var(--x-gutter-sm)}._main_fajqi_1{display:flex}:root{--x-server-benchmark-bg: transparent;--x-server-benchmark-link-bg: hsl(0 0% 0% / .05);--x-server-benchmark-link-fg: hsl(0 0% 0% / .95)}@media (prefers-color-scheme: dark){:root{--x-server-benchmark-link-fg: hsl(0 0% 100% / .95);--x-server-benchmark-link-bg: hsl(0 0% 100% / .05)}}._main_1e6oe_13{display:grid;gap:var(--x-gutter-sm);border-radius:var(--x-radius);background:var(--x-server-benchmark-bg);padding:var(--x-gutter-sm);text-align:center}._header_1e6oe_22{display:flex;justify-content:center;align-items:center}._link_1e6oe_28{opacity:.75;cursor:pointer;border:none;border-radius:var(--x-radius);background:none;padding:0 var(--x-gutter-sm)}._link_1e6oe_28:hover,._link_1e6oe_28:active{opacity:1;background:var(--x-server-benchmark-link-bg);text-decoration:none}._link_1e6oe_28 svg{width:1rem;height:1rem}._marks_1e6oe_46{display:flex;justify-content:center;align-items:center;gap:var(--x-gutter-sm);cursor:pointer;border:none;border-radius:var(--x-radius);background-color:transparent;color:var(--x-server-benchmark-link-fg);font-size:1.25rem}._marks_1e6oe_46:hover{background:var(--x-server-benchmark-link-bg)}._sign_1e6oe_62{opacity:.5}._main_raw5t_1{display:grid;gap:var(--x-gutter-sm)}._modules_raw5t_6{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:var(--x-gutter)}@keyframes _spin_nuyl9_1{to{transform:rotate(360deg)}}._main_nuyl9_6{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:.5em;height:100svh}._main_nuyl9_6:before{animation:_spin_nuyl9_1 1s linear infinite;box-sizing:border-box;border:1px solid var(--x-button-bg);border-top-color:var(--x-button-fg);border-radius:50%;width:16px;height:16px;content:""}
CODE;
exit;
}
}
namespace InnStudio\Prober\Components\TemperatureSensor;
class TemperatureSensorConstants
{
const ID = 'temperatureSensor';
}
namespace InnStudio\Prober\Components\TemperatureSensor;
use Exception;
use InnStudio\Prober\Components\Config\ConfigApi;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
final class TemperatureSensorPoll
{
public function render()
{
$id = TemperatureSensorConstants::ID;
if (UserConfigApi::isDisabled($id)) {
return [
$id => null,
];
}
$items = $this->getItems();
if ( ! $items) {
return [
$id => null,
];
}
if ($items) {
return [
$id => $items,
];
}
$cpuTemp = $this->getCpuTemp();
if ( ! $cpuTemp) {
return [
$id => null,
];
}
$items[] = [
'id' => 'cpu',
'name' => 'CPU',
'celsius' => round((float) $cpuTemp / 1000, 2),
];
return [
$id => $items,
];
}
private function curl($url)
{
if ( ! \function_exists('curl_init')) {
return (string) file_get_contents($url);
}
$ch = curl_init();
curl_setopt_array($ch, [
\CURLOPT_URL => $url,
\CURLOPT_RETURNTRANSFER => true,
]);
$res = curl_exec($ch);
curl_close($ch);
return (string) $res;
}
private function getItems()
{
$items = [];
foreach (ConfigApi::$config['APP_TEMPERATURE_SENSOR_PORTS'] as $port) {
// check curl
$res = $this->curl(ConfigApi::$config['APP_TEMPERATURE_SENSOR_URL'] . ":{$port}");
if ( ! $res) {
continue;
}
$item = json_decode($res, true);
if ( ! $item || ! \is_array($item)) {
continue;
}
$items = $item;
break;
}
return $items;
}
private function getCpuTemp()
{
try {
$path = '/sys/class/thermal/thermal_zone0/temp';
return file_exists($path) ? (int) file_get_contents($path) : 0;
} catch (Exception $e) {
return 0;
}
}
}
namespace InnStudio\Prober\Components\NetworkStats;
class NetworkStatsConstants
{
const ID = 'networkStats';
}
namespace InnStudio\Prober\Components\NetworkStats;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
use InnStudio\Prober\Components\Utils\UtilsApi;
use InnStudio\Prober\Components\Utils\UtilsNetwork;
final class NetworkStatsPoll
{
public function render()
{
$id = NetworkStatsConstants::ID;
if (UtilsApi::isWin() || UserConfigApi::isDisabled($id)) {
return [
$id => null,
];
}
return [
$id => [
'networks' => UtilsNetwork::getStats(),
'timestamp' => time(),
],
];
}
}
namespace InnStudio\Prober\Components\Script;
use InnStudio\Prober\Components\Utils\UtilsApi;
final class ScriptAction
{
public function render($action)
{
if ('script' !== $action) {
return;
}
$this->output();
}
private function output()
{
UtilsApi::setFileCacheHeader();
header('Content-type: application/javascript');
echo <<<'CODE'
(function(vl){typeof define=="function"&&define.amd?define(vl):vl()})(function(){"use strict";function vl(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}var td={exports:{}},yl={},nd={exports:{}},gl={exports:{}};gl.exports;var Mv;function K1(){return Mv||(Mv=1,function(i,l){(function(){function u(m,w){Object.defineProperty(h.prototype,m,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",w[0],w[1])}})}function s(m){return m===null||typeof m!="object"?null:(m=yi&&m[yi]||m["@@iterator"],typeof m=="function"?m:null)}function f(m,w){m=(m=m.constructor)&&(m.displayName||m.name)||"ReactClass";var $=m+"."+w;Hl[$]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",w,m),Hl[$]=!0)}function h(m,w,$){this.props=m,this.context=w,this.refs=Ll,this.updater=$||wo}function p(){}function b(m,w,$){this.props=m,this.context=w,this.refs=Ll,this.updater=$||wo}function y(m){return""+m}function z(m){try{y(m);var w=!1}catch{w=!0}if(w){w=console;var $=w.error,G=typeof Symbol=="function"&&Symbol.toStringTag&&m[Symbol.toStringTag]||m.constructor.name||"Object";return $.call(w,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",G),y(m)}}function D(m){if(m==null)return null;if(typeof m=="function")return m.$$typeof===rh?null:m.displayName||m.name||null;if(typeof m=="string")return m;switch(m){case L:return"Fragment";case ee:return"Profiler";case ae:return"StrictMode";case Ce:return"Suspense";case vi:return"SuspenseList";case Nn:return"Activity"}if(typeof m=="object")switch(typeof m.tag=="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),m.$$typeof){case De:return"Portal";case Ke:return(m.displayName||"Context")+".Provider";case Le:return(m._context.displayName||"Context")+".Consumer";case ct:var w=m.render;return m=m.displayName,m||(m=w.displayName||w.name||"",m=m!==""?"ForwardRef("+m+")":"ForwardRef"),m;case et:return w=m.displayName||null,w!==null?w:D(m.type)||"Memo";case At:w=m._payload,m=m._init;try{return D(m(w))}catch{}}return null}function x(m){if(m===L)return"<>";if(typeof m=="object"&&m!==null&&m.$$typeof===At)return"<...>";try{var w=D(m);return w?"<"+w+">":"<...>"}catch{return"<...>"}}function O(){var m=_e.A;return m===null?null:m.getOwner()}function H(){return Error("react-stack-top-frame")}function Y(m){if(gi.call(m,"key")){var w=Object.getOwnPropertyDescriptor(m,"key").get;if(w&&w.isReactWarning)return!1}return m.key!==void 0}function F(m,w){function $(){Ao||(Ao=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",w))}$.isReactWarning=!0,Object.defineProperty(m,"key",{get:$,configurable:!0})}function ne(){var m=D(this.type);return Bl[m]||(Bl[m]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),m=this.props.ref,m!==void 0?m:null}function ie(m,w,$,G,J,ge,pe,xe){return $=ge.ref,m={$$typeof:oe,type:m,key:w,props:ge,_owner:J},($!==void 0?$:null)!==null?Object.defineProperty(m,"ref",{enumerable:!1,get:ne}):Object.defineProperty(m,"ref",{enumerable:!1,value:null}),m._store={},Object.defineProperty(m._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(m,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(m,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:pe}),Object.defineProperty(m,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:xe}),Object.freeze&&(Object.freeze(m.props),Object.freeze(m)),m}function Qe(m,w){return w=ie(m.type,w,void 0,void 0,m._owner,m.props,m._debugStack,m._debugTask),m._store&&(w._store.validated=m._store.validated),w}function Pe(m){return typeof m=="object"&&m!==null&&m.$$typeof===oe}function ke(m){var w={"=":"=0",":":"=2"};return"$"+m.replace(/[=:]/g,function($){return w[$]})}function Ze(m,w){return typeof m=="object"&&m!==null&&m.key!=null?(z(m.key),ke(""+m.key)):w.toString(36)}function Fe(){}function Ne(m){switch(m.status){case"fulfilled":return m.value;case"rejected":throw m.reason;default:switch(typeof m.status=="string"?m.then(Fe,Fe):(m.status="pending",m.then(function(w){m.status==="pending"&&(m.status="fulfilled",m.value=w)},function(w){m.status==="pending"&&(m.status="rejected",m.reason=w)})),m.status){case"fulfilled":return m.value;case"rejected":throw m.reason}}throw m}function Vt(m,w,$,G,J){var ge=typeof m;(ge==="undefined"||ge==="boolean")&&(m=null);var pe=!1;if(m===null)pe=!0;else switch(ge){case"bigint":case"string":case"number":pe=!0;break;case"object":switch(m.$$typeof){case oe:case De:pe=!0;break;case At:return pe=m._init,Vt(pe(m._payload),w,$,G,J)}}if(pe){pe=m,J=J(pe);var xe=G===""?"."+Ze(pe,0):G;return xo(J)?($="",xe!=null&&($=xe.replace(Pl,"$&/")+"/"),Vt(J,w,$,"",function(_t){return _t})):J!=null&&(Pe(J)&&(J.key!=null&&(pe&&pe.key===J.key||z(J.key)),$=Qe(J,$+(J.key==null||pe&&pe.key===J.key?"":(""+J.key).replace(Pl,"$&/")+"/")+xe),G!==""&&pe!=null&&Pe(pe)&&pe.key==null&&pe._store&&!pe._store.validated&&($._store.validated=2),J=$),w.push(J)),1}if(pe=0,xe=G===""?".":G+":",xo(m))for(var me=0;me import('./MyComponent'))
Did you accidentally put curly braces around the import?`,w),"default"in w||console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
Your code should look like:
const MyComponent = lazy(() => import('./MyComponent'))`,w),w.default;throw m._result}function ue(){var m=_e.H;return m===null&&console.error(`Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
1. You might have mismatching versions of React and the renderer (such as React DOM)
2. You might be breaking the Rules of Hooks
3. You might have more than one copy of React in the same app
See https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem.`),m}function Re(){}function ut(m){if(mr===null)try{var w=("require"+Math.random()).slice(0,7);mr=(i&&i[w]).call(i,"timers").setImmediate}catch{mr=function(G){ql===!1&&(ql=!0,typeof MessageChannel>"u"&&console.error("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning."));var J=new MessageChannel;J.port1.onmessage=G,J.port2.postMessage(void 0)}}return mr(m)}function xt(m){return 1 ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"))}),{then:function(me,_t){J=!0,pe.then(function(qa){if(Nt(w,$),$===0){try{se(G),ut(function(){return q(qa,me,_t)})}catch(sh){_e.thrownErrors.push(sh)}if(0<_e.thrownErrors.length){var lh=xt(_e.thrownErrors);_e.thrownErrors.length=0,_t(lh)}}else me(qa)},function(qa){Nt(w,$),0<_e.thrownErrors.length&&(qa=xt(_e.thrownErrors),_e.thrownErrors.length=0),_t(qa)})}}}var xe=ge;if(Nt(w,$),$===0&&(se(G),G.length!==0&&zo(function(){J||ra||(ra=!0,console.error("A component suspended inside an `act` scope, but the `act` call was not awaited. When testing React components that depend on asynchronous data, you must await the result:\n\nawait act(() => ...)"))}),_e.actQueue=null),0<_e.thrownErrors.length)throw m=xt(_e.thrownErrors),_e.thrownErrors.length=0,m;return{then:function(me,_t){J=!0,$===0?(_e.actQueue=G,ut(function(){return q(xe,me,_t)})):me(xe)}}},l.cache=function(m){return function(){return m.apply(null,arguments)}},l.captureOwnerStack=function(){var m=_e.getCurrentStack;return m===null?null:m()},l.cloneElement=function(m,w,$){if(m==null)throw Error("The argument must be a React element, but you passed "+m+".");var G=ac({},m.props),J=m.key,ge=m._owner;if(w!=null){var pe;e:{if(gi.call(w,"ref")&&(pe=Object.getOwnPropertyDescriptor(w,"ref").get)&&pe.isReactWarning){pe=!1;break e}pe=w.ref!==void 0}pe&&(ge=O()),Y(w)&&(z(w.key),J=""+w.key);for(xe in w)!gi.call(w,xe)||xe==="key"||xe==="__self"||xe==="__source"||xe==="ref"&&w.ref===void 0||(G[xe]=w[xe])}var xe=arguments.length-2;if(xe===1)G.children=$;else if(1_e.recentlyCreatedOwnerStacks++;return ie(m,J,void 0,void 0,O(),G,me?Error("react-stack-top-frame"):ic,me?hr(x(m)):Vl)},l.createRef=function(){var m={current:null};return Object.seal(m),m},l.forwardRef=function(m){m!=null&&m.$$typeof===et?console.error("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."):typeof m!="function"?console.error("forwardRef requires a render function but was given %s.",m===null?"null":typeof m):m.length!==0&&m.length!==2&&console.error("forwardRef render functions accept exactly two parameters: props and ref. %s",m.length===1?"Did you forget to use the ref parameter?":"Any additional parameter will be undefined."),m!=null&&m.defaultProps!=null&&console.error("forwardRef render functions do not support defaultProps. Did you accidentally pass a React component?");var w={$$typeof:ct,render:m},$;return Object.defineProperty(w,"displayName",{enumerable:!1,configurable:!0,get:function(){return $},set:function(G){$=G,m.name||m.displayName||(Object.defineProperty(m,"name",{value:G}),m.displayName=G)}}),w},l.isValidElement=Pe,l.lazy=function(m){return{$$typeof:At,_payload:{_status:-1,_result:m},_init:at}},l.memo=function(m,w){m==null&&console.error("memo: The first argument must be a component. Instead received: %s",m===null?"null":typeof m),w={$$typeof:et,type:m,compare:w===void 0?null:w};var $;return Object.defineProperty(w,"displayName",{enumerable:!1,configurable:!0,get:function(){return $},set:function(G){$=G,m.name||m.displayName||(Object.defineProperty(m,"name",{value:G}),m.displayName=G)}}),w},l.startTransition=function(m){var w=_e.T,$={};_e.T=$,$._updatedFibers=new Set;try{var G=m(),J=_e.S;J!==null&&J($,G),typeof G=="object"&&G!==null&&typeof G.then=="function"&&G.then(Re,pr)}catch(ge){pr(ge)}finally{w===null&&$._updatedFibers&&(m=$._updatedFibers.size,$._updatedFibers.clear(),10";if(typeof L=="object"&&L!==null&&L.$$typeof===Vt)return"<...>";try{var ae=i(L);return ae?"<"+ae+">":"<...>"}catch{return"<...>"}}function f(){var L=ue.A;return L===null?null:L.getOwner()}function h(){return Error("react-stack-top-frame")}function p(L){if(Re.call(L,"key")){var ae=Object.getOwnPropertyDescriptor(L,"key").get;if(ae&&ae.isReactWarning)return!1}return L.key!==void 0}function b(L,ae){function ee(){Nt||(Nt=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",ae))}ee.isReactWarning=!0,Object.defineProperty(L,"key",{get:ee,configurable:!0})}function y(){var L=i(this.type);return q[L]||(q[L]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),L=this.props.ref,L!==void 0?L:null}function z(L,ae,ee,Le,Ke,ct,Ce,vi){return ee=ct.ref,L={$$typeof:H,type:L,key:ae,props:ct,_owner:Ke},(ee!==void 0?ee:null)!==null?Object.defineProperty(L,"ref",{enumerable:!1,get:y}):Object.defineProperty(L,"ref",{enumerable:!1,value:null}),L._store={},Object.defineProperty(L._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(L,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(L,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:Ce}),Object.defineProperty(L,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:vi}),Object.freeze&&(Object.freeze(L.props),Object.freeze(L)),L}function D(L,ae,ee,Le,Ke,ct,Ce,vi){var et=ae.children;if(et!==void 0)if(Le)if(ut(et)){for(Le=0;Le
React keys must be passed directly to JSX without using spread:
let props = %s;
<%s key={someKey} {...props} />`,Le,et,At,et),De[et+Le]=!0)}if(et=null,ee!==void 0&&(u(ee),et=""+ee),p(ae)&&(u(ae.key),et=""+ae.key),"key"in ae){ee={};for(var Nn in ae)Nn!=="key"&&(ee[Nn]=ae[Nn])}else ee=ae;return et&&b(ee,typeof L=="function"?L.displayName||L.name||"Unknown":L),z(L,et,ct,Ke,f(),ee,Ce,vi)}function x(L){typeof L=="object"&&L!==null&&L.$$typeof===H&&L._store&&(L._store.validated=1)}var O=bl(),H=Symbol.for("react.transitional.element"),Y=Symbol.for("react.portal"),F=Symbol.for("react.fragment"),ne=Symbol.for("react.strict_mode"),ie=Symbol.for("react.profiler"),Qe=Symbol.for("react.consumer"),Pe=Symbol.for("react.context"),ke=Symbol.for("react.forward_ref"),Ze=Symbol.for("react.suspense"),Fe=Symbol.for("react.suspense_list"),Ne=Symbol.for("react.memo"),Vt=Symbol.for("react.lazy"),te=Symbol.for("react.activity"),at=Symbol.for("react.client.reference"),ue=O.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,Re=Object.prototype.hasOwnProperty,ut=Array.isArray,xt=console.createTask?console.createTask:function(){return null};O={react_stack_bottom_frame:function(L){return L()}};var Nt,q={},se=O.react_stack_bottom_frame.bind(O,h)(),oe=xt(s(h)),De={};yl.Fragment=F,yl.jsx=function(L,ae,ee,Le,Ke){var ct=1e4>ue.recentlyCreatedOwnerStacks++;return D(L,ae,ee,!1,Le,Ke,ct?Error("react-stack-top-frame"):se,ct?xt(s(L)):oe)},yl.jsxs=function(L,ae,ee,Le,Ke){var ct=1e4>ue.recentlyCreatedOwnerStacks++;return D(L,ae,ee,!0,Le,Ke,ct?Error("react-stack-top-frame"):se,ct?xt(s(L)):oe)}}(),yl}var kv;function W1(){return kv||(kv=1,td.exports=J1()),td.exports}var _=W1(),ad={exports:{}},od={exports:{}},id={},Nv;function F1(){return Nv||(Nv=1,function(i){(function(){function l(){if(Ze=!1,te){var q=i.unstable_now();Re=q;var se=!0;try{e:{Pe=!1,ke&&(ke=!1,Ne(at),at=-1),Qe=!0;var oe=ie;try{t:{for(p(q),ne=s(H);ne!==null&&!(ne.expirationTime>q&&y());){var De=ne.callback;if(typeof De=="function"){ne.callback=null,ie=ne.priorityLevel;var L=De(ne.expirationTime<=q);if(q=i.unstable_now(),typeof L=="function"){ne.callback=L,p(q),se=!0;break t}ne===s(H)&&f(H),p(q)}else f(H);ne=s(H)}if(ne!==null)se=!0;else{var ae=s(Y);ae!==null&&z(b,ae.startTime-q),se=!1}}break e}finally{ne=null,ie=oe,Qe=!1}se=void 0}}finally{se?ut():te=!1}}}function u(q,se){var oe=q.length;q.push(se);e:for(;0>>1,L=q[De];if(0>>1;Deh(Le,oe))Keh(ct,Le)?(q[De]=ct,q[Ke]=oe,De=Ke):(q[De]=Le,q[ee]=oe,De=ee);else if(Keh(ct,oe))q[De]=ct,q[Ke]=oe,De=Ke;else break e}}return se}function h(q,se){var oe=q.sortIndex-se.sortIndex;return oe!==0?oe:q.id-se.id}function p(q){for(var se=s(Y);se!==null;){if(se.callback===null)f(Y);else if(se.startTime<=q)f(Y),se.sortIndex=se.expirationTime,u(H,se);else break;se=s(Y)}}function b(q){if(ke=!1,p(q),!Pe)if(s(H)!==null)Pe=!0,te||(te=!0,ut());else{var se=s(Y);se!==null&&z(b,se.startTime-q)}}function y(){return Ze?!0:!(i.unstable_now()-Req||125De?(q.sortIndex=oe,u(Y,q),s(H)===null&&q===s(Y)&&(ke?(Ne(at),at=-1):ke=!0,z(b,oe-De))):(q.sortIndex=L,u(H,q),Pe||Qe||(Pe=!0,te||(te=!0,ut()))),q},i.unstable_shouldYield=y,i.unstable_wrapCallback=function(q){var se=ie;return function(){var oe=ie;ie=se;try{return q.apply(this,arguments)}finally{ie=oe}}},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())})()}(id)),id}var Hv;function eO(){return Hv||(Hv=1,od.exports=F1()),od.exports}var rd={exports:{}},kt={},Lv;function tO(){if(Lv)return kt;Lv=1;return function(){function i(){}function l(x){return""+x}function u(x,O,H){var Y=3` tag.%s',H),typeof x=="string"&&typeof O=="object"&&O!==null&&typeof O.as=="string"){H=O.as;var Y=s(H,O.crossOrigin);y.d.L(x,H,{crossOrigin:Y,integrity:typeof O.integrity=="string"?O.integrity:void 0,nonce:typeof O.nonce=="string"?O.nonce:void 0,type:typeof O.type=="string"?O.type:void 0,fetchPriority:typeof O.fetchPriority=="string"?O.fetchPriority:void 0,referrerPolicy:typeof O.referrerPolicy=="string"?O.referrerPolicy:void 0,imageSrcSet:typeof O.imageSrcSet=="string"?O.imageSrcSet:void 0,imageSizes:typeof O.imageSizes=="string"?O.imageSizes:void 0,media:typeof O.media=="string"?O.media:void 0})}},kt.preloadModule=function(x,O){var H="";typeof x=="string"&&x||(H+=" The `href` argument encountered was "+f(x)+"."),O!==void 0&&typeof O!="object"?H+=" The `options` argument encountered was "+f(O)+".":O&&"as"in O&&typeof O.as!="string"&&(H+=" The `as` option encountered was "+f(O.as)+"."),H&&console.error('ReactDOM.preloadModule(): Expected two arguments, a non-empty `href` string and, optionally, an `options` object with an `as` property valid for a `` tag.%s',H),typeof x=="string"&&(O?(H=s(O.as,O.crossOrigin),y.d.m(x,{as:typeof O.as=="string"&&O.as!=="script"?O.as:void 0,crossOrigin:H,integrity:typeof O.integrity=="string"?O.integrity:void 0})):y.d.m(x))},kt.requestFormReset=function(x){y.d.r(x)},kt.unstable_batchedUpdates=function(x,O){return x(O)},kt.useFormState=function(x,O,H){return p().useFormState(x,O,H)},kt.useFormStatus=function(){return p().useHostTransitionStatus()},kt.version="19.1.1",typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())}(),kt}var Bv;function Vv(){return Bv||(Bv=1,rd.exports=tO()),rd.exports}var _l={},$v;function nO(){if($v)return _l;$v=1;return function(){function i(e,t){for(e=e.memoizedState;e!==null&&0=t.length)return a;var o=t[n],r=Ct(e)?e.slice():be({},e);return r[o]=l(e[o],t,n+1,a),r}function u(e,t,n){if(t.length!==n.length)console.warn("copyWithRename() expects paths of the same length");else{for(var a=0;aFa?console.error("Unexpected pop."):(t!==ym[Fa]&&console.error("Unexpected Fiber popped."),e.current=vm[Fa],vm[Fa]=null,ym[Fa]=null,Fa--)}function Re(e,t,n){Fa++,vm[Fa]=e.current,ym[Fa]=n,e.current=t}function ut(e){return e===null&&console.error("Expected host context to exist. This error is likely caused by a bug in React. Please file an issue."),e}function xt(e,t){Re($o,t,e),Re(ws,e,e),Re(Vo,null,e);var n=t.nodeType;switch(n){case 9:case 11:n=n===9?"#document":"#fragment",t=(t=t.documentElement)&&(t=t.namespaceURI)?X_(t):fo;break;default:if(n=t.tagName,t=t.namespaceURI)t=X_(t),t=I_(t,n);else switch(n){case"svg":t=pl;break;case"math":t=Qf;break;default:t=fo}}n=n.toLowerCase(),n=nb(null,n),n={context:t,ancestorInfo:n},ue(Vo,e),Re(Vo,n,e)}function Nt(e){ue(Vo,e),ue(ws,e),ue($o,e)}function q(){return ut(Vo.current)}function se(e){e.memoizedState!==null&&Re(uf,e,e);var t=ut(Vo.current),n=e.type,a=I_(t.context,n);n=nb(t.ancestorInfo,n),a={context:a,ancestorInfo:n},t!==a&&(Re(ws,e,e),Re(Vo,a,e))}function oe(e){ws.current===e&&(ue(Vo,e),ue(ws,e)),uf.current===e&&(ue(uf,e),uu._currentValue=er)}function De(e){return typeof Symbol=="function"&&Symbol.toStringTag&&e[Symbol.toStringTag]||e.constructor.name||"Object"}function L(e){try{return ae(e),!1}catch{return!0}}function ae(e){return""+e}function ee(e,t){if(L(e))return console.error("The provided `%s` attribute is an unsupported type %s. This value must be coerced to a string before using it here.",t,De(e)),ae(e)}function Le(e,t){if(L(e))return console.error("The provided `%s` CSS property is an unsupported type %s. This value must be coerced to a string before using it here.",t,De(e)),ae(e)}function Ke(e){if(L(e))return console.error("Form field values (value, checked, defaultValue, or defaultChecked props) must be strings, not %s. This value must be coerced to a string before using it here.",De(e)),ae(e)}function ct(e){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")return!1;var t=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(t.isDisabled)return!0;if(!t.supportsFiber)return console.error("The installed version of React DevTools is too old and will not work with the current version of React. Please update React DevTools. https://react.dev/link/react-devtools"),!0;try{kr=t.inject(e),Ht=t}catch(n){console.error("React instrumentation encountered an error: %s.",n)}return!!t.checkDCE}function Ce(e){if(typeof Kz=="function"&&Jz(e),Ht&&typeof Ht.setStrictMode=="function")try{Ht.setStrictMode(kr,e)}catch(t){za||(za=!0,console.error("React instrumentation encountered an error: %s",t))}}function vi(e){X=e}function et(){X!==null&&typeof X.markCommitStopped=="function"&&X.markCommitStopped()}function At(e){X!==null&&typeof X.markComponentRenderStarted=="function"&&X.markComponentRenderStarted(e)}function Nn(){X!==null&&typeof X.markComponentRenderStopped=="function"&&X.markComponentRenderStopped()}function yi(e){X!==null&&typeof X.markRenderStarted=="function"&&X.markRenderStarted(e)}function Hl(){X!==null&&typeof X.markRenderStopped=="function"&&X.markRenderStopped()}function wo(e,t){X!==null&&typeof X.markStateUpdateScheduled=="function"&&X.markStateUpdateScheduled(e,t)}function ac(e){return e>>>=0,e===0?32:31-(Wz(e)/Fz|0)|0}function Ll(e){if(e&1)return"SyncHydrationLane";if(e&2)return"Sync";if(e&4)return"InputContinuousHydration";if(e&8)return"InputContinuous";if(e&16)return"DefaultHydration";if(e&32)return"Default";if(e&128)return"TransitionHydration";if(e&4194048)return"Transition";if(e&62914560)return"Retry";if(e&67108864)return"SelectiveHydration";if(e&134217728)return"IdleHydration";if(e&268435456)return"Idle";if(e&536870912)return"Offscreen";if(e&1073741824)return"Deferred"}function ft(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return console.error("Should have found matching lanes. This is a bug in React."),e}}function Pa(e,t,n){var a=e.pendingLanes;if(a===0)return 0;var o=0,r=e.suspendedLanes,c=e.pingedLanes;e=e.warmLanes;var d=a&134217727;return d!==0?(a=d&~r,a!==0?o=ft(a):(c&=d,c!==0?o=ft(c):n||(n=d&~e,n!==0&&(o=ft(n))))):(d=a&~r,d!==0?o=ft(d):c!==0?o=ft(c):n||(n=a&~e,n!==0&&(o=ft(n)))),o===0?0:t!==0&&t!==o&&(t&r)===0&&(r=o&-o,n=t&-t,r>=n||r===32&&(n&4194048)!==0)?t:o}function xo(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function rh(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return console.error("Should have found matching lanes. This is a bug in React."),-1}}function _e(){var e=cf;return cf<<=1,(cf&4194048)===0&&(cf=256),e}function gi(){var e=ff;return ff<<=1,(ff&62914560)===0&&(ff=4194304),e}function hr(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Ao(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function oc(e,t,n,a,o,r){var c=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var d=e.entanglements,v=e.expirationTimes,g=e.hiddenUpdates;for(n=c&~n;0As&&console.error("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}function Hn(e){if(Em===void 0)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);Em=t&&t[1]||"",DS=-1)":-1c||g[r]!==R[c]){var j=`
`+g[r].replace(" at new "," at ");return e.displayName&&j.includes("")&&(j=j.replace("",e.displayName)),typeof e=="function"&&xm.set(e,j),j}while(1<=r&&0<=c);break}}}finally{wm=!1,M.H=a,sh(),Error.prepareStackTrace=n}return g=(g=e?e.displayName||e.name:"")?Hn(g):"",typeof e=="function"&&xm.set(e,g),g}function Bg(e){var t=Error.prepareStackTrace;if(Error.prepareStackTrace=void 0,e=e.stack,Error.prepareStackTrace=t,e.startsWith(`Error: react-stack-top-frame
`)&&(e=e.slice(29)),t=e.indexOf(`
`),t!==-1&&(e=e.slice(t+1)),t=e.indexOf("react_stack_bottom_frame"),t!==-1&&(t=e.lastIndexOf(`
`,t)),t!==-1)e=e.slice(0,t);else return"";return e}function rR(e){switch(e.tag){case 26:case 27:case 5:return Hn(e.type);case 16:return Hn("Lazy");case 13:return Hn("Suspense");case 19:return Hn("SuspenseList");case 0:case 15:return uh(e.type,!1);case 11:return uh(e.type.render,!1);case 1:return uh(e.type,!0);case 31:return Hn("Activity");default:return""}}function Vg(e){try{var t="";do{t+=rR(e);var n=e._debugInfo;if(n)for(var a=n.length-1;0<=a;a--){var o=n[a];if(typeof o.name=="string"){var r=t,c=o.env,d=Hn(o.name+(c?" ["+c+"]":""));t=r+d}}e=e.return}while(e);return t}catch(v){return`
Error generating stack: `+v.message+`
`+v.stack}}function $g(e){return(e=e?e.displayName||e.name:"")?Hn(e):""}function rc(){if(Tn===null)return null;var e=Tn._debugOwner;return e!=null?Vt(e):null}function lR(){if(Tn===null)return"";var e=Tn;try{var t="";switch(e.tag===6&&(e=e.return),e.tag){case 26:case 27:case 5:t+=Hn(e.type);break;case 13:t+=Hn("Suspense");break;case 19:t+=Hn("SuspenseList");break;case 31:t+=Hn("Activity");break;case 30:case 0:case 15:case 1:e._debugOwner||t!==""||(t+=$g(e.type));break;case 11:e._debugOwner||t!==""||(t+=$g(e.type.render))}for(;e;)if(typeof e.tag=="number"){var n=e;e=n._debugOwner;var a=n._debugStack;e&&a&&(typeof a!="string"&&(n._debugStack=a=Bg(a)),a!==""&&(t+=`
`+a))}else if(e.debugStack!=null){var o=e.debugStack;(e=e.owner)&&o&&(t+=`
`+Bg(o))}else break;var r=t}catch(c){r=`
Error generating stack: `+c.message+`
`+c.stack}return r}function W(e,t,n,a,o,r,c){var d=Tn;ch(e);try{return e!==null&&e._debugTask?e._debugTask.run(t.bind(null,n,a,o,r,c)):t(n,a,o,r,c)}finally{ch(d)}throw Error("runWithFiberInDEV should never be called in production. This is a bug in React.")}function ch(e){M.getCurrentStack=e===null?null:lR,Ca=!1,Tn=e}function Ln(e){switch(typeof e){case"bigint":case"boolean":case"number":case"string":case"undefined":return e;case"object":return Ke(e),e;default:return""}}function Pg(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function sR(e){var t=Pg(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t);Ke(e[t]);var a=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var o=n.get,r=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(c){Ke(c),a=""+c,r.call(this,c)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return a},setValue:function(c){Ke(c),a=""+c},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function lc(e){e._valueTracker||(e._valueTracker=sR(e))}function qg(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),a="";return e&&(a=Pg(e)?e.checked?"true":"false":e.value),e=a,e!==n?(t.setValue(e),!0):!1}function sc(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Bn(e){return e.replace(oD,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function Gg(e,t){t.checked===void 0||t.defaultChecked===void 0||MS||(console.error("%s contains an input of type %s with both checked and defaultChecked props. Input elements must be either controlled or uncontrolled (specify either the checked prop, or the defaultChecked prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components",rc()||"A component",t.type),MS=!0),t.value===void 0||t.defaultValue===void 0||CS||(console.error("%s contains an input of type %s with both value and defaultValue props. Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components",rc()||"A component",t.type),CS=!0)}function fh(e,t,n,a,o,r,c,d){e.name="",c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"?(ee(c,"type"),e.type=c):e.removeAttribute("type"),t!=null?c==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+Ln(t)):e.value!==""+Ln(t)&&(e.value=""+Ln(t)):c!=="submit"&&c!=="reset"||e.removeAttribute("value"),t!=null?dh(e,c,Ln(t)):n!=null?dh(e,c,Ln(n)):a!=null&&e.removeAttribute("value"),o==null&&r!=null&&(e.defaultChecked=!!r),o!=null&&(e.checked=o&&typeof o!="function"&&typeof o!="symbol"),d!=null&&typeof d!="function"&&typeof d!="symbol"&&typeof d!="boolean"?(ee(d,"name"),e.name=""+Ln(d)):e.removeAttribute("name")}function Yg(e,t,n,a,o,r,c,d){if(r!=null&&typeof r!="function"&&typeof r!="symbol"&&typeof r!="boolean"&&(ee(r,"type"),e.type=r),t!=null||n!=null){if(!(r!=="submit"&&r!=="reset"||t!=null))return;n=n!=null?""+Ln(n):"",t=t!=null?""+Ln(t):n,d||t===e.value||(e.value=t),e.defaultValue=t}a=a??o,a=typeof a!="function"&&typeof a!="symbol"&&!!a,e.checked=d?e.checked:!!a,e.defaultChecked=!!a,c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"&&(ee(c,"name"),e.name=c)}function dh(e,t,n){t==="number"&&sc(e.ownerDocument)===e||e.defaultValue===""+n||(e.defaultValue=""+n)}function Xg(e,t){t.value==null&&(typeof t.children=="object"&&t.children!==null?cm.Children.forEach(t.children,function(n){n==null||typeof n=="string"||typeof n=="number"||typeof n=="bigint"||US||(US=!0,console.error("Cannot infer the option value of complex children. Pass a `value` prop or use a plain string as children to