RuntimeException
Failed to write cache file "/nas/content/live/riverbendresid/wp-content/cache/gantry5/rbr/twig/ac/ac2c7ccfb9af912eb4bc28b6759012211620b184e77c2c2e8c3e970e59e78733.php". RuntimeException thrown with message "Failed to write cache file "/nas/content/live/riverbendresid/wp-content/cache/gantry5/rbr/twig/ac/ac2c7ccfb9af912eb4bc28b6759012211620b184e77c2c2e8c3e970e59e78733.php"." Stacktrace: #11 RuntimeException in /nas/content/live/riverbendresid/wp-content/plugins/gantry5/src/vendor/twig/twig/src/Cache/FilesystemCache.php:80 #10 Twig\Cache\FilesystemCache:write in /nas/content/live/riverbendresid/wp-content/plugins/gantry5/src/vendor/twig/twig/src/Environment.php:487 #9 Twig\Environment:loadClass in /nas/content/live/riverbendresid/wp-content/plugins/gantry5/src/vendor/twig/twig/src/Environment.php:445 #8 Twig\Environment:loadTemplate in /nas/content/live/riverbendresid/wp-content/plugins/gantry5/src/vendor/twig/twig/src/Environment.php:423 #7 Twig\Environment:load in /nas/content/live/riverbendresid/wp-content/plugins/gantry5/src/vendor/timber/timber/lib/Loader.php:78 #6 Timber\Loader:render in /nas/content/live/riverbendresid/wp-content/plugins/gantry5/src/vendor/timber/timber/lib/Timber.php:334 #5 Timber\Timber:compile in /nas/content/live/riverbendresid/wp-content/plugins/gantry5/src/vendor/timber/timber/lib/Timber.php:383 #4 Timber\Timber:fetch in /nas/content/live/riverbendresid/wp-content/plugins/gantry5/src/vendor/timber/timber/lib/Timber.php:410 #3 Timber\Timber:render in /nas/content/live/riverbendresid/wp-content/themes/uranium/single.php:31 #2 include in /nas/content/live/riverbendresid/wp-includes/template-loader.php:106 #1 require_once in /nas/content/live/riverbendresid/wp-blog-header.php:19 #0 require in /nas/content/live/riverbendresid/index.php:17
Stack frames (12)
11
RuntimeException
/vendor/twig/twig/src/Cache/FilesystemCache.php80
10
Twig\Cache\FilesystemCache write
/vendor/twig/twig/src/Environment.php487
9
Twig\Environment loadClass
/vendor/twig/twig/src/Environment.php445
8
Twig\Environment loadTemplate
/vendor/twig/twig/src/Environment.php423
7
Twig\Environment load
/vendor/timber/timber/lib/Loader.php78
6
Timber\Loader render
/vendor/timber/timber/lib/Timber.php334
5
Timber\Timber compile
/vendor/timber/timber/lib/Timber.php383
4
Timber\Timber fetch
/vendor/timber/timber/lib/Timber.php410
3
Timber\Timber render
/nas/content/live/riverbendresid/wp-content/themes/uranium/single.php31
2
include
/nas/content/live/riverbendresid/wp-includes/template-loader.php106
1
require_once
/nas/content/live/riverbendresid/wp-blog-header.php19
0
require
/nas/content/live/riverbendresid/index.php17
            throw new \RuntimeException(sprintf('Unable to write in the cache directory (%s).', $dir));
        }
 
        $tmpFile = tempnam($dir, basename($key));
        if (false !== @file_put_contents($tmpFile, $content) && @rename($tmpFile, $key)) {
            @chmod($key, 0666 & ~umask());
 
            if (self::FORCE_BYTECODE_INVALIDATION == ($this->options & self::FORCE_BYTECODE_INVALIDATION)) {
                // Compile cached file into bytecode cache
                if (\function_exists('opcache_invalidate') && filter_var(ini_get('opcache.enable'), FILTER_VALIDATE_BOOLEAN)) {
                    @opcache_invalidate($key, true);
                } elseif (\function_exists('apc_compile_file')) {
                    apc_compile_file($key);
                }
            }
 
            return;
        }
 
        throw new \RuntimeException(sprintf('Failed to write cache file "%s".', $key));
    }
 
    public function getTimestamp($key)
    {
        if (!file_exists($key)) {
            return 0;
        }
 
        return (int) @filemtime($key);
    }
}
 
