### Install Tracy via Composer Source: https://github.com/nette/tracy/blob/master/readme.md Use Composer to install the Tracy library. This is the recommended installation method. ```shell composer require tracy/tracy ``` -------------------------------- ### Install Dependencies for Latte Convert Source: https://github.com/nette/tracy/blob/master/tools/latte-convert/readme.md Run this command once to set up the necessary dependencies for the latte-convert tool. ```bash cd tools/latte-convert && composer install ``` -------------------------------- ### Start and Measure Time with Debugger Stopwatch Source: https://github.com/nette/tracy/blob/master/readme.md Use `Debugger::timer()` to start and measure elapsed time with microsecond precision. Call it without parameters to start a default timer, or with a name for multiple measurements. ```php Debugger::timer(); // sweet dreams my cherrie sleep(2); $elapsed = Debugger::timer(); // $elapsed = 2 ``` -------------------------------- ### Complex Session Initialization with Tracy Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Initialize Tracy with a custom session setup, ensuring to dispatch Tracy after session_start(). ```php Debugger::setSessionStorage(new Tracy\NativeSession); Debugger::enable(); // Custom session initialization session_start(); Debugger::dispatch(); // Inform Tracy session is ready ``` -------------------------------- ### Generate CSP Nonce and Set Header Source: https://github.com/nette/tracy/blob/master/readme.md Example of generating a nonce and setting the Content Security Policy header in pure PHP. This is necessary for Tracy to function correctly with CSP enabled. ```php $nonce = base64_encode(random_bytes(20)); header("Content-Security-Policy: script-src 'nonce-$nonce' 'strict-dynamic';"); ``` -------------------------------- ### PHP Uncaught Exception Example Source: https://github.com/nette/tracy/blob/master/readme.md This is an example of how PHP displays an uncaught exception in the source code, which Tracy visualizes more effectively. ```text Fatal error: Uncaught Nette\MemberAccessException: Call to undefined method Nette\Application\UI\Form::addTest()? in /sandbox/vendor/nette/utils/src/Utils/ObjectMixin.php:100 Stack trace: #0 /sandbox/vendor/nette/utils/src/Utils/Object.php(75): Nette\Utils\ObjectMixin::call(Object(Nette\Application\UI\Form), 'addTest', Array) #1 /sandbox/app/forms/SignFormFactory.php(32): Nette\Object->__call('addTest', Array) #2 /sandbox/app/presenters/SignPresenter.php(21): App\Forms\SignFormFactory->create() #3 /sandbox/vendor/nette/component-model/src/ComponentModel/Container.php(181): App\Presenters\SignPresenter->createComponentSignInForm('signInForm') #4 /sandbox/vendor/nette/component-model/src/ComponentModel/Container.php(139): Nette\ComponentModel\Container->createComponent('signInForm') #5 /sandbox/temp/cache/latte/15206b353f351f6bfca2c36cc.php(17): Nette\ComponentModel\Co in /sandbox/vendor/nette/utils/src/Utils/ObjectMixin.php on line 100
``` -------------------------------- ### Enable Tracy Debugger Source: https://github.com/nette/tracy/blob/master/readme.md Enable Tracy by calling Tracy\Debugger::enable() at the beginning of your script. Ensure output has not yet started. Include Composer's autoloader or tracy.phar. ```php use Tracy\Debugger; require 'vendor/autoload.php'; // alternatively tracy.phar Debugger::enable(); ``` -------------------------------- ### Implement Custom Tracy Logger Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Create a custom logger by implementing the Tracy\ILogger interface. The log method handles incoming log messages. This example shows sending logs to external services like Slack or Sentry. ```php class SlackLogger implements Tracy\ILogger { public function log($value, $priority = self::INFO) { // Send to Slack, Sentry, etc. } } Tracy\Debugger::setLogger(new SlackLogger); ``` -------------------------------- ### PHP Parse Error Example Source: https://github.com/nette/tracy/blob/master/readme.md This is an example of how PHP displays a parse error in the source code, which Tracy visualizes more effectively. ```text Parse error: syntax error, unexpected '}' in HomepagePresenter.php on line 15 ``` -------------------------------- ### Run Single Test File Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Execute a specific test file. Ensure to use the -p php-cgi flag for compatibility. ```bash vendor/bin/tester tests/Tracy/Debugger.timer().phpt -p php-cgi -s ``` -------------------------------- ### Run All Tests with PHP-CGI Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Execute all tests using the php-cgi executable. This is the recommended method for running HTML tests. ```bash vendor/bin/tester tests -p php-cgi -s ``` -------------------------------- ### Run Latte Convert Tests Source: https://github.com/nette/tracy/blob/master/tools/latte-convert/readme.md Execute the test suite for the latte-convert tool. ```bash cd tools/latte-convert && vendor/bin/tester tests ``` -------------------------------- ### Compile All Tracy Templates Source: https://github.com/nette/tracy/blob/master/tools/latte-convert/readme.md Execute this composer script to compile all .latte templates used by Tracy. ```bash composer compile-templates ``` -------------------------------- ### Integrate Monolog with Tracy Source: https://github.com/nette/tracy/blob/master/readme.md Use the `PsrToTracyLoggerAdapter` to integrate Monolog with Tracy. This allows using Monolog's logging capabilities within Tracy. ```php $monolog = new Monolog\Logger('main-channel'); $monolog->pushHandler(new Monolog\Handler\StreamHandler($logFilePath, Monolog\Logger::DEBUG)); $tracyLogger = new Tracy\Bridges\Psr\PsrToTracyLoggerAdapter($monolog); Debugger::setLogger($tracyLogger); Debugger::enable(); Debugger::log('info'); // writes: [] main-channel.INFO: info [] [] Debugger::log('warning', Debugger::WARNING); // writes: [] main-channel.WARNING: warning [] [] ``` -------------------------------- ### Configure Native PHP Session Storage Source: https://github.com/nette/tracy/blob/master/readme.md Use this to configure Tracy to use the native PHP session. This is useful for AJAX requests and redirects. Ensure `session_start()` is called before enabling Tracy. ```php session_start(); Debugger::setSessionStorage(new Tracy\NativeSession); Debugger::enable(); ``` ```php Debugger::setSessionStorage(new Tracy\NativeSession); Debugger::enable(); // followed by session initialization // and start the session session_start(); Debugger::dispatch(); ``` -------------------------------- ### PHP Unit Test Structure Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Demonstrates the basic structure for writing tests using Nette Tester. Ensure to include the bootstrap file and use the test() helper function. ```php ' and 'strict-dynamic' to script-src for Tracy. For style-src, 'unsafe-inline' may be required if nonce is not supported, but avoid in production. ```neon http: csp: script-src: [nonce, strict-dynamic] ``` -------------------------------- ### Dump and Exit with `dumpe()` and `bdump()` Source: https://github.com/nette/tracy/blob/master/readme.md Use `dumpe()` for dumping variables and exiting, or `bdump()` to display dumps in the Tracy Bar with an optional title. This keeps output clean and organized. ```php bdump([2, 4, 6, 8], 'even numbers up to ten'); bdump([1, 3, 5, 7, 9], 'odd numbers up to ten'); ``` -------------------------------- ### Use Native PHP Session with Tracy Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Configure Tracy to use the native PHP session handler. ```php session_start(); Debugger::setSessionStorage(new Tracy\NativeSession); Debugger::enable(); ``` -------------------------------- ### Editor Path Mapping for Remote/Docker Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Configure editor path mapping in Tracy to correctly open files from remote or Docker environments in your local IDE. ```php Debugger::$editorMapping = [ '/var/www/html' => 'W:\\Projects\\myapp', // Docker to Windows '/app' => '/Users/dev/projects/myapp', // Container to macOS ]; ``` -------------------------------- ### Implement Custom Tracy Logger Source: https://github.com/nette/tracy/blob/master/readme.md Create a custom logger by implementing the `Tracy\ILogger` interface. This allows custom handling of errors, exceptions, and logs. ```php use Tracy\ILogger; class SlackLogger implements ILogger { public function log($value, $priority = ILogger::INFO) { // sends a request to Slack } } ``` -------------------------------- ### Enable Tracy Development Mode with IP and Cookie Source: https://github.com/nette/tracy/blob/master/readme.md Combine IP address restriction with a secret cookie token to enable development mode. This provides an extra layer of security for accessing debugging features. ```php Debugger::enable('secret1234@23.75.345.200'); ``` -------------------------------- ### Nette Framework Tracy Configuration (Neon) Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Configure Tracy settings within a Nette Framework application using a Neon configuration file. This includes logging, dumper, and other general settings, as well as custom panels and BlueScreen extensions. ```neon tracy: # Logging email: dev@example.com fromEmail: robot@example.com emailSnooze: 2 days logSeverity: [E_WARNING, E_NOTICE] # Dumper maxLength: 150 maxDepth: 15 keysToHide: [password, pass, secret] dumpTheme: dark showLocation: true # Other strictMode: true scream: false editor: 'editor://open/?file=%file&line=%line' showBar: true # Custom panels bar: - MyPanel(@MyService) - Nette\Bridges\DITracy\ContainerPanel # BlueScreen extensions blueScreen: - DoctrinePanel::renderException editorMapping: /var/www/html: /local/path ``` -------------------------------- ### Compile a Single Latte File Source: https://github.com/nette/tracy/blob/master/tools/latte-convert/readme.md Use this command to compile a specific .latte file. The output file will be automatically named and placed in a sibling 'dist/' directory. ```bash php tools/latte-convert/compile.php src/Tracy/Bar/assets/bar.latte ``` -------------------------------- ### Configure Tracy Dump Theme Source: https://github.com/nette/tracy/blob/master/readme.md Change the default light theme to dark for variable dumps. This setting affects the visual appearance of the dumped output. ```php Debugger::$dumpTheme = 'dark'; ``` -------------------------------- ### Customize Tracy Dump Settings Source: https://github.com/nette/tracy/blob/master/readme.md Adjust the maximum nesting depth and displayed string length for variable dumps to optimize rendering speed. Lower values improve performance. ```php Debugger::$maxDepth = 2; // default: 3 Debugger::$maxLength = 50; // default: 150 Debugger::$dumpTheme = 'dark'; // default: light ``` -------------------------------- ### Nginx Configuration for Tracy Source: https://github.com/nette/tracy/blob/master/readme.md If Tracy is not working with nginx, ensure your try_files directive is correctly configured to pass arguments to index.php. This is a common misconfiguration issue. ```nginx try_files $uri $uri/ /index.php$is_args$args; ``` -------------------------------- ### Implement Custom Tracy Bar Panel Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Implement the Tracy\IBarPanel interface to create custom panels for the Tracy Debug Bar. The getTab method defines the tab's HTML, and getPanel defines the content displayed when the tab is clicked. Register the panel using Debugger::getBar()->addPanel(). ```php class MyPanel implements Tracy\IBarPanel { public function getTab(): string { // Tab HTML (small label on Bar) return << ... My Panel HTML; } public function getPanel(): string { // Panel HTML (popup content) return <<My Panel Title
InfoValue
HTML; } } // Register Tracy\Debugger::getBar()->addPanel(new MyPanel); ``` -------------------------------- ### Testing Exceptions in PHP Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Shows how to assert that a specific exception is thrown with a message containing placeholders. Use Assert::exception for this purpose. ```php Assert::exception( fn() => $object->method(), ExpectedException::class, 'Expected message with %a% placeholders', ); ``` -------------------------------- ### Configure Tracy Log Directory Source: https://github.com/nette/tracy/blob/master/readme.md Set the absolute path to the directory where Tracy should store log files. This is essential for error logging in production mode. ```php Debugger::$logDirectory = __DIR__ . '/log'; ``` -------------------------------- ### Configure TextMate Editor Integration Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Set the Tracy editor variable to use TextMate for opening files directly from error pages. ```php // TextMate Tracy\Debugger::$editor = 'txmt://open/?url=file://%file&line=%line'; ``` -------------------------------- ### PHP Method Signature with Return Type Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Illustrates the Nette Coding Standard for PHP, emphasizing strict types, tab indentation, and the placement of return types and opening braces. ```php public function example( string $param, array $options, ): ReturnType { // method body } ``` -------------------------------- ### Show Location Information in Dumps Source: https://github.com/nette/tracy/blob/master/readme.md Configure `Debugger::$showLocation` to display additional information about where the `dump()` function was called. Options include source file path, link to the file, and class definition path. ```php Debugger::$showLocation = Tracy\Dumper::LOCATION_SOURCE; // Shows path to where the dump() was called Debugger::$showLocation = Tracy\Dumper::LOCATION_CLASS | Tracy\Dumper::LOCATION_LINK; // Shows both paths to the classes and link to where the dump() was called Debugger::$showLocation = false; // Hides additional location information Debugger::$showLocation = true; // Shows all additional location information ``` -------------------------------- ### Render Tracy Loader Early Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Render the Tracy loader early in the HTML head to prevent slow scripts from delaying Tracy loading. ```html Page Title ``` -------------------------------- ### Compile Latte Files Recursively in a Directory Source: https://github.com/nette/tracy/blob/master/tools/latte-convert/readme.md Compile all .latte files within a specified directory and its subdirectories. ```bash php tools/latte-convert/compile.php src/Tracy ``` -------------------------------- ### Render Tracy Loader in HTML Source: https://github.com/nette/tracy/blob/master/readme.md Place this before any scripts in your HTML template to prevent slow scripts from delaying Tracy's loading. Ensure Tracy is enabled in your PHP configuration. ```html ... ``` -------------------------------- ### Run PHPStan Static Analysis Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Perform static analysis on the codebase using PHPStan at level 7. This command is executed via Composer scripts. ```bash composer run phpstan ``` -------------------------------- ### Enable Tracy in Development Mode Source: https://github.com/nette/tracy/blob/master/readme.md To test Tracy's functionality, explicitly enable it in development mode. Tracy is hidden by default in production for security. ```php Debugger::enable(Debugger::Development); ``` -------------------------------- ### Tracy Dumper Configuration Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Adjust settings for Tracy's variable dumper, including maximum string length, nesting depth, keys to hide, dump theme, and whether to show the call location. ```php Debugger::$maxLength = 150; // maximum string length in dumps Debugger::$maxDepth = 15; // maximum nesting depth Debugger::$keysToHide = ['password', 'secret', 'token']; // hide sensitive keys Debugger::$dumpTheme = 'dark'; // 'light' or 'dark' Debugger::$showLocation = true; // show dump() call location ``` -------------------------------- ### Integrate Monolog with Tracy Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Adapt a Monolog logger to work with Tracy using the PsrToTracyLoggerAdapter. This allows using Monolog's handlers and features within the Tracy debugging environment. Ensure Monolog and its handlers are properly configured. ```php $monolog = new Monolog\Logger('main-channel'); $monolog->pushHandler(new Monolog\Handler\StreamHandler($logFilePath)); $tracyLogger = new Tracy\Bridges\Psr\PsrToTracyLoggerAdapter($monolog); Debugger::setLogger($tracyLogger); ``` -------------------------------- ### Tracy General Configuration Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Configure Tracy's strict mode, error display for silenced errors, editor link format, custom error pages, and whether to show the Tracy Bar. Editor mapping can be set for remote environments. ```php Debugger::$strictMode = true; // display notices/warnings as BlueScreen Debugger::$scream = true; // display silenced (@) errors Debugger::$editor = 'editor://open/?file=%file&line=%line'; // editor link format Debugger::$errorTemplate = 'path/to/500.phtml'; // custom error 500 page Debugger::$showBar = true; // show Tracy Bar // Editor path mapping (e.g., for Docker/remote servers) Debugger::$editorMapping = [ '/var/www/html' => '/local/project/path', '/home/web' => '/Users/dev/projects', ]; ``` -------------------------------- ### Activate Custom Tracy Logger Source: https://github.com/nette/tracy/blob/master/readme.md Set your custom logger instance using `Tracy\Debugger::setLogger()`. For Nette Framework applications, this can be configured in the NEON configuration file. ```php Tracy\Debugger::setLogger(new SlackLogger); ``` ```neon services: tracy.logger: SlackLogger ``` -------------------------------- ### Enable Tracy Debugger Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Enable Tracy's debugging capabilities. The enable() method can be called without arguments for auto-detection, with a specific mode (e.g., Tracy\Debugger::Development), or with IP addresses and a cookie for access control. ```php Tracy\Debugger::enable(); // Auto-detect mode Tracy\Debugger::enable(Tracy\Debugger::Development); // Force mode Tracy\Debugger::enable('secret@123.45.67.89'); // IP + cookie ``` -------------------------------- ### Tracy Logger Configuration Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Configure email notifications, sender details, snooze intervals, and log severity levels for Tracy's logger. Ensure the email addresses and snooze interval are correctly set. ```php $logger = Debugger::getLogger(); // Email notifications $logger->email = 'dev@example.com'; // (string|string[]) email(s) for error notifications $logger->fromEmail = 'me@example.com'; // (string) sender email $logger->mailer = /* callable */; // custom email sender, defaults to mail() $logger->emailSnooze = '2 days'; // minimum interval for sending emails // Log severity - which error levels are logged with HTML report Debugger::$logSeverity = E_WARNING | E_NOTICE; ``` -------------------------------- ### Correct nginx try_files Directive Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Ensure the nginx 'try_files' directive is correctly configured to handle requests properly, especially when using index.php. ```nginx # Correct try_files $uri $uri/ /index.php$is_args$args; ``` -------------------------------- ### Add Custom BlueScreen Extension Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Extend Tracy's BlueScreen error pages by adding custom sections. The addPanel method accepts a closure that returns an array with 'tab' and 'panel' keys for the content. The 'bottom' key can be set to true to render the panel at the very bottom. ```php Tracy\Debugger::getBlueScreen()->addPanel(function (?Throwable $e) { // Called twice: first with exception, then with null // First call renders at top, second call below call stack return [ 'tab' => 'Database Queries', 'panel' => '

