<?php

namespace {
/*
 * This file is part of Contao.
 *
 * (c) Leo Feyer
 *
 * @license LGPL-3.0-or-later
 */
$GLOBALS['TL_DCA']['tl_page'] = array(
    // Config
    'config' => array('dataContainer' => \Contao\DC_Table::class, 'ctable' => array('tl_article'), 'enableVersioning' => \true, 'markAsCopy' => 'title', 'onload_callback' => array(array('tl_page', 'checkPermission'), array('tl_page', 'addBreadcrumb'), array('tl_page', 'setRootType'), array('tl_page', 'showFallbackWarning'), array('tl_page', 'makeRedirectPageMandatory'), array('tl_page', 'generateSitemap')), 'oncut_callback' => array(array('tl_page', 'scheduleUpdate')), 'ondelete_callback' => array(array('tl_page', 'purgeSearchIndex'), array('tl_page', 'scheduleUpdate')), 'onsubmit_callback' => array(array('tl_page', 'scheduleUpdate'), array('tl_page', 'generateArticle')), 'sql' => array('keys' => array('id' => 'primary', 'alias' => 'index', 'type,dns' => 'index', 'pid,type,start,stop,published' => 'index'))),
    // List
    'list' => array('sorting' => array('mode' => 5, 'icon' => 'pagemounts.svg', 'paste_button_callback' => array('tl_page', 'pastePage'), 'panelLayout' => 'filter;search'), 'label' => array('fields' => array('title'), 'format' => '%s', 'label_callback' => array('tl_page', 'addIcon')), 'global_operations' => array('toggleNodes' => array('href' => 'ptg=all', 'class' => 'header_toggle', 'showOnSelect' => \true), 'all' => array('href' => 'act=select', 'class' => 'header_edit_all', 'attributes' => 'onclick="Backend.getScrollOffset()" accesskey="e"')), 'operations' => array('edit' => array('href' => 'act=edit', 'icon' => 'edit.svg', 'button_callback' => array('tl_page', 'editPage')), 'copy' => array('href' => 'act=paste&amp;mode=copy', 'icon' => 'copy.svg', 'attributes' => 'onclick="Backend.getScrollOffset()"', 'button_callback' => array('tl_page', 'copyPage')), 'copyChilds' => array('href' => 'act=paste&amp;mode=copy&amp;childs=1', 'icon' => 'copychilds.svg', 'attributes' => 'onclick="Backend.getScrollOffset()"', 'button_callback' => array('tl_page', 'copyPageWithSubpages')), 'cut' => array('href' => 'act=paste&amp;mode=cut', 'icon' => 'cut.svg', 'attributes' => 'onclick="Backend.getScrollOffset()"', 'button_callback' => array('tl_page', 'cutPage')), 'delete' => array('href' => 'act=delete', 'icon' => 'delete.svg', 'attributes' => 'onclick="if(!confirm(\'' . $GLOBALS['TL_LANG']['MSC']['deleteConfirm'] . '\'))return false;Backend.getScrollOffset()"', 'button_callback' => array('tl_page', 'deletePage')), 'toggle' => array('icon' => 'visible.svg', 'attributes' => 'onclick="Backend.getScrollOffset();return AjaxRequest.toggleVisibility(this,%s)"', 'button_callback' => array('tl_page', 'toggleIcon')), 'show' => array('href' => 'act=show', 'icon' => 'show.svg'), 'articles' => array('href' => 'do=article', 'icon' => 'article.svg', 'button_callback' => array('tl_page', 'editArticles')))),
    // Select
    'select' => array('buttons_callback' => array(array('tl_page', 'addAliasButton'))),
    // Palettes
    'palettes' => array('__selector__' => array('type', 'fallback', 'autoforward', 'protected', 'createSitemap', 'includeLayout', 'includeCache', 'includeChmod', 'enforceTwoFactor'), 'default' => '{title_legend},title,alias,type', 'regular' => '{title_legend},title,alias,type;{meta_legend},pageTitle,robots,description,serpPreview;{protected_legend:hide},protected;{layout_legend:hide},includeLayout;{cache_legend:hide},includeCache;{chmod_legend:hide},includeChmod;{expert_legend:hide},cssClass,sitemap,hide,noSearch,guests,requireItem;{tabnav_legend:hide},tabindex,accesskey;{publish_legend},published,start,stop', 'forward' => '{title_legend},title,alias,type;{meta_legend},pageTitle,robots;{redirect_legend},jumpTo,redirect;{protected_legend:hide},protected;{layout_legend:hide},includeLayout;{cache_legend:hide},includeCache;{chmod_legend:hide},includeChmod;{expert_legend:hide},cssClass,sitemap,hide,guests;{tabnav_legend:hide},tabindex,accesskey;{publish_legend},published,start,stop', 'redirect' => '{title_legend},title,alias,type;{meta_legend},pageTitle,robots;{redirect_legend},redirect,url,target;{protected_legend:hide},protected;{layout_legend:hide},includeLayout;{cache_legend:hide},includeCache;{chmod_legend:hide},includeChmod;{expert_legend:hide},cssClass,sitemap,hide,guests;{tabnav_legend:hide},tabindex,accesskey;{publish_legend},published,start,stop', 'root' => '{title_legend},title,alias,type;{meta_legend},pageTitle;{dns_legend},dns,useSSL,language,fallback;{global_legend:hide},dateFormat,timeFormat,datimFormat,adminEmail,staticFiles,staticPlugins;{alias_legend:hide},validAliasCharacters;{sitemap_legend:hide},createSitemap;{protected_legend:hide},protected;{layout_legend},includeLayout;{twoFactor_legend:hide},enforceTwoFactor;{cache_legend:hide},includeCache;{chmod_legend:hide},includeChmod;{publish_legend},published,start,stop', 'rootfallback' => '{title_legend},title,alias,type;{meta_legend},pageTitle;{dns_legend},dns,useSSL,language,fallback;{website_legend},favicon,robotsTxt;{global_legend:hide},dateFormat,timeFormat,datimFormat,adminEmail,staticFiles,staticPlugins;{alias_legend:hide},validAliasCharacters,useFolderUrl;{sitemap_legend:hide},createSitemap;{protected_legend:hide},protected;{layout_legend},includeLayout;{twoFactor_legend:hide},enforceTwoFactor;{cache_legend:hide},includeCache;{chmod_legend:hide},includeChmod;{publish_legend},published,start,stop', 'logout' => '{title_legend},title,alias,type;{forward_legend},jumpTo,redirectBack;{protected_legend:hide},protected;{chmod_legend:hide},includeChmod;{expert_legend:hide},cssClass,sitemap,hide;{tabnav_legend:hide},tabindex,accesskey;{publish_legend},published,start,stop', 'error_401' => '{title_legend},title,alias,type;{meta_legend},pageTitle,robots,description;{forward_legend},autoforward;{layout_legend:hide},includeLayout;{cache_legend:hide},includeCache;{chmod_legend:hide},includeChmod;{expert_legend:hide},cssClass;{publish_legend},published,start,stop', 'error_403' => '{title_legend},title,alias,type;{meta_legend},pageTitle,robots,description;{forward_legend},autoforward;{layout_legend:hide},includeLayout;{cache_legend:hide},includeCache;{chmod_legend:hide},includeChmod;{expert_legend:hide},cssClass;{publish_legend},published,start,stop', 'error_404' => '{title_legend},title,alias,type;{meta_legend},pageTitle,robots,description;{forward_legend},autoforward;{layout_legend:hide},includeLayout;{cache_legend:hide},includeCache;{chmod_legend:hide},includeChmod;{expert_legend:hide},cssClass;{publish_legend},published,start,stop'),
    // Subpalettes
    'subpalettes' => array('autoforward' => 'jumpTo', 'protected' => 'groups', 'createSitemap' => 'sitemapName', 'includeLayout' => 'layout', 'includeCache' => 'clientCache,cache,alwaysLoadFromCache', 'includeChmod' => 'cuser,cgroup,chmod', 'enforceTwoFactor' => 'twoFactorJumpTo'),
    // Fields
    'fields' => array('id' => array('label' => array('ID'), 'search' => \true, 'sql' => "int(10) unsigned NOT NULL auto_increment"), 'pid' => array('sql' => "int(10) unsigned NOT NULL default 0"), 'sorting' => array('sql' => "int(10) unsigned NOT NULL default 0"), 'tstamp' => array('sql' => "int(10) unsigned NOT NULL default 0"), 'title' => array('exclude' => \true, 'search' => \true, 'inputType' => 'text', 'eval' => array('mandatory' => \true, 'maxlength' => 255, 'tl_class' => 'w50'), 'sql' => "varchar(255) NOT NULL default ''"), 'alias' => array('exclude' => \true, 'search' => \true, 'inputType' => 'text', 'eval' => array('rgxp' => 'folderalias', 'doNotCopy' => \true, 'maxlength' => 255, 'tl_class' => 'w50 clr'), 'save_callback' => array(array('tl_page', 'generateAlias')), 'sql' => "varchar(255) BINARY NOT NULL default ''"), 'type' => array('exclude' => \true, 'filter' => \true, 'inputType' => 'select', 'options_callback' => array('tl_page', 'getPageTypes'), 'eval' => array('helpwizard' => \true, 'submitOnChange' => \true, 'tl_class' => 'w50'), 'reference' => &$GLOBALS['TL_LANG']['PTY'], 'save_callback' => array(array('tl_page', 'checkRootType')), 'sql' => "varchar(64) NOT NULL default 'regular'"), 'pageTitle' => array('exclude' => \true, 'search' => \true, 'inputType' => 'text', 'eval' => array('maxlength' => 255, 'tl_class' => 'w50'), 'sql' => "varchar(255) NOT NULL default ''"), 'language' => array('exclude' => \true, 'search' => \true, 'inputType' => 'text', 'eval' => array('mandatory' => \true, 'rgxp' => 'language', 'maxlength' => 5, 'nospace' => \true, 'doNotCopy' => \true, 'tl_class' => 'w50'), 'sql' => "varchar(5) NOT NULL default ''"), 'robots' => array('exclude' => \true, 'search' => \true, 'inputType' => 'select', 'options' => array('index,follow', 'index,nofollow', 'noindex,follow', 'noindex,nofollow'), 'eval' => array('tl_class' => 'w50'), 'sql' => "varchar(32) NOT NULL default ''"), 'description' => array('exclude' => \true, 'search' => \true, 'inputType' => 'textarea', 'eval' => array('style' => 'height:60px', 'decodeEntities' => \true, 'tl_class' => 'clr'), 'sql' => "text NULL"), 'serpPreview' => array('label' => &$GLOBALS['TL_LANG']['MSC']['serpPreview'], 'exclude' => \true, 'inputType' => 'serpPreview', 'eval' => array('url_callback' => array('tl_page', 'getSerpUrl'), 'title_tag_callback' => array('tl_page', 'getTitleTag'), 'titleFields' => array('pageTitle', 'title')), 'sql' => \null), 'redirect' => array('exclude' => \true, 'inputType' => 'select', 'options' => array('permanent', 'temporary'), 'eval' => array('tl_class' => 'w50'), 'reference' => &$GLOBALS['TL_LANG']['tl_page'], 'sql' => "varchar(32) NOT NULL default 'permanent'"), 'jumpTo' => array(
        'exclude' => \true,
        'inputType' => 'pageTree',
        'foreignKey' => 'tl_page.title',
        'eval' => array('fieldType' => 'radio'),
        // do not set mandatory (see #5453)
        'save_callback' => array(array('tl_page', 'checkJumpTo')),
        'sql' => "int(10) unsigned NOT NULL default 0",
        'relation' => array('type' => 'hasOne', 'load' => 'lazy'),
    ), 'redirectBack' => array('exclude' => \true, 'inputType' => 'checkbox', 'sql' => "char(1) NOT NULL default ''"), 'url' => array('label' => &$GLOBALS['TL_LANG']['MSC']['url'], 'exclude' => \true, 'search' => \true, 'inputType' => 'text', 'eval' => array('mandatory' => \true, 'rgxp' => 'url', 'decodeEntities' => \true, 'maxlength' => 255, 'dcaPicker' => \true, 'addWizardClass' => \false, 'tl_class' => 'w50 clr'), 'sql' => "varchar(255) NOT NULL default ''"), 'target' => array('label' => &$GLOBALS['TL_LANG']['MSC']['target'], 'exclude' => \true, 'inputType' => 'checkbox', 'eval' => array('tl_class' => 'w50 m12'), 'sql' => "char(1) NOT NULL default ''"), 'dns' => array('exclude' => \true, 'search' => \true, 'inputType' => 'text', 'eval' => array('rgxp' => 'url', 'decodeEntities' => \true, 'maxlength' => 255, 'tl_class' => 'w50'), 'load_callback' => array(array('tl_page', 'loadDns')), 'save_callback' => array(array('tl_page', 'checkDns')), 'sql' => "varchar(255) NOT NULL default ''"), 'staticFiles' => array('exclude' => \true, 'search' => \true, 'inputType' => 'text', 'eval' => array('rgxp' => 'url', 'trailingSlash' => \false, 'tl_class' => 'w50'), 'save_callback' => array(array('tl_page', 'checkStaticUrl')), 'sql' => "varchar(255) NOT NULL default ''"), 'staticPlugins' => array('exclude' => \true, 'search' => \true, 'inputType' => 'text', 'eval' => array('rgxp' => 'url', 'trailingSlash' => \false, 'tl_class' => 'w50'), 'save_callback' => array(array('tl_page', 'checkStaticUrl')), 'sql' => "varchar(255) NOT NULL default ''"), 'fallback' => array('exclude' => \true, 'inputType' => 'checkbox', 'eval' => array('doNotCopy' => \true, 'submitOnChange' => \true, 'tl_class' => 'w50 m12'), 'save_callback' => array(array('tl_page', 'checkFallback')), 'sql' => "char(1) NOT NULL default ''"), 'favicon' => array('exclude' => \true, 'inputType' => 'fileTree', 'eval' => array('filesOnly' => \true, 'fieldType' => 'radio', 'extensions' => 'ico,svg,png'), 'sql' => "binary(16) NULL"), 'robotsTxt' => array('exclude' => \true, 'inputType' => 'textarea', 'eval' => array('doNotCopy' => \true, 'decodeEntities' => \true), 'sql' => "text NULL"), 'adminEmail' => array('exclude' => \true, 'search' => \true, 'inputType' => 'text', 'eval' => array('maxlength' => 255, 'rgxp' => 'friendly', 'decodeEntities' => \true, 'placeholder' => \Contao\Config::get('adminEmail'), 'tl_class' => 'w50'), 'sql' => "varchar(255) NOT NULL default ''"), 'dateFormat' => array('exclude' => \true, 'search' => \true, 'inputType' => 'text', 'eval' => array('helpwizard' => \true, 'decodeEntities' => \true, 'placeholder' => \Contao\Config::get('dateFormat'), 'tl_class' => 'w50'), 'explanation' => 'dateFormat', 'sql' => "varchar(32) NOT NULL default ''"), 'timeFormat' => array('exclude' => \true, 'search' => \true, 'inputType' => 'text', 'eval' => array('decodeEntities' => \true, 'placeholder' => \Contao\Config::get('timeFormat'), 'tl_class' => 'w50'), 'sql' => "varchar(32) NOT NULL default ''"), 'datimFormat' => array('exclude' => \true, 'search' => \true, 'inputType' => 'text', 'eval' => array('decodeEntities' => \true, 'placeholder' => \Contao\Config::get('datimFormat'), 'tl_class' => 'w50'), 'sql' => "varchar(32) NOT NULL default ''"), 'validAliasCharacters' => array('exclude' => \true, 'inputType' => 'select', 'options_callback' => static function () {
        return \Contao\System::getContainer()->get('contao.slug.valid_characters')->getOptions();
    }, 'eval' => array('includeBlankOption' => \true, 'decodeEntities' => \true, 'tl_class' => 'w50'), 'sql' => "varchar(255) NOT NULL default ''"), 'createSitemap' => array('exclude' => \true, 'inputType' => 'checkbox', 'eval' => array('submitOnChange' => \true), 'sql' => "char(1) NOT NULL default ''"), 'sitemapName' => array('exclude' => \true, 'search' => \true, 'inputType' => 'text', 'eval' => array('mandatory' => \true, 'unique' => \true, 'rgxp' => 'alnum', 'decodeEntities' => \true, 'maxlength' => 32, 'tl_class' => 'w50'), 'save_callback' => array(array('tl_page', 'checkFeedAlias')), 'sql' => "varchar(32) NOT NULL default ''"), 'useSSL' => array('exclude' => \true, 'inputType' => 'checkbox', 'eval' => array('tl_class' => 'w50 m12'), 'sql' => "char(1) NOT NULL default ''"), 'autoforward' => array('exclude' => \true, 'inputType' => 'checkbox', 'eval' => array('submitOnChange' => \true), 'sql' => "char(1) NOT NULL default ''"), 'protected' => array('exclude' => \true, 'filter' => \true, 'inputType' => 'checkbox', 'eval' => array('submitOnChange' => \true), 'sql' => "char(1) NOT NULL default ''"), 'groups' => array('exclude' => \true, 'filter' => \true, 'inputType' => 'checkbox', 'foreignKey' => 'tl_member_group.name', 'eval' => array('mandatory' => \true, 'multiple' => \true), 'sql' => "blob NULL", 'relation' => array('type' => 'hasMany', 'load' => 'lazy')), 'includeLayout' => array('exclude' => \true, 'inputType' => 'checkbox', 'eval' => array('submitOnChange' => \true), 'sql' => "char(1) NOT NULL default ''"), 'layout' => array('exclude' => \true, 'search' => \true, 'inputType' => 'select', 'foreignKey' => 'tl_layout.name', 'options_callback' => array('tl_page', 'getPageLayouts'), 'eval' => array('chosen' => \true, 'tl_class' => 'w50'), 'sql' => "int(10) unsigned NOT NULL default 0", 'relation' => array('type' => 'hasOne', 'load' => 'lazy')), 'includeCache' => array('exclude' => \true, 'inputType' => 'checkbox', 'eval' => array('submitOnChange' => \true), 'sql' => "char(1) NOT NULL default ''"), 'cache' => array('exclude' => \true, 'search' => \true, 'inputType' => 'select', 'options' => array(0, 5, 15, 30, 60, 300, 900, 1800, 3600, 10800, 21600, 43200, 86400, 259200, 604800, 2592000, 7776000, 15552000, 31536000), 'reference' => &$GLOBALS['TL_LANG']['CACHE'], 'eval' => array('tl_class' => 'w50 clr'), 'sql' => "int(10) unsigned NOT NULL default 0"), 'alwaysLoadFromCache' => array('exclude' => \true, 'inputType' => 'checkbox', 'eval' => array('tl_class' => 'w50 m12'), 'sql' => "char(1) NOT NULL default ''"), 'clientCache' => array('exclude' => \true, 'search' => \true, 'inputType' => 'select', 'options' => array(0, 5, 15, 30, 60, 300, 900, 1800, 3600, 10800, 21600, 43200, 86400, 259200, 604800, 2592000), 'reference' => &$GLOBALS['TL_LANG']['CACHE'], 'eval' => array('tl_class' => 'w50'), 'sql' => "int(10) unsigned NOT NULL default 0"), 'includeChmod' => array('exclude' => \true, 'inputType' => 'checkbox', 'eval' => array('submitOnChange' => \true), 'sql' => "char(1) NOT NULL default ''"), 'cuser' => array('default' => (int) \Contao\Config::get('defaultUser'), 'search' => \true, 'exclude' => \true, 'inputType' => 'select', 'foreignKey' => 'tl_user.name', 'eval' => array('mandatory' => \true, 'chosen' => \true, 'includeBlankOption' => \true, 'tl_class' => 'w50'), 'sql' => "int(10) unsigned NOT NULL default 0", 'relation' => array('type' => 'hasOne', 'load' => 'lazy')), 'cgroup' => array('default' => (int) \Contao\Config::get('defaultGroup'), 'search' => \true, 'exclude' => \true, 'inputType' => 'select', 'foreignKey' => 'tl_user_group.name', 'eval' => array('mandatory' => \true, 'chosen' => \true, 'includeBlankOption' => \true, 'tl_class' => 'w50'), 'sql' => "int(10) unsigned NOT NULL default 0", 'relation' => array('type' => 'hasOne', 'load' => 'lazy')), 'chmod' => array('default' => \Contao\Config::get('defaultChmod'), 'exclude' => \true, 'inputType' => 'chmod', 'eval' => array('tl_class' => 'clr'), 'sql' => "varchar(255) NOT NULL default ''"), 'noSearch' => array('exclude' => \true, 'filter' => \true, 'inputType' => 'checkbox', 'eval' => array('tl_class' => 'w50'), 'sql' => "char(1) NOT NULL default ''"), 'requireItem' => array('exclude' => \true, 'inputType' => 'checkbox', 'eval' => array('tl_class' => 'w50'), 'sql' => "char(1) NOT NULL default ''"), 'cssClass' => array('exclude' => \true, 'search' => \true, 'inputType' => 'text', 'eval' => array('maxlength' => 64, 'tl_class' => 'w50'), 'sql' => "varchar(64) NOT NULL default ''"), 'sitemap' => array('exclude' => \true, 'inputType' => 'select', 'options' => array('map_default', 'map_always', 'map_never'), 'eval' => array('maxlength' => 32, 'tl_class' => 'w50'), 'reference' => &$GLOBALS['TL_LANG']['tl_page'], 'sql' => "varchar(32) NOT NULL default ''"), 'hide' => array('exclude' => \true, 'inputType' => 'checkbox', 'eval' => array('tl_class' => 'w50'), 'sql' => "char(1) NOT NULL default ''"), 'guests' => array('exclude' => \true, 'filter' => \true, 'inputType' => 'checkbox', 'eval' => array('tl_class' => 'w50'), 'sql' => "char(1) NOT NULL default ''"), 'tabindex' => array('exclude' => \true, 'search' => \true, 'inputType' => 'text', 'eval' => array('rgxp' => 'natural', 'nospace' => \true, 'tl_class' => 'w50'), 'sql' => "smallint(5) unsigned NOT NULL default 0"), 'accesskey' => array('exclude' => \true, 'search' => \true, 'inputType' => 'text', 'eval' => array('rgxp' => 'alnum', 'maxlength' => 1, 'tl_class' => 'w50'), 'sql' => "char(1) NOT NULL default ''"), 'published' => array('exclude' => \true, 'filter' => \true, 'inputType' => 'checkbox', 'eval' => array('doNotCopy' => \true), 'sql' => "char(1) NOT NULL default ''"), 'start' => array('exclude' => \true, 'inputType' => 'text', 'eval' => array('rgxp' => 'datim', 'datepicker' => \true, 'tl_class' => 'w50 wizard'), 'sql' => "varchar(10) NOT NULL default ''"), 'stop' => array('exclude' => \true, 'inputType' => 'text', 'eval' => array('rgxp' => 'datim', 'datepicker' => \true, 'tl_class' => 'w50 wizard'), 'sql' => "varchar(10) NOT NULL default ''"), 'enforceTwoFactor' => array('exclude' => \true, 'inputType' => 'checkbox', 'eval' => array('submitOnChange' => \true), 'sql' => "char(1) NOT NULL default ''"), 'twoFactorJumpTo' => array('exclude' => \true, 'inputType' => 'pageTree', 'foreignKey' => 'tl_page.title', 'eval' => array('fieldType' => 'radio', 'mandatory' => \true), 'save_callback' => array(array('tl_page', 'checkJumpTo')), 'sql' => "int(10) unsigned NOT NULL default 0", 'relation' => array('type' => 'hasOne', 'load' => 'lazy'))),
);
// Disable the articles link in the modal window
if (\Contao\Input::get('popup')) {
    unset($GLOBALS['TL_DCA']['tl_page']['list']['operations']['articles']);
}
/**
 * Provide miscellaneous methods that are used by the data configuration array.
 *
 * @author Leo Feyer <https://github.com/leofeyer>
 */
class tl_page extends \Contao\Backend
{
    /**
     * Import the back end user object
     */
    public function __construct()
    {
        parent::__construct();
        $this->import('Contao\\BackendUser', 'User');
    }
    /**
     * Check permissions to edit table tl_page
     *
     * @throws Contao\CoreBundle\Exception\AccessDeniedException
     */
    public function checkPermission()
    {
        if ($this->User->isAdmin) {
            return;
        }
        /** @var Symfony\Component\HttpFoundation\Session\SessionInterface $objSession */
        $objSession = \Contao\System::getContainer()->get('session');
        $session = $objSession->all();
        // Set the default page user and group
        $GLOBALS['TL_DCA']['tl_page']['fields']['cuser']['default'] = (int) \Contao\Config::get('defaultUser') ?: $this->User->id;
        $GLOBALS['TL_DCA']['tl_page']['fields']['cgroup']['default'] = (int) \Contao\Config::get('defaultGroup') ?: (int) $this->User->groups[0];
        // Restrict the page tree
        if (empty($this->User->pagemounts) || !\is_array($this->User->pagemounts)) {
            $root = array(0);
        } else {
            $root = $this->User->pagemounts;
        }
        $GLOBALS['TL_DCA']['tl_page']['list']['sorting']['root'] = $root;
        // Set allowed page IDs (edit multiple)
        if (\is_array($session['CURRENT']['IDS'])) {
            $edit_all = array();
            $delete_all = array();
            foreach ($session['CURRENT']['IDS'] as $id) {
                $objPage = $this->Database->prepare("SELECT id, pid, type, includeChmod, chmod, cuser, cgroup FROM tl_page WHERE id=?")->limit(1)->execute($id);
                if ($objPage->numRows < 1 || !$this->User->hasAccess($objPage->type, 'alpty')) {
                    continue;
                }
                $row = $objPage->row();
                if ($this->User->isAllowed(\Contao\BackendUser::CAN_EDIT_PAGE, $row)) {
                    $edit_all[] = $id;
                }
                // Mounted pages cannot be deleted
                if ($this->User->isAllowed(\Contao\BackendUser::CAN_DELETE_PAGE, $row) && !$this->User->hasAccess($id, 'pagemounts')) {
                    $delete_all[] = $id;
                }
            }
            $session['CURRENT']['IDS'] = \Contao\Input::get('act') == 'deleteAll' ? $delete_all : $edit_all;
        }
        // Set allowed clipboard IDs
        if (isset($session['CLIPBOARD']['tl_page']) && \is_array($session['CLIPBOARD']['tl_page']['id'])) {
            $clipboard = array();
            foreach ($session['CLIPBOARD']['tl_page']['id'] as $id) {
                $objPage = $this->Database->prepare("SELECT id, pid, type, includeChmod, chmod, cuser, cgroup FROM tl_page WHERE id=?")->limit(1)->execute($id);
                if ($objPage->numRows < 1 || !$this->User->hasAccess($objPage->type, 'alpty')) {
                    continue;
                }
                if ($this->User->isAllowed(\Contao\BackendUser::CAN_EDIT_PAGE_HIERARCHY, $objPage->row())) {
                    $clipboard[] = $id;
                }
            }
            $session['CLIPBOARD']['tl_page']['id'] = $clipboard;
        }
        // Overwrite session
        $objSession->replace($session);
        // Check permissions to save and create new
        if (\Contao\Input::get('act') == 'edit') {
            $objPage = $this->Database->prepare("SELECT * FROM tl_page WHERE id=(SELECT pid FROM tl_page WHERE id=?)")->limit(1)->execute(\Contao\Input::get('id'));
            if ($objPage->numRows && !$this->User->isAllowed(\Contao\BackendUser::CAN_EDIT_PAGE_HIERARCHY, $objPage->row())) {
                $GLOBALS['TL_DCA']['tl_page']['config']['closed'] = \true;
            }
        }
        // Check current action
        if (\Contao\Input::get('act') && \Contao\Input::get('act') != 'paste') {
            $permission = 0;
            $cid = \CURRENT_ID ?: \Contao\Input::get('id');
            $ids = $cid ? array($cid) : array();
            // Set permission
            switch (\Contao\Input::get('act')) {
                case 'edit':
                case 'toggle':
                    $permission = \Contao\BackendUser::CAN_EDIT_PAGE;
                    break;
                case 'move':
                    $permission = \Contao\BackendUser::CAN_EDIT_PAGE_HIERARCHY;
                    $ids[] = \Contao\Input::get('sid');
                    break;
                case 'create':
                case 'copy':
                case 'copyAll':
                case 'cut':
                case 'cutAll':
                    $permission = \Contao\BackendUser::CAN_EDIT_PAGE_HIERARCHY;
                    // Check the parent page in "paste into" mode
                    if (\Contao\Input::get('mode') == 2) {
                        $ids[] = \Contao\Input::get('pid');
                    } else {
                        $objPage = $this->Database->prepare("SELECT pid FROM tl_page WHERE id=?")->limit(1)->execute(\Contao\Input::get('pid'));
                        $ids[] = $objPage->pid;
                    }
                    break;
                case 'delete':
                    $permission = \Contao\BackendUser::CAN_DELETE_PAGE;
                    break;
            }
            // Check user permissions
            $pagemounts = array();
            // Get all allowed pages for the current user
            foreach ($this->User->pagemounts as $root) {
                if (\Contao\Input::get('act') != 'delete') {
                    $pagemounts[] = array($root);
                }
                $pagemounts[] = $this->Database->getChildRecords($root, 'tl_page');
            }
            if (!empty($pagemounts)) {
                $pagemounts = \array_merge(...$pagemounts);
            }
            $pagemounts = \array_unique($pagemounts);
            // Do not allow to paste after pages on the root level (pagemounts)
            if (\Contao\Input::get('mode') == 1 && (\Contao\Input::get('act') == 'cut' || \Contao\Input::get('act') == 'cutAll') && \in_array(\Contao\Input::get('pid'), $this->eliminateNestedPages($this->User->pagemounts))) {
                throw new \Contao\CoreBundle\Exception\AccessDeniedException('Not enough permissions to paste page ID ' . \Contao\Input::get('id') . ' after mounted page ID ' . \Contao\Input::get('pid') . ' (root level).');
            }
            $error = \false;
            // Check each page
            foreach ($ids as $i => $id) {
                if (!\in_array($id, $pagemounts)) {
                    $this->log('Page ID ' . $id . ' was not mounted', __METHOD__, \TL_ERROR);
                    $error = \true;
                    break;
                }
                // Get the page object
                $objPage = \Contao\PageModel::findById($id);
                if ($objPage === \null) {
                    continue;
                }
                // Check whether the current user is allowed to access the current page
                if (\Contao\Input::get('act') != 'show' && !$this->User->isAllowed($permission, $objPage->row())) {
                    $error = \true;
                    break;
                }
                // Check the type of the first page (not the following parent pages)
                // In "edit multiple" mode, $ids contains only the parent ID, therefore check $id != $_GET['pid'] (see #5620)
                if ($i == 0 && $id != \Contao\Input::get('pid') && \Contao\Input::get('act') != 'create' && !$this->User->hasAccess($objPage->type, 'alpty')) {
                    $this->log('Not enough permissions to  ' . \Contao\Input::get('act') . ' ' . $objPage->type . ' pages', __METHOD__, \TL_ERROR);
                    $error = \true;
                    break;
                }
            }
            // Redirect if there is an error
            if ($error) {
                throw new \Contao\CoreBundle\Exception\AccessDeniedException('Not enough permissions to ' . \Contao\Input::get('act') . ' page ID ' . $cid . ' or paste after/into page ID ' . \Contao\Input::get('pid') . '.');
            }
        }
    }
    /**
     * Add the breadcrumb menu
     */
    public function addBreadcrumb()
    {
        \Contao\Backend::addPagesBreadcrumb();
    }
    /**
     * Make new top-level pages root pages
     *
     * @param Contao\DataContainer $dc
     */
    public function setRootType(\Contao\DataContainer $dc)
    {
        if (\Contao\Input::get('act') != 'create') {
            return;
        }
        // Insert into
        if (\Contao\Input::get('pid') == 0) {
            $GLOBALS['TL_DCA']['tl_page']['fields']['type']['default'] = 'root';
        } elseif (\Contao\Input::get('mode') == 1) {
            $objPage = $this->Database->prepare("SELECT * FROM " . $dc->table . " WHERE id=?")->limit(1)->execute(\Contao\Input::get('pid'));
            if ($objPage->pid == 0) {
                $GLOBALS['TL_DCA']['tl_page']['fields']['type']['default'] = 'root';
            }
        }
    }
    /**
     * Make sure that top-level pages are root pages
     *
     * @param mixed                $varValue
     * @param Contao\DataContainer $dc
     *
     * @return mixed
     *
     * @throws Exception
     */
    public function checkRootType($varValue, \Contao\DataContainer $dc)
    {
        if ($varValue != 'root' && $dc->activeRecord->pid == 0) {
            throw new \Exception($GLOBALS['TL_LANG']['ERR']['topLevelRoot']);
        }
        return $varValue;
    }
    /**
     * Return the SERP URL
     *
     * @param Contao\PageModel $model
     *
     * @return string
     */
    public function getSerpUrl(\Contao\PageModel $model)
    {
        return $model->getAbsoluteUrl();
    }
    /**
     * Return the title tag from the associated page layout
     *
     * @param Contao\PageModel $page
     *
     * @return string
     */
    public function getTitleTag(\Contao\PageModel $page)
    {
        $page->loadDetails();
        /** @var Contao\LayoutModel $layout */
        if (!($layout = $page->getRelated('layout'))) {
            return '';
        }
        $origObjPage = $GLOBALS['objPage'] ?? \null;
        // Override the global page object, so we can replace the insert tags
        $GLOBALS['objPage'] = $page;
        $title = \implode('%s', \array_map(static function ($strVal) {
            return \str_replace('%', '%%', self::replaceInsertTags($strVal));
        }, \explode('{{page::pageTitle}}', $layout->titleTag ?: '{{page::pageTitle}} - {{page::rootPageTitle}}', 2)));
        $GLOBALS['objPage'] = $origObjPage;
        return $title;
    }
    /**
     * Show a warning if there is no language fallback page
     */
    public function showFallbackWarning()
    {
        if (\Contao\Input::get('act')) {
            return;
        }
        $messages = new \Contao\Messages();
        \Contao\Message::addRaw($messages->languageFallback());
    }
    /**
     * Make the redirect page mandatory if the page is a logout page
     *
     * @param Contao\DataContainer $dc
     *
     * @throws Exception
     */
    public function makeRedirectPageMandatory(\Contao\DataContainer $dc)
    {
        $objPage = $this->Database->prepare("SELECT * FROM " . $dc->table . " WHERE id=?")->limit(1)->execute($dc->id);
        if ($objPage->numRows && $objPage->type == 'logout') {
            $GLOBALS['TL_DCA']['tl_page']['fields']['jumpTo']['eval']['mandatory'] = \true;
        }
    }
    /**
     * Check for modified pages and update the XML files if necessary
     */
    public function generateSitemap()
    {
        /** @var Symfony\Component\HttpFoundation\Session\SessionInterface $objSession */
        $objSession = \Contao\System::getContainer()->get('session');
        $session = $objSession->get('sitemap_updater');
        if (empty($session) || !\is_array($session)) {
            return;
        }
        $this->import('Contao\\Automator', 'Automator');
        foreach ($session as $id) {
            $this->Automator->generateSitemap($id);
        }
        $objSession->set('sitemap_updater', \null);
    }
    /**
     * Schedule a sitemap update
     *
     * This method is triggered when a single page or multiple pages are
     * modified (edit/editAll), moved (cut/cutAll) or deleted
     * (delete/deleteAll). Since duplicated pages are unpublished by default,
     * it is not necessary to schedule updates on copyAll as well.
     *
     * @param Contao\DataContainer $dc
     */
    public function scheduleUpdate(\Contao\DataContainer $dc)
    {
        // Return if there is no ID
        if (!$dc->activeRecord || !$dc->activeRecord->id || \Contao\Input::get('act') == 'copy') {
            return;
        }
        /** @var Symfony\Component\HttpFoundation\Session\SessionInterface $objSession */
        $objSession = \Contao\System::getContainer()->get('session');
        // Store the ID in the session
        $session = $objSession->get('sitemap_updater');
        $session[] = \Contao\PageModel::findWithDetails($dc->activeRecord->id)->rootId;
        $objSession->set('sitemap_updater', \array_unique($session));
    }
    /**
     * Auto-generate a page alias if it has not been set yet
     *
     * @param mixed                $varValue
     * @param Contao\DataContainer $dc
     *
     * @return string
     *
     * @throws Exception
     */
    public function generateAlias($varValue, \Contao\DataContainer $dc)
    {
        $objPage = \Contao\PageModel::findWithDetails($dc->id);
        $aliasExists = function (string $alias) use($dc, $objPage) : bool {
            $objAliasIds = $this->Database->prepare("SELECT id FROM tl_page WHERE alias=? AND id!=?")->execute($alias, $dc->id);
            if (!$objAliasIds->numRows) {
                return \false;
            }
            $strCurrentDomain = $objPage->domain;
            $strCurrentLanguage = $objPage->rootLanguage;
            if ($objPage->type == 'root') {
                $strCurrentDomain = \Contao\Input::post('dns');
                $strCurrentLanguage = \Contao\Input::post('language');
            }
            while ($objAliasIds->next()) {
                $objAliasPage = \Contao\PageModel::findWithDetails($objAliasIds->id);
                if ($objAliasPage->domain != $strCurrentDomain) {
                    continue;
                }
                if ($objAliasPage->rootLanguage != $strCurrentLanguage && \Contao\Config::get('addLanguageToUrl')) {
                    continue;
                }
                // Duplicate alias found
                return \true;
            }
            return \false;
        };
        // Generate an alias if there is none
        if (!$varValue) {
            $varValue = \Contao\System::getContainer()->get('contao.slug')->generate($dc->activeRecord->title, $dc->activeRecord->id, static function ($alias) use($objPage, $aliasExists) {
                return $aliasExists((\Contao\Config::get('folderUrl') ? $objPage->folderUrl : '') . $alias);
            });
            // Generate folder URL aliases (see #4933)
            if ($objPage->folderUrl && \Contao\Config::get('folderUrl')) {
                $varValue = $objPage->folderUrl . $varValue;
            }
        } elseif (\preg_match('/^[1-9]\\d*$/', $varValue)) {
            throw new \Exception(\sprintf($GLOBALS['TL_LANG']['ERR']['aliasNumeric'], $varValue));
        } elseif ($aliasExists($varValue)) {
            throw new \Exception(\sprintf($GLOBALS['TL_LANG']['ERR']['aliasExists'], $varValue));
        }
        if ($varValue != $dc->activeRecord->alias) {
            $this->purgeSearchIndex($dc);
        }
        return $varValue;
    }
    /**
     * Automatically create an article in the main column of a new page
     *
     * @param Contao\DataContainer $dc
     */
    public function generateArticle(\Contao\DataContainer $dc)
    {
        // Return if there is no active record (override all)
        if (!$dc->activeRecord) {
            return;
        }
        // No title or not a regular page
        if (!$dc->activeRecord->title || !\in_array($dc->activeRecord->type, array('regular', 'error_401', 'error_403', 'error_404'))) {
            return;
        }
        /** @var Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface $objSessionBag */
        $objSessionBag = \Contao\System::getContainer()->get('session')->getBag('contao_backend');
        $new_records = $objSessionBag->get('new_records');
        // Not a new page
        if (!$new_records || !\is_array($new_records[$dc->table]) || !\in_array($dc->id, $new_records[$dc->table])) {
            return;
        }
        // Check whether there are articles (e.g. on copied pages)
        $objTotal = $this->Database->prepare("SELECT COUNT(*) AS count FROM tl_article WHERE pid=?")->execute($dc->id);
        if ($objTotal->count > 0) {
            return;
        }
        // Create article
        $arrSet['pid'] = $dc->id;
        $arrSet['sorting'] = 128;
        $arrSet['tstamp'] = \time();
        $arrSet['author'] = $this->User->id;
        $arrSet['inColumn'] = 'main';
        $arrSet['title'] = $dc->activeRecord->title;
        $arrSet['alias'] = \str_replace('/', '-', $dc->activeRecord->alias);
        // see #5168
        $arrSet['published'] = $dc->activeRecord->published;
        $this->Database->prepare("INSERT INTO tl_article %s")->set($arrSet)->execute();
    }
    /**
     * Purge the search index if a page is being deleted
     *
     * @param Contao\DataContainer $dc
     */
    public function purgeSearchIndex(\Contao\DataContainer $dc)
    {
        if (!$dc->id) {
            return;
        }
        $objResult = $this->Database->prepare("SELECT id FROM tl_search WHERE pid=?")->execute($dc->id);
        while ($objResult->next()) {
            $this->Database->prepare("DELETE FROM tl_search WHERE id=?")->execute($objResult->id);
            $this->Database->prepare("DELETE FROM tl_search_index WHERE pid=?")->execute($objResult->id);
        }
    }
    /**
     * Check the sitemap alias
     *
     * @param mixed                $varValue
     * @param Contao\DataContainer $dc
     *
     * @return mixed
     *
     * @throws Exception
     */
    public function checkFeedAlias($varValue, \Contao\DataContainer $dc)
    {
        // No change or empty value
        if (!$varValue || $varValue == $dc->value) {
            return $varValue;
        }
        $varValue = \Contao\StringUtil::standardize($varValue);
        // see #5096
        $this->import('Contao\\Automator', 'Automator');
        $arrFeeds = $this->Automator->purgeXmlFiles(\true);
        // Alias exists
        if (\in_array($varValue, $arrFeeds)) {
            throw new \Exception(\sprintf($GLOBALS['TL_LANG']['ERR']['aliasExists'], $varValue));
        }
        return $varValue;
    }
    /**
     * Prevent circular references
     *
     * @param mixed                $varValue
     * @param Contao\DataContainer $dc
     *
     * @return mixed
     *
     * @throws Exception
     */
    public function checkJumpTo($varValue, \Contao\DataContainer $dc)
    {
        if ($varValue == $dc->id) {
            throw new \Exception($GLOBALS['TL_LANG']['ERR']['circularReference']);
        }
        return $varValue;
    }
    /**
     * Load the DNS settings
     *
     * @param string $varValue
     *
     * @return string
     */
    public function loadDns($varValue)
    {
        return \Contao\Idna::decode($varValue);
    }
    /**
     * Check the DNS settings
     *
     * @param string $varValue
     *
     * @return string
     */
    public function checkDns($varValue)
    {
        return \Contao\Idna::encode(\preg_replace('#^(?:[a-z]+://)?([\\pN\\pL[\\].:_-]+).*$#iu', '$1', $varValue));
    }
    /**
     * Make sure there is only one fallback per domain (thanks to Andreas Schempp)
     *
     * @param mixed                $varValue
     * @param Contao\DataContainer $dc
     *
     * @return mixed
     *
     * @throws Exception
     */
    public function checkFallback($varValue, \Contao\DataContainer $dc)
    {
        if (!$varValue) {
            return '';
        }
        $objPage = $this->Database->prepare("SELECT id FROM tl_page WHERE type='root' AND fallback=1 AND dns=? AND id!=?")->execute($dc->activeRecord->dns, $dc->activeRecord->id);
        if ($objPage->numRows) {
            throw new \Exception($GLOBALS['TL_LANG']['ERR']['multipleFallback']);
        }
        return $varValue;
    }
    /**
     * Check a static URL
     *
     * @param mixed $varValue
     *
     * @return mixed
     */
    public function checkStaticUrl($varValue)
    {
        if ($varValue) {
            $varValue = \preg_replace('@https?://@', '', $varValue);
        }
        return $varValue;
    }
    /**
     * Returns all allowed page types as array
     *
     * @param Contao\DataContainer $dc
     *
     * @return array
     */
    public function getPageTypes(\Contao\DataContainer $dc)
    {
        $arrOptions = array();
        foreach (\array_keys($GLOBALS['TL_PTY']) as $pty) {
            // Root pages are allowed on the first level only (see #6360)
            if ($pty == 'root' && $dc->activeRecord && $dc->activeRecord->pid > 0) {
                continue;
            }
            // Allow the currently selected option and anything the user has access to
            if ($pty == $dc->value || $this->User->hasAccess($pty, 'alpty')) {
                $arrOptions[] = $pty;
            }
        }
        return $arrOptions;
    }
    /**
     * Return all page layouts grouped by theme
     *
     * @return array
     */
    public function getPageLayouts()
    {
        $objLayout = $this->Database->execute("SELECT l.id, l.name, t.name AS theme FROM tl_layout l LEFT JOIN tl_theme t ON l.pid=t.id ORDER BY t.name, l.name");
        if ($objLayout->numRows < 1) {
            return array();
        }
        $return = array();
        while ($objLayout->next()) {
            $return[$objLayout->theme][$objLayout->id] = $objLayout->name;
        }
        return $return;
    }
    /**
     * Add an image to each page in the tree
     *
     * @param array                $row
     * @param string               $label
     * @param Contao\DataContainer $dc
     * @param string               $imageAttribute
     * @param boolean              $blnReturnImage
     * @param boolean              $blnProtected
     *
     * @return string
     */
    public function addIcon($row, $label, \Contao\DataContainer $dc = \null, $imageAttribute = '', $blnReturnImage = \false, $blnProtected = \false)
    {
        return \Contao\Backend::addPageIcon($row, $label, $dc, $imageAttribute, $blnReturnImage, $blnProtected);
    }
    /**
     * Return the edit page button
     *
     * @param array  $row
     * @param string $href
     * @param string $label
     * @param string $title
     * @param string $icon
     * @param string $attributes
     *
     * @return string
     */
    public function editPage($row, $href, $label, $title, $icon, $attributes)
    {
        return $this->User->hasAccess($row['type'], 'alpty') && $this->User->isAllowed(\Contao\BackendUser::CAN_EDIT_PAGE, $row) ? '<a href="' . $this->addToUrl($href . '&amp;id=' . $row['id']) . '" title="' . \Contao\StringUtil::specialchars($title) . '"' . $attributes . '>' . \Contao\Image::getHtml($icon, $label) . '</a> ' : \Contao\Image::getHtml(\preg_replace('/\\.svg$/i', '_.svg', $icon)) . ' ';
    }
    /**
     * Return the copy page button
     *
     * @param array  $row
     * @param string $href
     * @param string $label
     * @param string $title
     * @param string $icon
     * @param string $attributes
     * @param string $table
     *
     * @return string
     */
    public function copyPage($row, $href, $label, $title, $icon, $attributes, $table)
    {
        if ($GLOBALS['TL_DCA'][$table]['config']['closed']) {
            return '';
        }
        return $this->User->hasAccess($row['type'], 'alpty') && $this->User->isAllowed(\Contao\BackendUser::CAN_EDIT_PAGE_HIERARCHY, $row) ? '<a href="' . $this->addToUrl($href . '&amp;id=' . $row['id']) . '" title="' . \Contao\StringUtil::specialchars($title) . '"' . $attributes . '>' . \Contao\Image::getHtml($icon, $label) . '</a> ' : \Contao\Image::getHtml(\preg_replace('/\\.svg$/i', '_.svg', $icon)) . ' ';
    }
    /**
     * Return the copy page with subpages button
     *
     * @param array  $row
     * @param string $href
     * @param string $label
     * @param string $title
     * @param string $icon
     * @param string $attributes
     * @param string $table
     *
     * @return string
     */
    public function copyPageWithSubpages($row, $href, $label, $title, $icon, $attributes, $table)
    {
        if ($GLOBALS['TL_DCA'][$table]['config']['closed']) {
            return '';
        }
        $objSubpages = \Contao\PageModel::findByPid($row['id']);
        return $objSubpages !== \null && $objSubpages->count() > 0 && $this->User->hasAccess($row['type'], 'alpty') && $this->User->isAllowed(\Contao\BackendUser::CAN_EDIT_PAGE_HIERARCHY, $row) ? '<a href="' . $this->addToUrl($href . '&amp;id=' . $row['id']) . '" title="' . \Contao\StringUtil::specialchars($title) . '"' . $attributes . '>' . \Contao\Image::getHtml($icon, $label) . '</a> ' : \Contao\Image::getHtml(\preg_replace('/\\.svg$/i', '_.svg', $icon)) . ' ';
    }
    /**
     * Return the cut page button
     *
     * @param array  $row
     * @param string $href
     * @param string $label
     * @param string $title
     * @param string $icon
     * @param string $attributes
     *
     * @return string
     */
    public function cutPage($row, $href, $label, $title, $icon, $attributes)
    {
        return $this->User->hasAccess($row['type'], 'alpty') && $this->User->isAllowed(\Contao\BackendUser::CAN_EDIT_PAGE_HIERARCHY, $row) ? '<a href="' . $this->addToUrl($href . '&amp;id=' . $row['id']) . '" title="' . \Contao\StringUtil::specialchars($title) . '"' . $attributes . '>' . \Contao\Image::getHtml($icon, $label) . '</a> ' : \Contao\Image::getHtml(\preg_replace('/\\.svg$/i', '_.svg', $icon)) . ' ';
    }
    /**
     * Return the paste page button
     *
     * @param Contao\DataContainer $dc
     * @param array                $row
     * @param string               $table
     * @param boolean              $cr
     * @param array                $arrClipboard
     *
     * @return string
     */
    public function pastePage(\Contao\DataContainer $dc, $row, $table, $cr, $arrClipboard = \null)
    {
        $disablePA = \false;
        $disablePI = \false;
        // Disable all buttons if there is a circular reference
        if ($arrClipboard !== \false && ($arrClipboard['mode'] == 'cut' && ($cr == 1 || $arrClipboard['id'] == $row['id']) || $arrClipboard['mode'] == 'cutAll' && ($cr == 1 || \in_array($row['id'], $arrClipboard['id'])))) {
            $disablePA = \true;
            $disablePI = \true;
        }
        // Prevent adding non-root pages on top-level
        if ($row['pid'] == 0 && \Contao\Input::get('mode') != 'create') {
            $objPage = $this->Database->prepare("SELECT * FROM " . $table . " WHERE id=?")->limit(1)->execute(\Contao\Input::get('id'));
            if ($objPage->type != 'root') {
                $disablePA = \true;
                if ($row['id'] == 0) {
                    $disablePI = \true;
                }
            }
        }
        // Check permissions if the user is not an administrator
        if (!$this->User->isAdmin) {
            // Disable "paste into" button if there is no permission 2 (move) or 1 (create) for the current page
            if (!$disablePI) {
                if (!$this->User->isAllowed(\Contao\BackendUser::CAN_EDIT_PAGE_HIERARCHY, $row) || \Contao\Input::get('mode') == 'create' && !$this->User->isAllowed(\Contao\BackendUser::CAN_EDIT_PAGE, $row)) {
                    $disablePI = \true;
                }
            }
            // Disable "paste after" button if there is no permission 2 (move) or 1 (create) for the parent page
            if (!$disablePA) {
                /** @var Contao\PageModel $objModel */
                $objModel = \Contao\Model::getClassFromTable($table);
                if (($objPage = $objModel::findById($row['pid'])) !== \null && (!$this->User->isAllowed(\Contao\BackendUser::CAN_EDIT_PAGE_HIERARCHY, $objPage->row()) || \Contao\Input::get('mode') == 'create' && !$this->User->isAllowed(\Contao\BackendUser::CAN_EDIT_PAGE, $objPage->row()))) {
                    $disablePA = \true;
                }
            }
            // Disable "paste after" button if the parent page is a root page and the user is not an administrator
            if (!$disablePA && ($row['pid'] < 1 || \in_array($row['id'], $dc->rootIds))) {
                $disablePA = \true;
            }
        }
        $return = '';
        // Return the buttons
        $imagePasteAfter = \Contao\Image::getHtml('pasteafter.svg', \sprintf($GLOBALS['TL_LANG'][$table]['pasteafter'][1], $row['id']));
        $imagePasteInto = \Contao\Image::getHtml('pasteinto.svg', \sprintf($GLOBALS['TL_LANG'][$table]['pasteinto'][1], $row['id']));
        if ($row['id'] > 0) {
            $return = $disablePA ? \Contao\Image::getHtml('pasteafter_.svg') . ' ' : '<a href="' . $this->addToUrl('act=' . $arrClipboard['mode'] . '&amp;mode=1&amp;pid=' . $row['id'] . (!\is_array($arrClipboard['id']) ? '&amp;id=' . $arrClipboard['id'] : '')) . '" title="' . \Contao\StringUtil::specialchars(\sprintf($GLOBALS['TL_LANG'][$table]['pasteafter'][1], $row['id'])) . '" onclick="Backend.getScrollOffset()">' . $imagePasteAfter . '</a> ';
        }
        return $return . ($disablePI ? \Contao\Image::getHtml('pasteinto_.svg') . ' ' : '<a href="' . $this->addToUrl('act=' . $arrClipboard['mode'] . '&amp;mode=2&amp;pid=' . $row['id'] . (!\is_array($arrClipboard['id']) ? '&amp;id=' . $arrClipboard['id'] : '')) . '" title="' . \Contao\StringUtil::specialchars(\sprintf($GLOBALS['TL_LANG'][$table]['pasteinto'][$row['id'] > 0 ? 1 : 0], $row['id'])) . '" onclick="Backend.getScrollOffset()">' . $imagePasteInto . '</a> ');
    }
    /**
     * Return the delete page button
     *
     * @param array  $row
     * @param string $href
     * @param string $label
     * @param string $title
     * @param string $icon
     * @param string $attributes
     *
     * @return string
     */
    public function deletePage($row, $href, $label, $title, $icon, $attributes)
    {
        $root = \func_get_arg(7);
        return $this->User->hasAccess($row['type'], 'alpty') && $this->User->isAllowed(\Contao\BackendUser::CAN_DELETE_PAGE, $row) && ($this->User->isAdmin || !\in_array($row['id'], $root)) ? '<a href="' . $this->addToUrl($href . '&amp;id=' . $row['id']) . '" title="' . \Contao\StringUtil::specialchars($title) . '"' . $attributes . '>' . \Contao\Image::getHtml($icon, $label) . '</a> ' : \Contao\Image::getHtml(\preg_replace('/\\.svg$/i', '_.svg', $icon)) . ' ';
    }
    /**
     * Generate an "edit articles" button and return it as string
     *
     * @param array  $row
     * @param string $href
     * @param string $label
     * @param string $title
     * @param string $icon
     *
     * @return string
     */
    public function editArticles($row, $href, $label, $title, $icon)
    {
        if (!$this->User->hasAccess('article', 'modules')) {
            return '';
        }
        return $row['type'] == 'regular' || $row['type'] == 'error_401' || $row['type'] == 'error_403' || $row['type'] == 'error_404' ? '<a href="' . $this->addToUrl($href . '&amp;pn=' . $row['id']) . '" title="' . \Contao\StringUtil::specialchars($title) . '">' . \Contao\Image::getHtml($icon, $label) . '</a> ' : \Contao\Image::getHtml(\preg_replace('/\\.svg$/i', '_.svg', $icon)) . ' ';
    }
    /**
     * Automatically generate the folder URL aliases
     *
     * @param array                $arrButtons
     * @param Contao\DataContainer $dc
     *
     * @return array
     */
    public function addAliasButton($arrButtons, \Contao\DataContainer $dc)
    {
        if (!$this->User->hasAccess('tl_page::alias', 'alexf')) {
            return $arrButtons;
        }
        // Generate the aliases
        if (isset($_POST['alias']) && \Contao\Input::post('FORM_SUBMIT') == 'tl_select') {
            /** @var Symfony\Component\HttpFoundation\Session\SessionInterface $objSession */
            $objSession = \Contao\System::getContainer()->get('session');
            $session = $objSession->all();
            $ids = $session['CURRENT']['IDS'];
            foreach ($ids as $id) {
                $objPage = \Contao\PageModel::findWithDetails($id);
                if ($objPage === \null) {
                    continue;
                }
                $dc->id = $id;
                $dc->activeRecord = $objPage;
                $strAlias = '';
                // Generate new alias through save callbacks
                foreach ($GLOBALS['TL_DCA'][$dc->table]['fields']['alias']['save_callback'] as $callback) {
                    if (\is_array($callback)) {
                        $this->import($callback[0]);
                        $strAlias = $this->{$callback[0]}->{$callback[1]}($strAlias, $dc);
                    } elseif (\is_callable($callback)) {
                        $strAlias = $callback($strAlias, $dc);
                    }
                }
                // The alias has not changed
                if ($strAlias == $objPage->alias) {
                    continue;
                }
                // Initialize the version manager
                $objVersions = new \Contao\Versions('tl_page', $id);
                $objVersions->initialize();
                // Store the new alias
                $this->Database->prepare("UPDATE tl_page SET alias=? WHERE id=?")->execute($strAlias, $id);
                // Create a new version
                $objVersions->create();
            }
            $this->redirect($this->getReferer());
        }
        // Add the button
        $arrButtons['alias'] = '<button type="submit" name="alias" id="alias" class="tl_submit" accesskey="a">' . $GLOBALS['TL_LANG']['MSC']['aliasSelected'] . '</button> ';
        return $arrButtons;
    }
    /**
     * Return the "toggle visibility" button
     *
     * @param array  $row
     * @param string $href
     * @param string $label
     * @param string $title
     * @param string $icon
     * @param string $attributes
     *
     * @return string
     */
    public function toggleIcon($row, $href, $label, $title, $icon, $attributes)
    {
        if (\Contao\Input::get('tid')) {
            $this->toggleVisibility(\Contao\Input::get('tid'), \Contao\Input::get('state') == 1, \func_num_args() <= 12 ? \null : \func_get_arg(12));
            $this->redirect($this->getReferer());
        }
        // Check permissions AFTER checking the tid, so hacking attempts are logged
        if (!$this->User->hasAccess('tl_page::published', 'alexf')) {
            return '';
        }
        $href .= '&amp;tid=' . $row['id'] . '&amp;state=' . ($row['published'] ? '' : 1);
        if (!$row['published']) {
            $icon = 'invisible.svg';
        }
        if (!$this->User->hasAccess($row['type'], 'alpty') || ($objPage = \Contao\PageModel::findById($row['id'])) === \null || !$this->User->isAllowed(\Contao\BackendUser::CAN_EDIT_PAGE, $objPage->row())) {
            return \Contao\Image::getHtml($icon) . ' ';
        }
        return '<a href="' . $this->addToUrl($href) . '" title="' . \Contao\StringUtil::specialchars($title) . '"' . $attributes . '>' . \Contao\Image::getHtml($icon, $label, 'data-state="' . ($row['published'] ? 1 : 0) . '"') . '</a> ';
    }
    /**
     * Disable/enable a user group
     *
     * @param integer              $intId
     * @param boolean              $blnVisible
     * @param Contao\DataContainer $dc
     *
     * @throws Contao\CoreBundle\Exception\AccessDeniedException
     */
    public function toggleVisibility($intId, $blnVisible, \Contao\DataContainer $dc = \null)
    {
        // Set the ID and action
        \Contao\Input::setGet('id', $intId);
        \Contao\Input::setGet('act', 'toggle');
        if ($dc) {
            $dc->id = $intId;
            // see #8043
        }
        // Trigger the onload_callback
        if (\is_array($GLOBALS['TL_DCA']['tl_page']['config']['onload_callback'])) {
            foreach ($GLOBALS['TL_DCA']['tl_page']['config']['onload_callback'] as $callback) {
                if (\is_array($callback)) {
                    $this->import($callback[0]);
                    $this->{$callback[0]}->{$callback[1]}($dc);
                } elseif (\is_callable($callback)) {
                    $callback($dc);
                }
            }
        }
        // Check the field access
        if (!$this->User->hasAccess('tl_page::published', 'alexf')) {
            throw new \Contao\CoreBundle\Exception\AccessDeniedException('Not enough permissions to publish/unpublish page ID ' . $intId . '.');
        }
        $objRow = $this->Database->prepare("SELECT * FROM tl_page WHERE id=?")->limit(1)->execute($intId);
        if ($objRow->numRows < 1) {
            throw new \Contao\CoreBundle\Exception\AccessDeniedException('Invalid page ID ' . $intId . '.');
        }
        // Set the current record
        if ($dc) {
            $dc->activeRecord = $objRow;
        }
        $objVersions = new \Contao\Versions('tl_page', $intId);
        $objVersions->initialize();
        // Trigger the save_callback
        if (\is_array($GLOBALS['TL_DCA']['tl_page']['fields']['published']['save_callback'])) {
            foreach ($GLOBALS['TL_DCA']['tl_page']['fields']['published']['save_callback'] as $callback) {
                if (\is_array($callback)) {
                    $this->import($callback[0]);
                    $blnVisible = $this->{$callback[0]}->{$callback[1]}($blnVisible, $dc);
                } elseif (\is_callable($callback)) {
                    $blnVisible = $callback($blnVisible, $dc);
                }
            }
        }
        $time = \time();
        // Update the database
        $this->Database->prepare("UPDATE tl_page SET tstamp={$time}, published='" . ($blnVisible ? '1' : '') . "' WHERE id=?")->execute($intId);
        if ($dc) {
            $dc->activeRecord->tstamp = $time;
            $dc->activeRecord->published = $blnVisible ? '1' : '';
        }
        // Trigger the onsubmit_callback
        if (\is_array($GLOBALS['TL_DCA']['tl_page']['config']['onsubmit_callback'])) {
            foreach ($GLOBALS['TL_DCA']['tl_page']['config']['onsubmit_callback'] as $callback) {
                if (\is_array($callback)) {
                    $this->import($callback[0]);
                    $this->{$callback[0]}->{$callback[1]}($dc);
                } elseif (\is_callable($callback)) {
                    $callback($dc);
                }
            }
        }
        $objVersions->create();
        // The onsubmit_callback has triggered scheduleUpdate(), so run generateSitemap() now
        $this->generateSitemap();
        if ($dc) {
            $dc->invalidateCacheTags();
        }
    }
}
}