class_alias('Twig\Cache\FilesystemCache', 'Twig_Cache_Filesystem');
 
 
            if (!$this->isAutoReload() || $this->isTemplateFresh($name, $this->cache->getTimestamp($key))) {
                $this->cache->load($key);
            }
 
            $source = null;
            if (!class_exists($cls, false)) {
                $loader = $this->getLoader();
                if (!$loader instanceof SourceContextLoaderInterface) {
                    $source = new Source($loader->getSource($name), $name);
                } else {
                    $source = $loader->getSourceContext($name);
                }
 
                $content = $this->compileSource($source);
 
                if ($this->bcWriteCacheFile) {
                    $this->writeCacheFile($key, $content);
                } else {
                    $this->cache->write($key, $content);
                    $this->cache->load($key);
                }
 
                if (!class_exists($mainCls, false)) {
                    /* Last line of defense if either $this->bcWriteCacheFile was used,
                     * $this->cache is implemented as a no-op or we have a race condition
                     * where the cache was cleared between the above calls to write to and load from
                     * the cache.
                     */
                    eval('?>'.$content);
                }
            }
 
            if (!class_exists($cls, false)) {
                throw new RuntimeError(sprintf('Failed to load Twig template "%s", index "%s": cache might be corrupted.', $name, $index), -1, $source);
            }
        }
 
        if (!$this->runtimeInitialized) {
            $this->initRuntime();
    /**
     * Loads a template internal representation.
     *
     * This method is for internal use only and should never be called
     * directly.
     *
     * @param string $name  The template name
     * @param int    $index The index if it is an embedded template
     *
     * @return \Twig_TemplateInterface A template instance representing the given template name
     *
     * @throws LoaderError  When the template cannot be found
     * @throws RuntimeError When a previously generated cache is corrupted
     * @throws SyntaxError  When an error occurred during compilation
     *
     * @internal
     */
    public function loadTemplate($name, $index = null)
    {
        return $this->loadClass($this->getTemplateClass($name), $name, $index);
    }
 
    /**
     * @internal
     */
    public function loadClass($cls, $name, $index = null)
    {
        $mainCls = $cls;
        if (null !== $index) {
            $cls .= '___'.$index;
        }
 
        if (isset($this->loadedTemplates[$cls])) {
            return $this->loadedTemplates[$cls];
        }
 
        if (!class_exists($cls, false)) {
            if ($this->bcGetCacheFilename) {
                $key = $this->getCacheFilename($name);
            } else {
     *
     * @param string|TemplateWrapper|\Twig\Template $name The template name
     *
     * @throws LoaderError  When the template cannot be found
     * @throws RuntimeError When a previously generated cache is corrupted
     * @throws SyntaxError  When an error occurred during compilation
     *
     * @return TemplateWrapper
     */
    public function load($name)
    {
        if ($name instanceof TemplateWrapper) {
            return $name;
        }
 
        if ($name instanceof Template) {
            return new TemplateWrapper($this, $name);
        }
 
        return new TemplateWrapper($this, $this->loadTemplate($name));
    }
 
    /**
     * Loads a template internal representation.
     *
     * This method is for internal use only and should never be called
     * directly.
     *
     * @param string $name  The template name
     * @param int    $index The index if it is an embedded template
     *
     * @return \Twig_TemplateInterface A template instance representing the given template name
     *
     * @throws LoaderError  When the template cannot be found
     * @throws RuntimeError When a previously generated cache is corrupted
     * @throws SyntaxError  When an error occurred during compilation
     *
     * @internal
     */
    public function loadTemplate($name, $index = null)
        }
 
        $key = null;
        $output = false;
        if ( false !== $expires ) {
            ksort($data);
            $key = md5($file.json_encode($data));
            $output = $this->get_cache($key, self::CACHEGROUP, $cache_mode);
        }
 
        if ( false === $output || null === $output ) {
            $twig = $this->get_twig();
            if ( strlen($file) ) {
                $loader = $this->get_loader();
                $result = $loader->getCacheKey($file);
                do_action('timber_loader_render_file', $result);
            }
            $data = apply_filters('timber_loader_render_data', $data);
            $data = apply_filters('timber/loader/render_data', $data, $file);
            $template = $twig->load($file);
            $output = $template->render($data);
        }
 
        if ( false !== $output && false !== $expires && null !== $key ) {
            $this->delete_cache();
            $this->set_cache($key, $output, self::CACHEGROUP, $expires, $cache_mode);
        }
        $output = apply_filters('timber_output', $output);
        return apply_filters('timber/output', $output, $data, $file);
    }
 
    protected function delete_cache() {
        Cleaner::delete_transients();
    }
 
    /**
     * Get first existing template.
     *
     * @param array|string $templates  Name(s) of the Twig template(s) to choose from.
     * @return string|bool             Name of chosen template, otherwise false.
        if ( $via_render ) {
            $file = apply_filters('timber_render_file', $file);
        } else {
            $file = apply_filters('timber_compile_file', $file);
        }
 
        $output = false;
 
        if ($file !== false) {
            if ( is_null($data) ) {
                $data = array();
            }
 
            if ( $via_render ) {
                $data = apply_filters('timber_render_data', $data);
            } else {
                $data = apply_filters('timber_compile_data', $data);
            }
 
            $output = $loader->render($file, $data, $expires, $cache_mode);
        } else {
            if ( is_array($filenames) ) {
                $filenames = implode(", ", $filenames);
            }
            Helper::error_log( 'Error loading your template files: '.$filenames.'. Make sure one of these files exists.' );
        }
 
        do_action('timber_compile_done');
        return $output;
    }
 
    /**
     * Compile a string.
     *
     * @api
     * @example
     * ```php
     * $data = array(
     *     'username' => 'Jane Doe',
     * );
        $twig = $dummy_loader->get_twig();
        $template = $twig->createTemplate($string);
        return $template->render($data);
    }
 
    /**
     * Fetch function.
     *
     * @api
     * @param array|string $filenames  Name of the Twig file to render. If this is an array of files, Timber will
     *                                 render the first file that exists.
     * @param array        $data       Optional. An array of data to use in Twig template.
     * @param bool|int     $expires    Optional. In seconds. Use false to disable cache altogether. When passed an
     *                                 array, the first value is used for non-logged in visitors, the second for users.
     *                                 Default false.
     * @param string       $cache_mode Optional. Any of the cache mode constants defined in TimberLoader.
     * @return bool|string The returned output.
     */
    public static function fetch( $filenames, $data = array(), $expires = false, $cache_mode = Loader::CACHE_USE_DEFAULT ) {
        $output = self::compile($filenames, $data, $expires, $cache_mode, true);
        $output = apply_filters('timber_compile_result', $output);
        return $output;
    }
 
    /**
     * Render function.
     *
     * Passes data to a Twig file and echoes the output.
     *
     * @api
     * @example
     * ```php
     * $context = Timber::context();
     *
     * Timber::render( 'index.twig', $context );
     * ```
     * @param array|string $filenames  Name of the Twig file to render. If this is an array of files, Timber will
     *                                 render the first file that exists.
     * @param array        $data       Optional. An array of data to use in Twig template.
     * @param bool|int     $expires    Optional. In seconds. Use false to disable cache altogether. When passed an
     * Passes data to a Twig file and echoes the output.
     *
     * @api
     * @example
     * ```php
     * $context = Timber::context();
     *
     * Timber::render( 'index.twig', $context );
     * ```
     * @param array|string $filenames  Name of the Twig file to render. If this is an array of files, Timber will
     *                                 render the first file that exists.
     * @param array        $data       Optional. An array of data to use in Twig template.
     * @param bool|int     $expires    Optional. In seconds. Use false to disable cache altogether. When passed an
     *                                 array, the first value is used for non-logged in visitors, the second for users.
     *                                 Default false.
     * @param string       $cache_mode Optional. Any of the cache mode constants defined in TimberLoader.
     * @return bool|string The echoed output.
     */
    public static function render( $filenames, $data = array(), $expires = false, $cache_mode = Loader::CACHE_USE_DEFAULT ) {
        $output = self::fetch($filenames, $data, $expires, $cache_mode);
        echo $output;
        return $output;
    }
 
    /**
     * Render a string with Twig variables.
     *
     * @api
     * @example
     * ```php
     * $data = array(
     *     'username' => 'Jane Doe',
     * );
     *
     * Timber::render_string( 'Hi {{ username }}, I’m a string with a custom Twig variable', $data );
     * ```
     * @param string $string A string with Twig variables.
     * @param array  $data   An array of data to use in Twig template.
     * @return bool|string
     */
use Timber\Timber;

/*
 * The Template for displaying all single posts
 */

$gantry = Gantry\Framework\Gantry::instance();
$theme  = $gantry['theme'];

// We need to render contents of <head> before plugin content gets added.
$context              = Timber::get_context();
$context['page_head'] = $theme->render('partials/page_head.html.twig', $context);

$post = Timber::query_post();

$context['post'] = $post;
$context['wp_title'] .= ' - ' . $post->title();

Timber::render(['single-' . $post->ID . '.html.twig', 'single-' . $post->post_type . '.html.twig', 'single.html.twig'], $context);
 
            }
 
            break;
        }
    }
 
    if ( ! $template ) {
        $template = get_index_template();
    }
 
    /**
     * Filters the path of the current template before including it.
     *
     * @since 3.0.0
     *
     * @param string $template The path of the template to include.
     */
    $template = apply_filters( 'template_include', $template );
    if ( $template ) {
        include $template;
    } elseif ( current_user_can( 'switch_themes' ) ) {
        $theme = wp_get_theme();
        if ( $theme->errors() ) {
            wp_die( $theme->errors() );
        }
    }
    return;
}
 