Queries

' . implode("\n", $queries) . '
', 'bottom' => true, // render at very bottom ]; }); ``` -------------------------------- ### Configure PhpStorm Editor Integration Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Set the Tracy editor variable to use PhpStorm for opening files directly from error pages. ```php // PhpStorm Tracy\Debugger::$editor = 'phpstorm://open?file=%file&line=%line'; ``` -------------------------------- ### Run Tests in Specific Directory Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Execute all tests located within a specified directory. The -s flag is used for running tests. ```bash vendor/bin/tester tests/Dumper/ -s ``` -------------------------------- ### Set Tracy Development/Production Mode Directly Source: https://github.com/nette/tracy/blob/master/readme.md Explicitly set Tracy to development or production mode using predefined constants. This overrides automatic environment detection. ```php Debugger::enable(Debugger::Development); ``` ```php Debugger::enable(Debugger::Production); ``` -------------------------------- ### Dump Variables with Tracy Source: https://github.com/nette/tracy/blob/master/readme.md Use the `dump()` function to display variable contents with HTML formatting. Replace `var_dump` for better output. The `Debugger::dump()` alternative is also available. ```php $arr = [10, 20.2, true, null, 'hello']; dump($arr); // or Debugger::dump($arr); ``` -------------------------------- ### Measure Multiple Time Intervals Source: https://github.com/nette/tracy/blob/master/readme.md Achieve multiple measurements simultaneously by providing an optional parameter to `Debugger::timer()`. This allows tracking different code sections independently. ```php Debugger::timer('page-generating'); // some code Debugger::timer('rss-generating'); // some code $rssElapsed = Debugger::timer('rss-generating'); $pageElapsed = Debugger::timer('page-generating'); ``` -------------------------------- ### Configure VS Code Editor Integration Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Set the Tracy editor variable to use VS Code for opening files directly from error pages. ```php // VS Code Tracy\Debugger::$editor = 'vscode://file/%file:%line'; ``` -------------------------------- ### Manual AJAX Monitoring with Fetch API Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Manually monitor AJAX requests using the fetch API by including specific headers. ```javascript fetch(url, { headers: { 'X-Requested-With': 'XMLHttpRequest', 'X-Tracy-Ajax': Tracy.getAjaxHeader(), } }) ``` -------------------------------- ### Lint JavaScript Assets Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Check JavaScript files for style and quality issues. The 'lint:fix' command attempts to automatically correct them. ```bash npm run lint ``` ```bash npm run lint:fix ``` -------------------------------- ### Log Custom Messages and Exceptions with Tracy Source: https://github.com/nette/tracy/blob/master/readme.md Use `Debugger::log()` to record custom text messages or caught exceptions to the log. Optionally, specify the error level and trigger an email notification. ```php Debugger::log('Unexpected error'); // text message ``` ```php try { criticalOperation(); } catch (Exception $e) { Debugger::log($e); // log exception // or Debugger::log($e, Debugger::ERROR); // also sends an email notification } ``` -------------------------------- ### Configure Error Reporting Level in Tracy Source: https://github.com/nette/tracy/blob/master/readme.md Set the strict mode to control which errors are displayed. Use `true` to display all errors, or a bitmask to exclude specific error types like deprecation notices. ```php Debugger::$strictMode = true; // display all errors Debugger::$strictMode = E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED; // all errors except deprecated notices ``` -------------------------------- ### Define Custom Scrubber for Sensitive Data Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Prevent sensitive data like passwords or tokens from being dumped by Tracy. Define a scrubber callback function that returns true if the key-value pair should be hidden. Assign this callback to Debugger::getBlueScreen()->scrubber. ```php // Prevent dumping password values $scrubber = function(string $key, $value, ?string $class): bool { return preg_match('#password|secret|token#i', $key) && $value !== null; }; Tracy\Debugger::getBlueScreen()->scrubber = $scrubber; ``` -------------------------------- ### Configure Tracy Email Notifications Source: https://github.com/nette/tracy/blob/master/readme.md Specify the email address to which Tracy should send notifications for new error records. This ensures prompt awareness of issues. ```php Debugger::$email = 'admin@example.com'; ``` -------------------------------- ### Configure Tracy Log Severity Source: https://github.com/nette/tracy/blob/master/readme.md Define the severity of PHP errors that Tracy should log with detailed information. This allows fine-grained control over which notices and warnings are recorded. ```php Debugger::$logSeverity = E_NOTICE | E_WARNING; ``` -------------------------------- ### Echo Elapsed Time Source: https://github.com/nette/tracy/blob/master/readme.md Retrieve and echo the elapsed time of a running timer by calling `Debugger::timer()` again. This is useful for displaying execution times. ```php Debugger::timer(); // runs the timer ... // some time-consuming operation echo Debugger::timer(); // elapsed time in seconds ``` -------------------------------- ### Disable Tracy Bar Source: https://github.com/nette/tracy/blob/master/readme.md If you do not wish to display the Tracy Bar on your pages, you can disable it by setting the static property Debugger::$showBar to false. ```php Debugger::$showBar = false; ``` -------------------------------- ### Disable Tracy AJAX Capture Source: https://github.com/nette/tracy/blob/master/CLAUDE.md Set this JavaScript variable to false to disable automatic AJAX request capture by Tracy. ```javascript window.TracyAutoRefresh = false; ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.