<?php
/**
 * Loads the WordPress environment and template.
 *
 * @package WordPress
 */
 
if ( ! isset( $wp_did_header ) ) {
 
    $wp_did_header = true;
 
    // Load the WordPress library.
    require_once __DIR__ . '/wp-load.php';
 
    // Set up the WordPress query.
    wp();
 
    // Load the theme template.
    require_once ABSPATH . WPINC . '/template-loader.php';
 
}
 
<?php
/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */
 
/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
define( 'WP_USE_THEMES', true );
 
/** Loads the WordPress Environment and Template */
require __DIR__ . '/wp-blog-header.php';
 

Environment & details:

empty
Key Value
TCM_PostShown WP_Post Object ( [ID] => 2638 [post_author] => 4 [post_date] => 2021-04-20 00:45:30 [post_date_gmt] => 2021-04-20 04:45:30 [post_content] => Addiction recovery is not something that happens overnight. It is a long-term process that takes years and years it is a lifelong process, and for a person to stay free from drugs and alcohol for the remainder of their life, they will need to commit to doing whatever it takes to stay sober. In most cases, this means joining a program like Alcoholics Anonymous or Narcotics Anonymous, working through the 12 steps with a sponsor, and then taking other people through the steps. It means engaging in self-care regularly, and setting personal boundaries whenever necessary. It means going back to therapy if things start to get tough and not being afraid to ask for help when you need it. However, it is important to note that the ability to do all of these things does not naturally occur. Men and women who enter into a program of recovery need to re-learn how to effectively take care of themselves (or maybe learn this skill for the very first time). This is why a slow progression back into fully independent living is optimal - and why long-term sober living is always the best choice. <img class="alignleft size-full wp-image-2639" src="https://riverbendresidence.com/wp-content/uploads/2021/04/What-is-a-long-term-sober-living-home.jpg" alt="What is a long-term sober living home?" width="600" height="400" /> <h2>Definition of a Long-Term Sober Living Home</h2> A long-term sober living home is a transitional living environment for people who have already completed a higher level of clinical care and are looking to continue their recovery program with additional support and guidance in place. A long-term sober home is just a house where a person will live with up to 8 other men or women who are all new to recovery and who are all serious about staying sober. Every reputable sober living house enforces a strict set of rules and guidelines geared towards keeping residents accountable. <h2>Transitional Living is Individualized Without Set Timeframes</h2> These rules are never difficult to follow and include basic things like keeping common spaces clean, making beds in the morning, respecting the property of others, and washing dishes after they are used. There are also recovery-related rules in place. Of course, the first and most essential rule is avoiding all mood and mind-altering chemical substances. To stay in a sober living house, the residents have to stay sober. Makes sense. Secondly, residents must all be actively working through the 12 steps of Alcoholics Anonymous or another similarly structured program. Most sober living housing require month-to-month rent payments in addition to a specific time commitment. At Riverbend Residence, we generally recommend that our clients commit to between six and nine months in one of our houses. However, longer stays can be arranged if needed. To learn more about our sober living houses in New Jersey, call us today at <a href="tel:8445053447"><strong>(844) 505-3447</strong></a> to see if we are a good fit for yourself or a loved one. At <a href="https://riverbendresidence.com/">Riverbend Residence</a>, we believe that sober living housing is an essential part of every recovery process. We focus on helping our residents slowly transition back into their day-to-day lives while continuing to bolster their recovery. We hope that once a resident completes their stay in one of our well-appointed homes, he or she will feel completely confident staying sober in any environment. We focus on the unique and individual needs of each one of our residents, understanding that what is the best for one resident might not be the best for another. For example, one resident might have been struggling with a mild substance abuse disorder and might not require a six-month stay in our long-term sober living home. <h2>Continue Your Recovery Journey With Riverbend Residence</h2> He or she might benefit just as much from three full months, and then be able to easily transition into fully independent living. Another client might have been struggling with a more severe substance abuse disorder that lasted for several years, and therefore might require more guidance and a higher level of accountability before living on his or her own or returning home. To learn more about which option is right for you, <a href="https://riverbendresidence.com/contact-us/">contact us</a> today for more information on sober living near me. [post_title] => What is a Long-Term Sober Living Home? [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => open [post_password] => [post_name] => what-is-long-term-sober-living-home [to_ping] => [pinged] => [post_modified] => 2021-04-20 00:47:22 [post_modified_gmt] => 2021-04-20 04:47:22 [post_content_filtered] => [post_parent] => 0 [guid] => https://riverbendresidence.com/?p=2638 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw [status] => publish [id] => 2638 [slug] => what-is-long-term-sober-living-home [custom] => Array ( [_edit_lock] => 1618893971:3 [_edit_last] => 3 [_thumbnail_id] => 2639 [_wp_page_template] => default [_yoast_wpseo_focuskw] => long-term sober living home? [_yoast_wpseo_metadesc] => A long-term sober living home is a transitional residence for people who have completed treatment and are looking to further their recovery. [_yoast_wpseo_linkdex] => 75 [_yoast_wpseo_content_score] => 30 [_yoast_wpseo_estimated-reading-time-minutes] => 4 [_yoast_wpseo_primary_category] => 10 [_yoast_wpseo_title] => What is a Long-Term Sober Living Home? | Riverbend Residence ) )
TCM_SnippetsWrittenIds Array ( )
TCM_SnippetsWrittenMd5 Array ( )
TCM_Cache_Query_2_ Array ( [0] => Array ( [id] => post [text] => Post (post) [name] => Post (post) ) [1] => Array ( [id] => page [text] => Page (page) [name] => Page (page) ) )
empty
empty
empty
Key Value
SERVER_SOFTWARE Apache
REQUEST_URI /what-is-long-term-sober-living-home/
REDIRECT_HAVE_ORIGINAL_USER_AGENT claudebot
REDIRECT_HTTPS on
REDIRECT_IS_WPE 1
REDIRECT_WPE_CAN_WRITE_DISK 0
REDIRECT_WPENGINE_PHPSESSIONS on
REDIRECT_WPE_HEARTBEAT_AUTOSAVE_ONLY on
REDIRECT_WPENGINE_FORCE_STRONG_PASSWORDS on
REDIRECT_WPENGINE_CLEAR_EXPIRED_COOKIES off
REDIRECT_WPENGINE_ACCOUNT riverbendresid
REDIRECT_WPENGINE_SESSION_LOCKING on
REDIRECT_STATUS 200
HAVE_ORIGINAL_USER_AGENT claudebot
HTTPS on
IS_WPE 1
WPE_CAN_WRITE_DISK 0
WPENGINE_PHPSESSIONS on
WPE_HEARTBEAT_AUTOSAVE_ONLY on
WPENGINE_FORCE_STRONG_PASSWORDS on
WPENGINE_CLEAR_EXPIRED_COOKIES off
WPENGINE_ACCOUNT riverbendresid
WPENGINE_SESSION_LOCKING on
HTTP_HOST riverbendresidence.com
HTTP_CONNECTION close
HTTP_X_IS_BOT 1
HTTP_USER_AGENT claudebot
HTTP_X_FORWARDED_HOST riverbendresidence.com
HTTP_X_WPE_SSL 1
HTTP_X_WPE_INSTALL_NAME riverbendresid
HTTP_WPE_READONLY on
HTTP_CF_CONNECTING_IP 34.200.219.10, 34.200.219.10, 34.200.219.10
HTTP_X_WPE_REQUEST_ID 67e16759f938c7329f552deec9c2415e
HTTP_X_WPE_LOCAL_SSL 1
HTTP_X_FORWARDED_PROTO https
HTTP_CF_RAY 86c0a9863a1f083a-IAD
HTTP_CF_VISITOR {\"scheme\":\"https\"}
HTTP_ACCEPT */*
HTTP_REFERER https://www.riverbendresidence.com/what-is-long-term-sober-living-home/
HTTP_CDN_LOOP cloudflare
HTTP_X_WPE_EDGE AN
HTTP_CF_IPCOUNTRY US
HTTP_X_WORDPRESS_TYPE DEFAULT
HTTP_WPE_UPLOAD_MAX_FILESIZE 50M
HTTP_WPE_POST_MAX_SIZE 100M
HTTP_VIA 1.1 pod-141067:varnish:106 (Varnish/7.4)
HTTP_X_UA_ORIGINAL claudebot
HTTP_RAWHOST riverbendresidence.com
HTTP_X_BOT_CACHE YES
HTTP_X_CACHE_GROUP bot
HTTP_ACCEPT_ENCODING gzip
PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SERVER_SIGNATURE
SERVER_NAME riverbendresidence.com
SERVER_ADDR 127.0.0.1
SERVER_PORT 80
REMOTE_ADDR 34.200.219.10
DOCUMENT_ROOT /nas/content/live/riverbendresid
REQUEST_SCHEME http
CONTEXT_PREFIX
CONTEXT_DOCUMENT_ROOT /nas/content/live/riverbendresid
SERVER_ADMIN [no address given]
SCRIPT_FILENAME /nas/content/live/riverbendresid/index.php
REMOTE_PORT 37690
REDIRECT_URL /what-is-long-term-sober-living-home/
GATEWAY_INTERFACE CGI/1.1
SERVER_PROTOCOL HTTP/1.0
REQUEST_METHOD GET
QUERY_STRING
SCRIPT_NAME /index.php
PHP_SELF /index.php
REQUEST_TIME_FLOAT 1711723720.72
REQUEST_TIME 1711723720
Key Value
APACHE2_OPCACHE_MAX_FILE_SIZE_BYTES 614400
APACHE2_OPCACHE_MEMORY_CONSUMPTION 512
HOSTNAME pod-141067:apache2_74:v0.3.4
SHLVL 0
APACHE_RUN_DIR /var/run/apache2
APACHE_PID_FILE /var/run/apache2/apache2.pid
APACHE2_OPCACHE_REVALIDATE_FREQ 10
_ /usr/sbin/apache2ctl
APACHE2_OPCACHE_HUGE_CODE_PAGES 1
APACHE2_LISTEN_PORT_RW 6778
PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
APACHE_LOCK_DIR /var/lock/apache2
APACHE2_OPCACHE_MAX_WASTED_PERCENTAGE 5
LANG C
APACHE2_OPCACHE_MAX_ACCELERATED_FILES 1000000
APACHE_RUN_USER www-data
APACHE_RUN_GROUP www-data
APACHE2_LISTEN_PORT 6779
APACHE_LOG_DIR /var/log/apache2
PWD /
BASE_VERSION 7.4-zend
WPENGINE_ACCOUNT riverbendresid
WPENGINE_PHPSESSIONS on
WPENGINE_DB_SESSIONS off
0. Whoops\Handler\PrettyPageHandler