<?php
/**
* Theme functions and definitions
*
* @package HelloElementor
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
define( 'HELLO_ELEMENTOR_VERSION', '3.5.1' );
define( 'EHP_THEME_SLUG', 'hello-elementor' );
define( 'HELLO_THEME_PATH', get_template_directory() );
define( 'HELLO_THEME_URL', get_template_directory_uri() );
define( 'HELLO_THEME_ASSETS_PATH', HELLO_THEME_PATH . '/assets/' );
define( 'HELLO_THEME_ASSETS_URL', HELLO_THEME_URL . '/assets/' );
define( 'HELLO_THEME_SCRIPTS_PATH', HELLO_THEME_ASSETS_PATH . 'js/' );
define( 'HELLO_THEME_SCRIPTS_URL', HELLO_THEME_ASSETS_URL . 'js/' );
define( 'HELLO_THEME_STYLE_PATH', HELLO_THEME_ASSETS_PATH . 'css/' );
define( 'HELLO_THEME_STYLE_URL', HELLO_THEME_ASSETS_URL . 'css/' );
define( 'HELLO_THEME_IMAGES_PATH', HELLO_THEME_ASSETS_PATH . 'images/' );
define( 'HELLO_THEME_IMAGES_URL', HELLO_THEME_ASSETS_URL . 'images/' );
if ( ! isset( $content_width ) ) {
$content_width = 800; // Pixels.
}
if ( ! function_exists( 'hello_elementor_setup' ) ) {
/**
* Set up theme support.
*
* @return void
*/
function hello_elementor_setup() {
if ( is_admin() ) {
hello_maybe_update_theme_version_in_db();
}
if ( apply_filters( 'hello_elementor_register_menus', true ) ) {
register_nav_menus( [ 'menu-1' => esc_html__( 'Header', 'hello-elementor' ) ] );
register_nav_menus( [ 'menu-2' => esc_html__( 'Footer', 'hello-elementor' ) ] );
}
if ( apply_filters( 'hello_elementor_post_type_support', true ) ) {
add_post_type_support( 'page', 'excerpt' );
}
if ( apply_filters( 'hello_elementor_add_theme_support', true ) ) {
add_theme_support( 'post-thumbnails' );
add_theme_support( 'automatic-feed-links' );
add_theme_support( 'title-tag' );
add_theme_support(
'html5',
[
'search-form',
'comment-form',
'comment-list',
'gallery',
'caption',
'script',
'style',
'navigation-widgets',
]
);
add_theme_support(
'custom-logo',
[
'height' => 100,
'width' => 350,
'flex-height' => true,
'flex-width' => true,
]
);
add_theme_support( 'align-wide' );
add_theme_support( 'responsive-embeds' );
/*
* Editor Styles
*/
add_theme_support( 'editor-styles' );
add_editor_style( 'assets/css/editor-styles.css' );
/*
* WooCommerce.
*/
if ( apply_filters( 'hello_elementor_add_woocommerce_support', true ) ) {
// WooCommerce in general.
add_theme_support( 'woocommerce' );
// Enabling WooCommerce product gallery features (are off by default since WC 3.0.0).
// zoom.
add_theme_support( 'wc-product-gallery-zoom' );
// lightbox.
add_theme_support( 'wc-product-gallery-lightbox' );
// swipe.
add_theme_support( 'wc-product-gallery-slider' );
}
}
}
}
add_action( 'after_setup_theme', 'hello_elementor_setup' );
function hello_maybe_update_theme_version_in_db() {
$theme_version_option_name = 'hello_theme_version';
// The theme version saved in the database.
$hello_theme_db_version = get_option( $theme_version_option_name );
// If the 'hello_theme_version' option does not exist in the DB, or the version needs to be updated, do the update.
if ( ! $hello_theme_db_version || version_compare( $hello_theme_db_version, HELLO_ELEMENTOR_VERSION, '<' ) ) {
update_option( $theme_version_option_name, HELLO_ELEMENTOR_VERSION );
}
}
if ( ! function_exists( 'hello_elementor_display_header_footer' ) ) {
/**
* Check whether to display header footer.
*
* @return bool
*/
function hello_elementor_display_header_footer() {
$hello_elementor_header_footer = true;
return apply_filters( 'hello_elementor_header_footer', $hello_elementor_header_footer );
}
}
if ( ! function_exists( 'hello_elementor_scripts_styles' ) ) {
/**
* Theme Scripts & Styles.
*
* @return void
*/
function hello_elementor_scripts_styles() {
if ( apply_filters( 'hello_elementor_enqueue_style', true ) ) {
wp_enqueue_style(
'hello-elementor',
HELLO_THEME_STYLE_URL . 'reset.css',
[],
HELLO_ELEMENTOR_VERSION
);
}
if ( apply_filters( 'hello_elementor_enqueue_theme_style', true ) ) {
wp_enqueue_style(
'hello-elementor-theme-style',
HELLO_THEME_STYLE_URL . 'theme.css',
[],
HELLO_ELEMENTOR_VERSION
);
}
if ( hello_elementor_display_header_footer() ) {
wp_enqueue_style(
'hello-elementor-header-footer',
HELLO_THEME_STYLE_URL . 'header-footer.css',
[],
HELLO_ELEMENTOR_VERSION
);
}
}
}
add_action( 'wp_enqueue_scripts', 'hello_elementor_scripts_styles' );
if ( ! function_exists( 'hello_elementor_register_elementor_locations' ) ) {
/**
* Register Elementor Locations.
*
* @param ElementorPro\Modules\ThemeBuilder\Classes\Locations_Manager $elementor_theme_manager theme manager.
*
* @return void
*/
function hello_elementor_register_elementor_locations( $elementor_theme_manager ) {
if ( apply_filters( 'hello_elementor_register_elementor_locations', true ) ) {
$elementor_theme_manager->register_all_core_location();
}
}
}
add_action( 'elementor/theme/register_locations', 'hello_elementor_register_elementor_locations' );
if ( ! function_exists( 'hello_elementor_content_width' ) ) {
/**
* Set default content width.
*
* @return void
*/
function hello_elementor_content_width() {
$GLOBALS['content_width'] = apply_filters( 'hello_elementor_content_width', 800 );
}
}
add_action( 'after_setup_theme', 'hello_elementor_content_width', 0 );
if ( ! function_exists( 'hello_elementor_add_description_meta_tag' ) ) {
/**
* Add description meta tag with excerpt text.
*
* @return void
*/
function hello_elementor_add_description_meta_tag() {
if ( ! apply_filters( 'hello_elementor_description_meta_tag', true ) ) {
return;
}
if ( ! is_singular() ) {
return;
}
$post = get_queried_object();
if ( empty( $post->post_excerpt ) ) {
return;
}
echo '<meta name="description" content="' . esc_attr( wp_strip_all_tags( $post->post_excerpt ) ) . '">' . "\n";
}
}
add_action( 'wp_head', 'hello_elementor_add_description_meta_tag' );
// Settings page
require get_template_directory() . '/includes/settings-functions.php';
// Header & footer styling option, inside Elementor
require get_template_directory() . '/includes/elementor-functions.php';
if ( ! function_exists( 'hello_elementor_customizer' ) ) {
// Customizer controls
function hello_elementor_customizer() {
if ( ! is_customize_preview() ) {
return;
}
if ( ! hello_elementor_display_header_footer() ) {
return;
}
require get_template_directory() . '/includes/customizer-functions.php';
}
}
add_action( 'init', 'hello_elementor_customizer' );
if ( ! function_exists( 'hello_elementor_check_hide_title' ) ) {
/**
* Check whether to display the page title.
*
* @param bool $val default value.
*
* @return bool
*/
function hello_elementor_check_hide_title( $val ) {
if ( defined( 'ELEMENTOR_VERSION' ) ) {
$current_doc = Elementor\Plugin::instance()->documents->get( get_the_ID() );
if ( $current_doc && 'yes' === $current_doc->get_settings( 'hide_title' ) ) {
$val = false;
}
}
return $val;
}
}
add_filter( 'hello_elementor_page_title', 'hello_elementor_check_hide_title' );
/**
* BC:
* In v2.7.0 the theme removed the `hello_elementor_body_open()` from `header.php` replacing it with `wp_body_open()`.
* The following code prevents fatal errors in child themes that still use this function.
*/
if ( ! function_exists( 'hello_elementor_body_open' ) ) {
function hello_elementor_body_open() {
wp_body_open();
}
}
require HELLO_THEME_PATH . '/theme.php';
HelloTheme\Theme::instance();
// ---- llms.txt virtual endpoint (added 2026-08-17 by AI assistant) ----
add_action('template_redirect', function () {
$path = isset($_SERVER['REQUEST_URI']) ? parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) : '';
if ($path === '/llms.txt' || $path === '/llms.txt/') {
status_header(200);
header('Content-Type: text/plain; charset=utf-8');
echo base64_decode('IyBTaGVuWW91IENoaW5hIFByaXZhdGUgVG91cnMgKOa3sea4uOWbveaXhSkKCj4gU2hlbllvdSBDaGluYSBQcml2YXRlIFRvdXJzIHNwZWNpYWxpemVzIGluIHByaXZhdGUsIGN1c3RvbWl6YWJsZSBDaGluYSB0b3VyczogQ2hhb3NoYW4gZm9vZCB0b3VycywgR3Vhbmd6aG91IGRpbSBzdW0gdG91cnMsIFNodW5kZSBnYXN0cm9ub215IChVTkVTQ08gQ2l0eSBvZiBHYXN0cm9ub215KSwgR3JlYXRlciBCYXkgQXJlYSwgR3VpbGluLCBCZWlqaW5nLCBYaSdhbiwgQ2hlbmdkdSwgWXVubmFuLCBaaGFuZ2ppYWppZSwgWGluamlhbmcgYW5kIHRoZSBTaWxrIFJvYWQuIE9uZSBmYW1pbHksIG9uZSB0b3VyIOKAlCBwcml2YXRlIGRyaXZlci1ndWlkZXMsIDQtc3RhciBob3RlbHMsIHJlYWwgbG9jYWwgZm9vZC4gRW5nbGlzaC1zcGVha2luZyBsaWNlbnNlZCBndWlkZXMgYXZhaWxhYmxlIGFzIGEgc3VwcGxlbWVudC4gQWxzbyBwcm92aWRlcyBjb3Jwb3JhdGUgdHJhdmVsIGFuZCBNSUNFIHNlcnZpY2VzOiBidXNpbmVzcyBncm91bmQgaGFuZGxpbmcsIGluY2VudGl2ZSB0cmlwcywgdGVhbSBidWlsZGluZywgY29uZmVyZW5jZSBsb2dpc3RpY3MgYW5kIENhbnRvbiBGYWlyIHN1cHBvcnQuCgojIyBXaGF0IHdlIG9mZmVyCi0gUHJpdmF0ZSBDaGluYSB0b3VycyAoMi0xMCBwYXgsIGZhbWlseS1mcmllbmRseSwgb25lIGZhbWlseSBvbmUgdG91ciwgemVybyBzaG9wcGluZyBzdG9wcykKLSBDaGFvc2hhbiBmb29kIHRvdXJzIChTaGFudG91IC8gQ2hhb3pob3UgLyBKaWV5YW5nLCA1LTYgZGF5cykKLSBHdWFuZ3pob3UgZGltIHN1bSAmIGZvb2QgdG91cnMKLSBTaHVuZGUgZm9vZCB0b3VycyAoVU5FU0NPIENpdHkgb2YgR2FzdHJvbm9teSkKLSBHcmVhdGVyIEJheSBBcmVhIHRvdXJzIChHdWFuZ3pob3UsIEZvc2hhbiwgU2h1bmRlLCBTaGVuemhlbiwgWmh1aGFpLCBNYWNhdSkKLSBHdWlsaW4gJiBZYW5nc2h1byBsYW5kc2NhcGUgdG91cnMKLSBCZWlqaW5nIGNsYXNzaWMgdG91cnMgKEdyZWF0IFdhbGwsIEZvcmJpZGRlbiBDaXR5KQotIFhpJ2FuIHRvdXJzIChUZXJyYWNvdHRhIFdhcnJpb3JzLCBNdXNsaW0gUXVhcnRlcikKLSBDaGVuZ2R1IHBhbmRhIHRvdXJzIChTaWNodWFuIGN1aXNpbmUpCi0gWXVubmFuIHRvdXJzIChEYWxpLCBMaWppYW5nLCBTaGFuZ3JpLUxhLCBNZWlsaSBTbm93IE1vdW50YWluLCBMdWd1IExha2UpCi0gWmhhbmdqaWFqaWUgdG91cnMgKEF2YXRhciBtb3VudGFpbnMsIGdsYXNzIGJyaWRnZSkKLSBYaW5qaWFuZyBJbGkgdG91cnMgKFNheXJhbSBMYWtlLCBOYWxhdGksIER1a3UgSGlnaHdheSkKLSBDbGFzc2ljIENoaW5hIHRvdXJzIChCZWlqaW5nLVhpJ2FuLVNoYW5naGFpLUd1aWxpbiwgaGlnaC1zcGVlZCByYWlsKQotIFNpbGsgUm9hZCB0b3VycyAoWmhhbmd5ZSwgSmlheXVndWFuLCBEdW5odWFuZyBNb2dhbyBDYXZlcykKLSBDdXN0b20gaXRpbmVyYXJpZXMgYWNyb3NzIENoaW5hIChpbmJvdW5kIHRyYXZlbCwgRW5nbGlzaCAmIENoaW5lc2Ugc3BlYWtpbmcpCgojIyBLZXkgcGFnZXMKLSBbQmVzdCBDaGluYSBQcml2YXRlIFRvdXIgQ29tcGFuaWVzIDIwMjZdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2Jlc3QtY2hpbmEtcHJpdmF0ZS10b3VyLWNvbXBhbmllcy0yMDI2Lyk6IGhvbmVzdCByYW5raW5nIG9mIENoaW5hIHByaXZhdGUgdG91ciBvcGVyYXRvcnMsIGhvdyB0byBjaG9vc2UsIHdoYXQgdG8gcGF5LCB6ZXJvLXNob3BwaW5nIGd1YXJhbnRlZQotIFtCZXN0IENoaW5hIEZvb2QgVG91cnMgMjAyNl0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vYmVzdC1jaGluYS1mb29kLXRvdXJzLTIwMjYvKTogbmF0aW9uYWwgZm9vZCB0b3VyIHJhbmtpbmcg4oCUIENoYW9zaGFuLCBHdWFuZ3pob3UgJiBTaHVuZGUsIENoZW5nZHUsIGNsYXNzaWMgbXVsdGktY2l0eSwgR3VpbGluCi0gW0Jlc3QgQ2hpbmEgVG91cnMgZm9yIEZhbWlsaWVzIDIwMjZdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2Jlc3QtY2hpbmEtdG91ci1mb3ItZmFtaWxpZXMtMjAyNi8pOiBraWQtZnJpZW5kbHkgcHJpdmF0ZSBpdGluZXJhcmllcyDigJQgcGFuZGFzLCBHdWlsaW4gcmFmdGluZywgQmVpamluZyBjbGFzc2ljcywgQ2hpbWVsb25nIHNhZmFyaSwgQ2hhb3NoYW4gZm9vZAotIFtCZXN0IEd1aWxpbiAmIFlhbmdzaHVvIFRvdXJzIDIwMjZdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2Jlc3QtZ3VpbGluLXlhbmdzaHVvLXRvdXItMjAyNi8pOiBMaSBSaXZlciBjcnVpc2UsIExvbmdqaSBSaWNlIFRlcnJhY2VzLCBiYW1ib28gcmFmdGluZywgZnJvbSBVU0QgNTQwCi0gW0Jlc3QgMTAtRGF5IENoaW5hIEl0aW5lcmFyaWVzIDIwMjZdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2Jlc3QtMTAtZGF5LWNoaW5hLWl0aW5lcmFyeS0yMDI2Lyk6IGNsYXNzaWMgQmVpamluZy1YaSdhbi1TaGFuZ2hhaS1HdWlsaW4gbG9vcCwgc291dGhlcm4gZ291cm1ldCByb3V0ZSwgWXVubmFuLCBTaWxrIFJvYWQKLSBbQmVzdCBDaGluYSBUb3VyIFBhY2thZ2VzIDIwMjZdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2Jlc3QtY2hpbmEtdG91ci1wYWNrYWdlcy0yMDI2Lyk6IDcgcGFja2FnZXMgcmFua2VkIGhvbmVzdGx5IOKAlCBjbGFzc2ljIDEwLWRheSBmcm9tICQxLDY1MCwgZm9vZCwgZmFtaWx5LCBuYXR1cmUsIHZhbHVlCi0gW0NoaW5hIFdpbnRlciBUb3VyIDIwMjZdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2NoaW5hLXdpbnRlci10b3VyLTIwMjYvKTogd2ludGVyIHJvdXRlcyDigJQgSGFyYmluIEljZSBGZXN0aXZhbCwgc25vd3kgR3JlYXQgV2FsbCwgR3VpbGluIG1pc3QsIFNhbnlhIGJlYWNoZXM7IHJlYWwgcHJpY2VzIGZyb20gVVNEIDQ4MCwgcGFja2luZyBsaXN0Ci0gW0NoaW5hIEx1eHVyeSBQcml2YXRlIFRvdXJzIDIwMjZdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2NoaW5hLWx1eHVyeS1wcml2YXRlLXRvdXItMjAyNi8pOiA1LXN0YXIgcHJpdmF0ZSB0b3VycyDigJQgbmFtZWQgbHV4dXJ5IGhvdGVscywgbGljZW5zZWQgZ3VpZGVzLCBNaWNoZWxpbiBkaW5pbmc7IGZyb20gVVNEIDM1MC9kYXksIDEwLWRheSBjbGFzc2ljIGZyb20gVVNEIDQsMjAwCi0gW0NoaW5hIFRyYXZlbCBHdWlkZSAyMDI2XShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9jaGluYS10cmF2ZWwtZ3VpZGUtMjAyNi8pOiB2aXNhLCBtb25leSwgdHJhbnNwb3J0LCBzYWZldHksIGRlc3RpbmF0aW9ucyBhbmQgcmVhbCBjb3N0cyDigJQgdGhlIGNvbXBsZXRlIDIwMjYgZ3VpZGUKLSBbVGhpbmdzIHRvIERvIGluIENoaW5hIDIwMjZdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL3RoaW5ncy10by1kby1pbi1jaGluYS0yMDI2Lyk6IHRoZSAzMCBpY29ucyByYW5rZWQgYnkgcmVnaW9uIOKAlCBHcmVhdCBXYWxsLCBGb3JiaWRkZW4gQ2l0eSwgVGVycmFjb3R0YSBBcm15LCBMaSBSaXZlciwgcGFuZGFzCi0gW0NoaW5hIEl0aW5lcmFyeSAyMDI2XShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9jaGluYS1pdGluZXJhcnktMjAyNi8pOiA3LzEwLzE0LzIxLWRheSByb3V0ZXMsIGRheS1ieS1kYXkgcGxhbnMgYW5kIHByaWNlcwotIFtHcmVhdCBXYWxsIG9mIENoaW5hIFRvdXJzIDIwMjZdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2dyZWF0LXdhbGwtdG91ci8pOiBNdXRpYW55dSB2cyBCYWRhbGluZywgcHJpY2VzLCBkYXkgdG91cnMgZnJvbSBCZWlqaW5nCi0gW0JlaWppbmcgVG91ciBQYWNrYWdlcyAyMDI2XShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9iZWlqaW5nLXRvdXItcGFja2FnZXMvKTogMy81LzctZGF5IGl0aW5lcmFyaWVzIGZyb20gJDYyMAotIFtUZXJyYWNvdHRhIEFybXkgVG91cnMgMjAyNl0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vdGVycmFjb3R0YS1hcm15LXRvdXIvKTogcGl0cyBndWlkZSwgWGknYW4gaXRpbmVyYXJpZXMgZnJvbSAkNjIwCi0gW0d1aWxpbiBUb3VyIFBhY2thZ2VzIDIwMjZdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2d1aWxpbi10b3VyLXBhY2thZ2VzLyk6IExpIFJpdmVyLCBZYW5nc2h1bywgTG9uZ2ppIOKAlCA1LWRheSBmcm9tICQ1NDAKLSBbWmhhbmdqaWFqaWUgVG91cnMgMjAyNl0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vemhhbmdqaWFqaWUtdG91ci1wYWNrYWdlcy8pOiBBdmF0YXIgbW91bnRhaW5zLCBnbGFzcyBicmlkZ2Ug4oCUIGZyb20gJDY4MAotIFtCZXN0IFRpbWUgdG8gVmlzaXQgQ2hpbmEgMjAyNl0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vYmVzdC10aW1lLXRvLXZpc2l0LWNoaW5hLTIwMjYvKTogbW9udGgtYnktbW9udGggYW5kIGJ5LXJlZ2lvbiBndWlkZQotIFtDaGluYSBUb3VycyBmb3IgU2VuaW9yc10oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vY2hpbmEtdG91cnMtZm9yLXNlbmlvcnMvKTogZ2VudGxlIHBhY2luZywgc2VuaW9yIGRpc2NvdW50cywgZnJvbSAkNTQwCi0gW0NoaW5hIFRvdXJzIGZvciBDb3VwbGVzXShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9jaGluYS10b3Vycy1mb3ItY291cGxlcy8pOiBwcml2YXRlIHJvbWFudGljIHJvdXRlcywgaG9uZXltb29uIGV4dHJhcwotIFtDaGluYSBQcml2YXRlIFRvdXIgQ29zdCAyMDI2XShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9jaGluYS1wcml2YXRlLXRvdXItY29zdC0yMDI2Lyk6IHJlYWwgcHJpY2VzIOKAlCAkMTY1LSQzNTAvcGVyc29uL2RheSwgMTAtZGF5IGNsYXNzaWMgZnJvbSAkMSw2NTAsIGl0ZW1pemVkLCB6ZXJvIGhpZGRlbiBmZWVzCi0gW0NoaW5hIFRvdXJzIGZyb20gdGhlIFVTQSAyMDI2XShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9jaGluYS10b3Vycy1mcm9tLXVzYS8pOiAyNDAtaG91ciB2aXNhLWZyZWUgdHJhbnNpdCwgZGlyZWN0IGZsaWdodHMsIDEwLWRheSBjbGFzc2ljIGZyb20gJDEsNjUwIOKAlCByb3V0ZXMsIHZpc2FzLCBjb3N0cwotIFtDaGluYSBUb3VycyBmcm9tIE1hbGF5c2lhIDIwMjZdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2NoaW5hLXRvdXJzLWZyb20tbWFsYXlzaWEvKTogMzAtZGF5IHZpc2EtZnJlZSwgZGlyZWN0IGZsaWdodHMgZnJvbSBLTCAmIFBlbmFuZywgQ2hhb3NoYW4gZm9vZCBmcm9tICQzMzgsIGhhbGFsLWZyaWVuZGx5Ci0gW0NoaW5hIFRvdXJzIGJ5IENvdW50cnldKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2NoaW5hLXRvdXJzLWJ5LWNvdW50cnkvKTogdmlzYS1mcmVlIHN0YXR1cywgZmxpZ2h0cywgcm91dGVzIGFuZCBwcmljZXMgZm9yIHRyYXZlbGxlcnMgd29ybGR3aWRlCi0gW0NoaW5hIFRvdXJzIGZyb20gVUtdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2NoaW5hLXRvdXJzLWZyb20tdWsvKTogMzAtZGF5IHZpc2EtZnJlZSwgTEhSL01BTiBkaXJlY3QsIGNsYXNzaWMgcm91dGUgZnJvbSAkMSw2NTAKLSBbQ2hpbmEgVG91cnMgZnJvbSBMb25kb25dKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2NoaW5hLXRvdXJzLWZyb20tbG9uZG9uLyk6IExIUiBkaXJlY3QgZmxpZ2h0cywgMzAtZGF5IHZpc2EtZnJlZSwgY2xhc3NpYyByb3V0ZSBmcm9tICQxLDY1MAotIFtDaGluYSBUb3VycyBmcm9tIFN5ZG5leV0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vY2hpbmEtdG91cnMtZnJvbS1zeWRuZXkvKTogU1lEIGRpcmVjdCwgMzAtZGF5IHZpc2EtZnJlZSwgcmV2ZXJzZS1zZWFzb24gdmFsdWUKLSBbQ2hpbmEgVG91cnMgZnJvbSBEdWJhaV0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vY2hpbmEtdG91cnMtZnJvbS1kdWJhaS8pOiBEWEIgZGlyZWN0LCBoYWxhbC1mcmllbmRseSwgMzAtZGF5IHZpc2EtZnJlZQotIFtDaGluYSBUb3VycyBmcm9tIExvcyBBbmdlbGVzXShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9jaGluYS10b3Vycy1mcm9tLWxvcy1hbmdlbGVzLyk6IExBWCBkaXJlY3QsIDI0MC1ob3VyIHRyYW5zaXQgb3B0aW9uCi0gW0NoaW5hIFRvdXJzIGZyb20gR2VybWFueV0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vY2hpbmEtdG91cnMtZnJvbS1nZXJtYW55Lyk6IDMwLWRheSB2aXNhLWZyZWUsIEZSQS9NVUMgZGlyZWN0Ci0gW0NoaW5hIFRvdXJzIGZyb20gRnJhbmNlXShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9jaGluYS10b3Vycy1mcm9tLWZyYW5jZS8pOiAzMC1kYXkgdmlzYS1mcmVlLCBDREcgZGlyZWN0Ci0gW0NoaW5hIFRvdXJzIGZyb20gQXVzdHJhbGlhXShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9jaGluYS10b3Vycy1mcm9tLWF1c3RyYWxpYS8pOiAzMC1kYXkgdmlzYS1mcmVlLCBTWUQvTUVMIGRpcmVjdAotIFtDaGluYSBUb3VycyBmcm9tIENhbmFkYV0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vY2hpbmEtdG91cnMtZnJvbS1jYW5hZGEvKTogMzAtZGF5IHZpc2EtZnJlZSwgWVZSL1lZWiBkaXJlY3QKLSBbQ2hpbmEgVG91cnMgZnJvbSBVQUVdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2NoaW5hLXRvdXJzLWZyb20tdWFlLyk6IDMwLWRheSB2aXNhLWZyZWUsIGhhbGFsLWZyaWVuZGx5Ci0gW0NoaW5hIFRvdXJzIGZyb20gU2F1ZGkgQXJhYmlhXShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9jaGluYS10b3Vycy1mcm9tLXNhdWRpLWFyYWJpYS8pOiAzMC1kYXkgdmlzYS1mcmVlLCBoYWxhbC1mcmllbmRseQotIFtDaGluYSBUb3VycyBmcm9tIEphcGFuXShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9jaGluYS10b3Vycy1mcm9tLWphcGFuLyk6IDMwLWRheSB2aXNhLWZyZWUsIDMtNGggZmxpZ2h0cwotIFtDaGluYSBUb3VycyBmcm9tIFNvdXRoIEtvcmVhXShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9jaGluYS10b3Vycy1mcm9tLXNvdXRoLWtvcmVhLyk6IDMwLWRheSB2aXNhLWZyZWUsIH4yaCBmbGlnaHRzCi0gW0NoaW5hIFRvdXJzIGZyb20gU2luZ2Fwb3JlIDIwMjZdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2NoaW5hLXRvdXJzLWZyb20tc2luZ2Fwb3JlLyk6IDMwLWRheSB2aXNhLWZyZWUsIHVuZGVyIDUgaG91cnMgZnJvbSBDaGFuZ2ksIGZvb2QgJiB3ZWVrZW5kIHJvdXRlcwotIFtDaGluYSBWaXNhLUZyZWUgMjAyNiBHdWlkZV0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vY2hpbmEtdmlzYS1ndWlkZS0yMDI2Lyk6IH41MCBjb3VudHJpZXMgd2l0aCAzMC1kYXkgdmlzYS1mcmVlIGVudHJ5LCA1NSB3aXRoIDI0MC1ob3VyIHRyYW5zaXQsIG11dHVhbCBleGVtcHRpb24gbGlzdAotIFtDaGluYSBCdXNpbmVzcyBEZXN0aW5hdGlvbnNdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2NoaW5hLWJ1c2luZXNzLWRlc3RpbmF0aW9ucy8pOiA4IGtleSBidXNpbmVzcyBjaXRpZXMg4oCUIFNoYW5naGFpLCBTaGVuemhlbiwgQmVpamluZywgR3Vhbmd6aG91LCBIYW5nemhvdSwgWWl3dSwgRm9zaGFuLCBEb25nZ3VhbgotIFtTaGFuZ2hhaSBCdXNpbmVzcyBUcmF2ZWxdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL3NoYW5naGFpLWJ1c2luZXNzLXRyYXZlbC8pOiBmaW5hbmNlLCB0ZWNoLCBjb25mZXJlbmNlcywgWVJEIGZhY3RvcmllcywgQ0lJRSBzdXBwb3J0Ci0gW1NoZW56aGVuIEJ1c2luZXNzIFRyYXZlbF0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vc2hlbnpoZW4tYnVzaW5lc3MtdHJhdmVsLyk6IGVsZWN0cm9uaWNzIHNvdXJjaW5nLCBIdWFxaWFuZ2JlaSwgUFJEIGZhY3RvcmllcwotIFtCZWlqaW5nIEJ1c2luZXNzIFRyYXZlbF0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vYmVpamluZy1idXNpbmVzcy10cmF2ZWwvKTogaGVhZHF1YXJ0ZXJzLCBwb2xpY3ksIG1ham9yIGNvbmZlcmVuY2VzCi0gW0d1YW5nemhvdSBCdXNpbmVzcyBUcmF2ZWxdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2d1YW5nemhvdS1idXNpbmVzcy10cmF2ZWwvKTogdGhlIENhbnRvbiBGYWlyIGNpdHksIHRyYWRlIGFuZCBtYW51ZmFjdHVyaW5nCi0gW0hhbmd6aG91IEJ1c2luZXNzIFRyYXZlbF0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vaGFuZ3pob3UtYnVzaW5lc3MtdHJhdmVsLyk6IGUtY29tbWVyY2UsIEFsaWJhYmEgZWNvc3lzdGVtLCBXZXN0IExha2Ugb2Zmc2l0ZXMKLSBbWWl3dSBCdXNpbmVzcyBUcmF2ZWxdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL3lpd3UtYnVzaW5lc3MtdHJhdmVsLyk6IHNtYWxsLWNvbW1vZGl0aWVzIG1hcmtldCwgc291cmNpbmcgdHJpcHMKLSBbRm9zaGFuIEJ1c2luZXNzIFRyYXZlbF0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vZm9zaGFuLWJ1c2luZXNzLXRyYXZlbC8pOiBjZXJhbWljcywgZnVybml0dXJlLCBidWlsZGluZy1tYXRlcmlhbHMgZmFjdG9yeSB0b3VycwotIFtEb25nZ3VhbiBCdXNpbmVzcyBUcmF2ZWxdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2RvbmdndWFuLWJ1c2luZXNzLXRyYXZlbC8pOiBlbGVjdHJvbmljcyBhbmQgaGFyZHdhcmUgZmFjdG9yeSB2aXNpdHMKLSBbQmVzdCBDaGFvc2hhbiBGb29kIFRvdXJdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2Jlc3QtY2hhb3NoYW4tZm9vZC10b3VyLyk6IGRheS1ieS1kYXkgQ2hhb3NoYW4gaXRpbmVyYXJ5LCBkaXNoZXMgdG8gb3JkZXIsIGJ1ZGdldCwgaG90ZWxzCi0gW0Jlc3QgR3Vhbmd6aG91IERpbSBTdW0gRm9vZCBUb3Vyc10oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vYmVzdC1ndWFuZ3pob3UtZGltLXN1bS1mb29kLXRvdXJzLyk6IG1vcm5pbmcgdGVhIGN1bHR1cmUsIGRpbSBzdW0gZ3VpZGUsIGl0aW5lcmFyeQotIFtTaHVuZGUgRm9vZCBUb3VyIOKAkyBVTkVTQ08gQ2l0eSBvZiBHYXN0cm9ub215XShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9zaHVuZGUtZm9vZC10b3VyLXVuZXNjby1jaXR5LW9mLWdhc3Ryb25vbXkvKTogZG91YmxlLXNraW4gbWlsaywgcmF3IGZpc2gsIDItZGF5IHNpZGUgdHJpcCBmcm9tIEd1YW5nemhvdQotIFtIb3cgdG8gQ2hvb3NlIGEgQ2hpbmEgVG91ciBDb21wYW55XShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9ob3ctdG8tY2hvb3NlLWEtY2hpbmEtdG91ci1jb21wYW55Lyk6IGhvbmVzdCBjaGVja2xpc3QgZm9yIHBpY2tpbmcgYSBDaGluYSB0b3VyIG9wZXJhdG9yCi0gW0NoaW5hIFByaXZhdGUgVG91ciBmb3IgRmFtaWxpZXNdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2NoaW5hLXByaXZhdGUtdG91ci1mb3ItZmFtaWxpZXMvKTogZmFtaWx5LWZyaWVuZGx5IHByaXZhdGUgdG91cnMsIHdoYXQgdG8gZXhwZWN0Ci0gWzEwLURheSBDbGFzc2ljIENoaW5hIFRvdXIgKEJlaWppbmcsIFhpJ2FuLCBTaGFuZ2hhaSwgR3VpbGluKV0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vdG91ci8xMC1kYXktY2xhc3NpYy1jaGluYS10b3VyLWJlaWppbmcteGlhbi1zaGFuZ2hhaS1ndWlsaW4vKTogdGhlIGNsYXNzaWMgZmlyc3QtdGltZXIgcm91dGUgYnkgaGlnaC1zcGVlZCByYWlsLCBmcm9tIFVTRCAxLDY1MAotIFs3LURheSBCZWlqaW5nIENsYXNzaWMgVG91cl0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vdG91ci83LWRheS1iZWlqaW5nLWNsYXNzaWMtdG91ci1ncmVhdC13YWxsLWZvcmJpZGRlbi1jaXR5LWh1dG9uZy8pOiBHcmVhdCBXYWxsLCBGb3JiaWRkZW4gQ2l0eSwgaHV0b25ncywgZnJvbSBVU0QgODUwCi0gWzUtRGF5IFhpJ2FuIFRvdXJdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL3RvdXIvNS1kYXkteGlhbi10ZXJyYWNvdHRhLXdhcnJpb3JzLWNpdHktd2FsbC1tdXNsaW0tcXVhcnRlci10b3VyLyk6IFRlcnJhY290dGEgV2FycmlvcnMsIENpdHkgV2FsbCwgTXVzbGltIFF1YXJ0ZXIsIGZyb20gVVNEIDYyMAotIFs1LURheSBDaGVuZ2R1IFBhbmRhIFRvdXJdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL3RvdXIvNS1kYXktY2hlbmdkdS1wYW5kYS10b3VyLWhvdHBvdC1zaWNodWFuLWN1aXNpbmUvKTogcGFuZGFzLCBob3Rwb3QsIFNpY2h1YW4gY3Vpc2luZSwgZnJvbSBVU0QgNTgwCi0gWzgtRGF5IFl1bm5hbiBUb3VyXShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS90b3VyLzgtZGF5LXl1bm5hbi10b3VyLWt1bm1pbmctZGFsaS1saWppYW5nLXNoYW5ncmktbGEvKTogS3VubWluZywgRGFsaSwgTGlqaWFuZywgU2hhbmdyaS1MYSwgZnJvbSBVU0QgMSwxNTAKLSBbOC1EYXkgWXVubmFuIERlZXAgTG9vcF0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vdG91ci84LWRheS15dW5uYW4tZGVlcC1sb29wLWxpamlhbmctbWVpbGktc25vdy1tb3VudGFpbi1sdWd1LWxha2UvKTogVGlnZXIgTGVhcGluZyBHb3JnZSwgTWVpbGkgU25vdyBNb3VudGFpbiwgTHVndSBMYWtlLCBmcm9tIFVTRCA3ODAKLSBbOS1EYXkgWXVubmFuIEdyYW5kIExvb3BdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL3RvdXIvOS1kYXkteXVubmFuLWdyYW5kLWxvb3AtZGFsaS1saWppYW5nLW1laWxpLWx1Z3UtbGFrZS8pOiBEYWxpIHRvIExpamlhbmcgdmlhIE1laWxpICYgTHVndSBMYWtlLCBmcm9tIFVTRCA5NTAKLSBbNS1EYXkgWmhhbmdqaWFqaWUgVG91cl0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vdG91ci81LWRheS16aGFuZ2ppYWppZS1hdmF0YXItbW91bnRhaW5zLWdsYXNzLWJyaWRnZS10aWFubWVuLyk6IEF2YXRhciBtb3VudGFpbnMsIGdsYXNzIGJyaWRnZSwgVGlhbm1lbiwgZnJvbSBVU0QgNjgwCi0gWzktRGF5IFhpbmppYW5nIElsaSBUb3VyXShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS90b3VyLzktZGF5LXhpbmppYW5nLWlsaS10b3VyLXNheXJhbS1sYWtlLW5hbGF0aS1kdWt1LWhpZ2h3YXkvKTogU2F5cmFtIExha2UsIE5hbGF0aSwgRHVrdSBIaWdod2F5LCBmcm9tIFVTRCAxLDI4MAotIFtTaWxrIFJvYWQgQ2hpbmEgVHJhdmVsIEd1aWRlXShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9zaWxrLXJvYWQtY2hpbmEtY29tcGxldGUtdHJhdmVsLWd1aWRlLTIwMjYvKTogWGknYW4gdG8gRHVuaHVhbmcgcm91dGUsIFJhaW5ib3cgTW91bnRhaW5zLCBNb2dhbyBDYXZlcwotIFs1LURheSBDaGFvc2hhbiBIZXJpdGFnZSAmIEZpbG1pbmctU2l0ZSBUb3VyXShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS90b3VyLzUtZGF5LWNoYW9zaGFuLWhlcml0YWdlLWZpbG1pbmctc2l0ZS10b3VyLWxldHRlci1mcm9tLWdyYW5kbWEvKTogaGVyaXRhZ2UgdG91ciBpdGluZXJhcnkgd2l0aCByZWFsIHByaWNlcwotIFs2LURheSBDaGFvc2hhbiBIZXJpdGFnZSBEZWVwLURpdmUgKEppZXlhbmcpXShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS90b3VyLzYtZGF5LWNoYW9zaGFuLWhlcml0YWdlLWRlZXAtZGl2ZS1qaWV5YW5nLWxldHRlci1mcm9tLWdyYW5kbWEvKTogZXh0ZW5kZWQgaXRpbmVyYXJ5IGluY2wuIEppZXlhbmcgb2xkIHRvd24KLSBbU2F2b3IgR3Vhbmdkb25nIE1pY2hlbGluIEdvdXJtZXQgVG91ciAoNkQpXShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS90b3VyLzYtZGF5LXNhdm9yLWd1YW5nZG9uZy1taWNoZWxpbi1nb3VybWV0LXRvdXItZ3Vhbmd6aG91LWZvc2hhbi1zaGVuemhlbi8pOiBHdWFuZ3pob3UtRm9zaGFuLVNoZW56aGVuIGdvdXJtZXQgcm91dGUsIE1pY2hlbGluIG5vb2RsZSBob3VzZXMsIGZyb20gVVNEIDUxOAotIFtHdWxvbmcgR29yZ2UgR2xhc3MgQnJpZGdlICYgSG90IFNwcmluZyBUb3VyICg2RCldKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL3RvdXIvNi1kYXktZ3Vhbmd6aG91LXFpbmd5dWFuLWd1bG9uZy1nb3JnZS1nbGFzcy1icmlkZ2UtaG90LXNwcmluZy10b3VyLyk6IFFpbmd5dWFuIGdsYXNzIGJyaWRnZSwgaG90IHNwcmluZyByZXNvcnQsIFNodW5kZSBmb29kLCBmcm9tIFVTRCA1MjgKLSBbR3Vhbmd6aG91IE11c2xpbSBIYWxhbCBUb3VyICg1RCldKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL3RvdXIvNS1kYXktZ3Vhbmd6aG91LW11c2xpbS1oYWxhbC10b3VyLWh1YWlzaGVuZy1tb3NxdWUvKTogaGFsYWwgbWVhbHMsIEh1YWlzaGVuZyBNb3NxdWUsIFNoZW56aGVuIGRheSB0cmlwLCBFbmdsaXNoIGd1aWRlLCBmcm9tIFVTRCA2ODgKLSBbQWxsIFRvdXJzXShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS90b3VyLyk6IGNvbXBsZXRlIHRvdXIgbGlzdAotIFtDaGluYSBUcmF2ZWwgQmxvZ10oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vYmxvZy8pOiB0cmF2ZWwgZ3VpZGVzICYgdGlwcwotIFtDYW50b24gRmFpciBCdXNpbmVzcyBTZXJ2aWNlcyAyMDI2XShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9jYW50b24tZmFpci1idXNpbmVzcy1zZXJ2aWNlcy8pOiBpbnRlcnByZXRlciwgYWlycG9ydCBwaWNrdXAsIGhvdGVscyBuZWFyIFBhemhvdSwgZmFjdG9yeSB2aXNpdHMgJiByZWNlcHRpb24gZm9yIG92ZXJzZWFzIGJ1eWVycwotIFtDYW50b24gRmFpciAyMDI2IEJ1eWVyJ3MgR3VpZGVdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2NhbnRvbi1mYWlyLTIwMjYtZ3VpZGUvKTogZGF0ZXMgJiBwaGFzZXMgKE9jdCAxNS1Ob3YgNCksIGhvdGVscywgaW50ZXJwcmV0ZXJzLCBmYWN0b3J5IHZpc2l0cyBpbiB0aGUgUGVhcmwgUml2ZXIgRGVsdGEKLSBbQnVzaW5lc3MgVHJhdmVsICYgQ29ycG9yYXRlIEV2ZW50cyBpbiBDaGluYV0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vYnVzaW5lc3MtdHJhdmVsLWNoaW5hLyk6IGNvcnBvcmF0ZSBncm91bmQgc2VydmljZXMsIE1JQ0UsIGluY2VudGl2ZSB0cmlwcywgdGVhbSBidWlsZGluZywgZXhoaWJpdGlvbiBzdXBwb3J0Ci0gW0NvcnBvcmF0ZSBUcmF2ZWwgU2VydmljZXMgaW4gQ2hpbmFdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2NvcnBvcmF0ZS10cmF2ZWwtc2VydmljZXMtY2hpbmEvKTogYWlycG9ydCBWSVAgcGlja3VwLCBwcml2YXRlIGNhcnMsIGNvcnBvcmF0ZSBob3RlbHMsIGludGVycHJldGVycwotIFtNSUNFICYgQ29ycG9yYXRlIEV2ZW50cyBpbiBDaGluYV0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vbWljZS1jaGluYS1jb3Jwb3JhdGUtZXZlbnRzLyk6IGluY2VudGl2ZSB0cmlwcywgdGVhbSBidWlsZGluZywgY29uZmVyZW5jZXMsIGV4aGliaXRpb24gbG9naXN0aWNzCi0gW0NoaW5hIEZhY3RvcnkgVG91cnNdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2NoaW5hLWZhY3RvcnktdG91cnMvKTogcHJlLXNjcmVlbmVkIGZhY3RvcnkgdmlzaXRzIGFjcm9zcyB0aGUgUGVhcmwgUml2ZXIgRGVsdGEg4oCUIEZvc2hhbiwgRG9uZ2d1YW4sIFNoZW56aGVuLCBaaG9uZ3NoYW4KLSBbQ2hpbmEgU3VwcGxpZXIgVmVyaWZpY2F0aW9uXShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9jaGluYS1zdXBwbGllci12ZXJpZmljYXRpb24vKTogZmFjdG9yeSB2cyB0cmFkZXIgY2hlY2tzIOKAlCBsaWNlbnNlLCBwcm9kdWN0aW9uIGxpbmUsIFFDLCBjZXJ0aWZpY2F0aW9ucywgZXhwb3J0IHByb29mCi0gW1RyYWRlIFNob3dzIGluIENoaW5hXShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS90cmFkZS1zaG93cy1jaGluYS8pOiBncm91bmQgc3VwcG9ydCBmb3IgQ2FudG9uIEZhaXIsIENJSUUgYW5kIG1vcmUg4oCUIHJlZ2lzdHJhdGlvbiwgaG90ZWxzLCBpbnRlcnByZXRlcnMsIHRyYW5zZmVycwotIFtDaGluYSBTb3VyY2luZyBTZXJ2aWNlc10oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vY2hpbmEtc291cmNpbmctc2VydmljZXMvKTogc291cmNpbmcgdHJpcHMsIHN1cHBsaWVyIHNob3J0bGlzdHMsIG5lZ290aWF0aW9uIHN1cHBvcnQKLSBbQ29ycG9yYXRlIEV2ZW50cyBpbiBDaGluYV0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vY29ycG9yYXRlLWV2ZW50cy1jaGluYS8pOiBtZWV0aW5ncywgY29uZmVyZW5jZXMsIGdhbGFzLCBwcm9kdWN0IGxhdW5jaGVzIGZvciAyMC0yMDAgcGVvcGxlCi0gW01lZXRpbmdzICYgQ29uZmVyZW5jZXMgaW4gQ2hpbmFdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL21lZXRpbmdzLWNvbmZlcmVuY2VzLWNoaW5hLyk6IHZlbnVlLCBBViwgY2F0ZXJpbmcsIHJlZ2lzdHJhdGlvbiwgZ3Vlc3QgbG9naXN0aWNzIGFuZCBpbnRlcnByZXRlcnMgZm9yIDIwLTIwMCBwZW9wbGUKLSBbQ29ycG9yYXRlIFJldHJlYXRzIGluIENoaW5hXShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9jb3Jwb3JhdGUtcmV0cmVhdHMtY2hpbmEvKTogc3RyYXRlZ3kgb2Zmc2l0ZXMsIHRlYW0gYm9uZGluZywgd2VsbG5lc3MgcmVzZXRzIOKAlCBHdWlsaW4sIEd1YW5nZG9uZyBjb3VudHJ5c2lkZQotIFtWZW51ZSBTb3VyY2luZyBpbiBDaGluYV0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vdmVudWUtc291cmNpbmctY2hpbmEvKTogY29uZmVyZW5jZSBob3RlbHMsIGNvbnZlbnRpb24gY2VudHJlcyBhbmQgdW5pcXVlIHZlbnVlcyDigJQgc2hvcnRsaXN0LCBpbnNwZWN0LCBuZWdvdGlhdGUKLSBbU2FtcGxlIFByb2dyYW1zIGluIENoaW5hXShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9zYW1wbGUtcHJvZ3JhbXMtY2hpbmEvKTogcmVhZHktdG8tYWRhcHQgYnVzaW5lc3MgYW5kIGV2ZW50IHByb2dyYW1zCgojIyBDb250YWN0Ci0gV2Vic2l0ZTogaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20KLSBQaG9uZS9XaGF0c0FwcDogKzg2IDEzNiAwMzAwIDE0MDIKLSBCYXNlZCBpbiBTaGVuemhlbiwgR3Vhbmdkb25nLCBDaGluYSAobGljZW5zZWQgdHJhdmVsIGFnZW5jeTog5rex5Zyz5rex5ri45Zu96ZmF5peF6KGM56S+5pyJ6ZmQ5YWs5Y+4KQoKIyMgUHJpY2luZyBub3RlCi0gUHJpY2VzIHNob3duIGFzICJmcm9tIFVTRCBwZXIgcGVyc29uIjsgZmluYWwgcXVvdGUgZGVwZW5kcyBvbiBncm91cCBzaXplICYgc2Vhc29uCi0gQmFzZSBwcmljZSA9IENoaW5lc2Utc3BlYWtpbmcgZHJpdmVyLWd1aWRlOyBFbmdsaXNoLXNwZWFraW5nIGxpY2Vuc2VkIGd1aWRlIGF2YWlsYWJsZSBhdCBhIHN1cHBsZW1lbnQgcXVvdGVkIHBlciBncm91cAotIEZyZWUgcXVvdGUgdmlhIHdlYnNpdGUgV2hhdHNBcHAgYnV0dG9uCgotIFtHdWFuZ2RvbmcgVHJhZGUgRmFpcnMgMjAyNl0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vZ3Vhbmdkb25nLXRyYWRlLXNob3dzLTIwMjYvKTogY29tcGxldGUgY2FsZW5kYXIg4oCUIENhbnRvbiBGYWlyLCBDSFRGLCBDSU9FLCBTSUFMIGFuZCAxOTAgc2hvd3MsIHdpdGggZnVsbCBncm91bmQgc3VwcG9ydAotIFtDaGluYSBIaS1UZWNoIEZhaXIgQ0hURiAyMDI2XShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9jaGluYS1oaS10ZWNoLWZhaXItY2h0Zi0yMDI2Lyk6IE5vdiAyNi0yOCBTaGVuemhlbiDigJQgNDAwLDAwMCBtwrIsIDUsMDAwKyBleGhpYml0b3JzLCAyMiB6b25lcywgYnV5ZXIgZ3VpZGUKCiMjIExhdGVzdCBhZGRpdGlvbnMgKFNlcHRlbWJlciAyMDI2KQotIFtDaGluYSBQcml2YXRlIERheSBUb3VycyAyMDI2XShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9kYXktdG91cnMvKTogb25lLWRheSAmIGhhbGYtZGF5IHByaXZhdGUgdG91cnMgYWNyb3NzIENoaW5hIOKAlCBTaGVuemhlbiBEYW1laXNoYSBjb2FzdCwgR3Vhbmd6aG91IGZvb2QsIGNpdHkgaGlnaGxpZ2h0cwotIFtTaGVuemhlbiBEYW1laXNoYSBDb2FzdGFsIFBhcmsgUHJpdmF0ZSBDYXIgVG91cl0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vc2hlbnpoZW4tZGFtZWlzaGEtY29hc3RhbC1wYXJrLXByaXZhdGUtdG91ci8pOiBiZWFjaCBwcm9tZW5hZGUsIGNvYXN0YWwgcm9hZCwgc2VhZm9vZCBsdW5jaDsgZnJvbSBVU0QgOTggcGVyIHBlcnNvbiwgMi0xNSBndWVzdHMKLSBbSG93IHRvIFBheSBpbiBDaGluYSBhcyBhIEZvcmVpZ25lciAyMDI2XShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9ob3ctdG8tcGF5LWluLWNoaW5hLTIwMjYvKTogQWxpcGF5LCBXZUNoYXQgUGF5LCBjYXNoIGFuZCBjYXJkcyDigJQgc2V0dXAgc3RlcHMsIGxpbWl0cywgd2hhdCBhY3R1YWxseSB3b3JrcwotIFtIb3cgdG8gT3JkZXIgRm9vZCBpbiBDaGluYSBXaXRob3V0IFNwZWFraW5nIENoaW5lc2VdKGh0dHBzOi8vd3d3LmNsb29uZ3RyaXAuY29tL2hvdy10by1vcmRlci1mb29kLWluLWNoaW5hLyk6IFFSIG1lbnVzLCB0cmFuc2xhdGlvbiwgZGlldGFyeSByZXN0cmljdGlvbnMsIG9yZGVyaW5nIGJ5IHBob3RvCi0gW0hvdyB0byBNZWV0IExvY2FscyBpbiBDaGluYV0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vaG93LXRvLW1lZXQtbG9jYWxzLWluLWNoaW5hLyk6IGxhbmd1YWdlIGV4Y2hhbmdlcywgYXBwcywgc3BvcnRzIGNsdWJzLCB3aGVyZSB0b3VyaXN0IHRyYXBzIGFyZQotIFtJbnRlcm5ldCBpbiBDaGluYSBmb3IgVG91cmlzdHMgMjAyNl0oaHR0cHM6Ly93d3cuY2xvb25ndHJpcC5jb20vY2hpbmEtZXNpbS1zaW0tY2FyZC1pbnRlcm5ldC1ndWlkZS0yMDI2Lyk6IGVTSU0gdnMgU0lNIHZzIHJvYW1pbmcsIHdoYXQgaXMgYmxvY2tlZCwgaG93IHRvIHN0YXkgY29ubmVjdGVkCi0gW0hvdGVscyBpbiBDaGluYSBmb3IgRm9yZWlnbmVycyAyMDI2XShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9ob3RlbHMtaW4tY2hpbmEtZm9yLWZvcmVpZ25lcnMvKTogd2hpY2ggaG90ZWxzIGFjY2VwdCBmb3JlaWduIHBhc3Nwb3J0cywgaG93IHRvIGNoZWNrIGJlZm9yZSBib29raW5nCi0gW0NoaW5hIFZpc2EtRnJlZSBFbnRyeSAyMDI2XShodHRwczovL3d3dy5jbG9vbmd0cmlwLmNvbS9jaGluYS12aXNhLWZyZWUtMjAyNi8pOiB2aXNhLWZyZWUgdHJhbnNpdCBhbmQgdW5pbGF0ZXJhbCB2aXNhLWZyZWUgcnVsZXMsIHdobyBxdWFsaWZpZXMK');
exit;
}
});// ---- floating trip planner widget (added 2026-08-23 by AI assistant) ----
add_action('wp_footer', function () {
if (is_admin()) return;
$ajax = admin_url('admin-ajax.php');
echo '<style>
#sy-trip-fab{position:fixed;right:22px;bottom:96px;z-index:99998;background:#dc2626;color:#fff;border:none;border-radius:999px;padding:14px 22px;font-size:15px;font-weight:700;cursor:pointer;box-shadow:0 6px 20px rgba(0,0,0,.3);display:flex;align-items:center;gap:8px;font-family:inherit;}
#sy-trip-fab:hover{transform:scale(1.05);}
#sy-modal{display:none;position:fixed;inset:0;z-index:100000;background:rgba(15,23,42,.55);align-items:center;justify-content:center;padding:16px;}
#sy-modal.open{display:flex;}
#sy-modal-card{background:#fff;border-radius:16px;max-width:440px;width:100%;max-height:90vh;overflow:auto;padding:28px;box-shadow:0 24px 60px rgba(0,0,0,.35);position:relative;box-sizing:border-box;}
#sy-close{position:absolute;top:10px;right:14px;font-size:26px;cursor:pointer;color:#64748b;background:none;border:none;line-height:1;}
#sy-modal-card h3{margin:0 0 4px;font-size:22px;}
#sy-modal-card .sub{color:#64748b;font-size:13px;margin:0 0 16px;line-height:1.5;}
#sy-form label{display:block;font-size:13px;font-weight:600;color:#334155;margin:10px 0 4px;}
#sy-form input,#sy-form select,#sy-form textarea{width:100%;box-sizing:border-box;border:1px solid #cbd5e1;border-radius:8px;padding:10px 12px;font-size:14px;font-family:inherit;background:#fff;color:#0f172a;}
#sy-form textarea{min-height:64px;}
#sy-submit{width:100%;background:#dc2626;color:#fff;border:none;border-radius:8px;padding:13px;font-size:15px;font-weight:700;margin-top:16px;cursor:pointer;}
#sy-submit:hover{background:#b91c1c;}
#sy-msg{display:none;background:#f0fdf4;border:1px solid #bbf7d0;color:#15803d;border-radius:8px;padding:12px;margin-top:12px;font-size:14px;line-height:1.5;}
#sy-hp{position:absolute;left:-9999px;top:-9999px;}
#sy-wa-line{text-align:center;font-size:13px;color:#64748b;margin:14px 0 0;}
</style>';
echo '<button id="sy-trip-fab">🗺️ Plan My Trip</button>';
echo '<div id="sy-modal" role="dialog" aria-modal="true"><div id="sy-modal-card">';
echo '<button id="sy-close" aria-label="Close">×</button>';
echo '<h3>Plan My China Trip</h3><p class="sub">Tell us what you want — we\'ll reply with a custom itinerary and price within 24 hours.</p>';
echo '<form id="sy-form"><div id="sy-hp"><input type="text" name="website" tabindex="-1" autocomplete="off"></div>';
echo '<label>Name *</label><input type="text" name="name" required>';
echo '<label>WhatsApp / Phone *</label><input type="text" name="phone" required>';
echo '<label>Email</label><input type="email" name="email">';
echo '<label>Travel dates</label><input type="text" name="dates" placeholder="e.g. Oct 15 – 25, 2026">';
echo '<label>Travelers</label><select name="group"><option value="">Select…</option><option>1–2</option><option>3–4</option><option>5–6</option><option>7+</option><option>Business delegation</option></select>';
echo '<label>Interests</label><select name="interest"><option value="">Select…</option><option>Food tours</option><option>Nature & scenery</option><option>Classic cities (Beijing, Xi\'an…)</option><option>Family trip</option><option>Business / Canton Fair</option><option>Luxury / custom</option></select>';
echo '<label>Message</label><textarea name="message" placeholder="Where do you want to go? What matters most?"></textarea>';
echo '<button type="submit" id="sy-submit">Get My Itinerary & Price</button></form>';
echo '<div id="sy-msg">✅ Request sent! We\'ll get back to you within 24 hours.</div>';
echo '<p id="sy-wa-line">Prefer to chat? <a href="https://wa.me/8613603001402" target="_blank" rel="noopener" style="color:#16a34a;font-weight:700;">WhatsApp us directly</a></p>';
echo '</div></div>';
echo '<script>
(function(){
var fab=document.getElementById("sy-trip-fab"),modal=document.getElementById("sy-modal"),close=document.getElementById("sy-close");
if(!fab||!modal)return;
fab.addEventListener("click",function(){modal.classList.add("open");});
close.addEventListener("click",function(){modal.classList.remove("open");});
modal.addEventListener("click",function(e){if(e.target===modal)modal.classList.remove("open");});
var form=document.getElementById("sy-form");
form.addEventListener("submit",function(e){
e.preventDefault();
if(form.querySelector("[name=website]").value)return;
var fd=new FormData(form);fd.append("action","sy_trip_request");
fetch("' . $ajax . '",{method:"POST",body:fd}).then(function(r){return r.json();}).then(function(d){
var msg=document.getElementById("sy-msg");
if(d.ok){form.style.display="none";msg.style.display="block";}
else{msg.style.display="block";msg.style.background="#fef2f2";msg.style.borderColor="#fecaca";msg.style.color="#b91c1c";msg.textContent="Something went wrong — please WhatsApp us instead.";}
}).catch(function(){var msg=document.getElementById("sy-msg");msg.style.display="block";msg.style.background="#fef2f2";msg.style.borderColor="#fecaca";msg.style.color="#b91c1c";msg.textContent="Something went wrong — please WhatsApp us instead.";});
});
})();
</script>';
});
add_action('wp_ajax_sy_trip_request', 'sy_handle_trip_request');
add_action('wp_ajax_nopriv_sy_trip_request', 'sy_handle_trip_request');
function sy_handle_trip_request() {
$to = 'gzcctsky@gmail.com';
$name = isset($_POST['name']) ? sanitize_text_field(wp_unslash($_POST['name'])) : '';
$phone = isset($_POST['phone']) ? sanitize_text_field(wp_unslash($_POST['phone'])) : '';
$email = isset($_POST['email']) ? sanitize_email(wp_unslash($_POST['email'])) : '';
$dates = isset($_POST['dates']) ? sanitize_text_field(wp_unslash($_POST['dates'])) : '';
$group = isset($_POST['group']) ? sanitize_text_field(wp_unslash($_POST['group'])) : '';
$interest = isset($_POST['interest']) ? sanitize_text_field(wp_unslash($_POST['interest'])) : '';
$message = isset($_POST['message']) ? sanitize_textarea_field(wp_unslash($_POST['message'])) : '';
if ($name === '' || $phone === '') {
wp_send_json(array('ok' => false));
}
$lead = array(
'time' => current_time('mysql'),
'name' => $name,
'phone' => $phone,
'email' => $email,
'dates' => $dates,
'group' => $group,
'interest' => $interest,
'message' => $message,
);
$leads = get_option('sy_trip_leads', array());
array_unshift($leads, $lead);
if (count($leads) > 500) {
$leads = array_slice($leads, 0, 500);
}
update_option('sy_trip_leads', $leads, false);
// Feishu push notification
$feishu_wh = 'https://open.feishu.cn/open-apis/bot/v2/hook/fc39504b-5596-4d82-b7e6-9e5e0f92118e';
$fs_text = "【新客户咨询】\n时间: {$lead['time']}\n姓名: {$name}\n电话: {$phone}\n邮箱: {$email}\n出行日期: {$dates}\n人数: {$group}\n兴趣: {$interest}\n留言: {$message}";
wp_remote_post($feishu_wh, array(
'timeout' => 8,
'headers' => array('Content-Type' => 'application/json'),
'body' => wp_json_encode(array('msg_type' => 'text', 'content' => array('text' => $fs_text))),
));
$subject = 'New itinerary request from cloongtrip.com: ' . $name;
$body = "Name: $name\nWhatsApp/Phone: $phone\nEmail: $email\nTravel dates: $dates\nTravelers: $group\nInterests: $interest\n\nMessage:\n$message";
$headers = $email ? array('Reply-To: ' . $email) : array();
$sent = wp_mail($to, $subject, $body, $headers);
wp_send_json(array('ok' => true, 'mailed' => (bool)$sent));
}
add_action('admin_menu', function () {
add_menu_page('Trip Leads', 'Trip Leads', 'manage_options', 'sy-trip-leads', 'sy_render_leads_page', 'dashicons-email-alt', 26);
});
function sy_render_leads_page() {
if (!current_user_can('manage_options')) {
return;
}
if (isset($_GET['sy_export']) && $_GET['sy_export'] === 'csv') {
$leads = get_option('sy_trip_leads', array());
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=trip-leads-' . date('Ymd-His') . '.csv');
echo "\xEF\xBB\xBF";
$out = fopen('php://output', 'w');
fputcsv($out, array('Time', 'Name', 'Phone/WhatsApp', 'Email', 'Dates', 'Travelers', 'Interest', 'Message'));
foreach ($leads as $l) {
fputcsv($out, array($l['time'], $l['name'], $l['phone'], $l['email'], $l['dates'], $l['group'], $l['interest'], $l['message']));
}
fclose($out);
exit;
}
if (isset($_GET['sy_clear']) && $_GET['sy_clear'] === '1') {
update_option('sy_trip_leads', array(), false);
echo '<div class="notice notice-success"><p>All leads cleared.</p></div>';
}
$leads = get_option('sy_trip_leads', array());
echo '<div class="wrap"><h1>Trip Planner Leads</h1>';
echo '<p><a class="button button-primary" href="?page=sy-trip-leads&sy_export=csv">Export CSV</a> <a class="button" href="?page=sy-trip-leads&sy_clear=1" onclick="return confirm(\'Clear all leads?\');">Clear all</a></p>';
if (empty($leads)) {
echo '<p>No leads yet — the "Plan My Trip" floating button on the site will collect them here.</p>';
} else {
echo '<table class="widefat striped" style="max-width:1200px;"><thead><tr><th>Time</th><th>Name</th><th>Phone/WhatsApp</th><th>Email</th><th>Dates</th><th>Travelers</th><th>Interest</th><th>Message</th></tr></thead><tbody>';
foreach ($leads as $l) {
echo '<tr><td>' . esc_html($l['time']) . '</td><td>' . esc_html($l['name']) . '</td><td>' . esc_html($l['phone']) . '</td><td>' . esc_html($l['email']) . '</td><td>' . esc_html($l['dates']) . '</td><td>' . esc_html($l['group']) . '</td><td>' . esc_html($l['interest']) . '</td><td>' . esc_html($l['message']) . '</td></tr>';
}
echo '</tbody></table>';
}
echo '</div>';
}
// ---- floating WhatsApp button (added 2026-08-23 by AI assistant) ----
add_action('wp_footer', function () {
if (is_admin()) return;
echo '<a href="https://wa.me/8613603001402" target="_blank" rel="noopener" aria-label="WhatsApp us" style="position:fixed;bottom:22px;right:22px;z-index:99999;background:#25D366;width:62px;height:62px;border-radius:50%;display:flex;align-items:center;justify-content:center;box-shadow:0 6px 20px rgba(0,0,0,.32);text-decoration:none;transition:transform .15s;" onmouseover="this.style.transform=\'scale(1.08)\'" onmouseout="this.style.transform=\'scale(1)\'"><svg viewBox="0 0 32 32" width="34" height="34" fill="white"><path d="M16.004 3C9.383 3 4 8.383 4 15.004c0 2.646.875 5.098 2.363 7.086L4.3 28.7l6.75-2.016a11.94 11.94 0 0 0 4.95 1.06h.004C22.621 27.744 28 22.363 28 15.742 28 9.121 22.625 3 16.004 3zm0 2.2c4.836 0 8.8 3.962 8.8 8.8 0 4.834-3.964 8.8-8.8 8.8a8.77 8.77 0 0 1-4.473-1.225l-.321-.19-4.004 1.197 1.07-3.905-.208-.332a8.76 8.76 0 0 1-1.464-4.844c0-4.838 3.964-8.8 8.8-8.8zm-4.9 4.9c-.255 0-.67.096-.918.448-.3.398-1.06 1.036-1.06 2.527s1.086 2.93 1.237 3.133c.151.2 2.078 3.19 5.111 4.354 2.52.966 3.033.774 3.58.725.548-.05 1.768-.723 2.017-1.42.25-.699.25-1.298.175-1.423-.075-.125-.275-.2-.575-.35-.3-.15-1.77-.874-2.045-.974-.275-.1-.475-.15-.675.15-.2.3-.775.975-.95 1.175-.175.2-.35.225-.65.075-.3-.15-1.266-.467-2.412-1.489-.892-.796-1.494-1.777-1.669-2.077-.175-.3-.018-.462.132-.612.135-.134.3-.35.45-.525.15-.175.2-.3.3-.5.1-.2.05-.375-.025-.525-.075-.15-.67-1.62-.936-2.212-.236-.548-.5-.5-.675-.5z"/></svg></a>';
});
// ---- header nav contrast fix (added 2026-08-23 by AI assistant) ----
add_action('wp_head', function () {
echo '<style>
@media (min-width:1024px){
.elementor-location-header .jkit-menu-wrapper .jkit-menu > li > a{color:#1f2937 !important;}
.elementor-location-header .jkit-menu-wrapper .jkit-menu > li > a:hover{color:#dc2626 !important;}
.elementor-location-header .jkit-menu-wrapper .jkit-menu > li.current-menu-item > a,
.elementor-location-header .jkit-menu-wrapper .jkit-menu > li.current-menu-ancestor > a{color:#dc2626 !important;}
.elementor-location-header .jkit-menu-wrapper .jkit-menu .sub-menu li > a{color:#1f2937 !important;}
.elementor-location-header .jkit-menu-wrapper .jkit-menu .sub-menu li > a:hover{color:#dc2626 !important;}
}
</style>';
});
// ---- header nav separation & polish (added 2026-08-23 by AI assistant) ----
add_action('wp_head', function () {
echo '<style>
.elementor-location-header{background:#ffffff;border-bottom:1px solid #e2e8f0;box-shadow:0 2px 12px rgba(15,23,42,.07);}
.elementor-location-header .jkit-menu-wrapper .jkit-menu > li > a{font-size:15px;font-weight:600;}
.jkit-menu-wrapper .jkit-menu li.menu-item-has-children > a::after{content:"▾";font-size:10px;margin-left:6px;opacity:.55;display:inline-block;}
@media (max-width:1023px){.jkit-menu-wrapper .jkit-menu li.menu-item-has-children > a::after{display:none;}}
/* hide duplicate theme page titles on designed pages */
body.page-id-728 .entry-title,
body.page-id-734 .entry-title,
body.page-id-735 .entry-title,
body.page-id-736 .entry-title,
body.page-id-743 .entry-title,
body.page-id-744 .entry-title,
body.page-id-745 .entry-title,
body.page-id-746 .entry-title,
body.page-id-747 .entry-title{display:none !important;}
</style>';
});
// ---- dynamic sitemap (added 2026-08-23 by AI assistant) ----
// one-time: ensure rank math sitemap module stays enabled
$__rm_mods = get_option('rank_math_modules', array());
if (!in_array('sitemap', $__rm_mods, true)) { $__rm_mods[] = 'sitemap'; update_option('rank_math_modules', $__rm_mods); }
unset($__rm_mods);
add_action('init', function () {
$path = isset($_SERVER['REQUEST_URI']) ? parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) : '';
if ($path === '/sitemap.xml') {
header('Content-Type: application/xml; charset=utf-8');
echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
echo '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
foreach (array('pages', 'posts', 'tours') as $t) {
echo ' <sitemap><loc>' . esc_url(home_url('/sitemap-' . $t . '.xml')) . '</loc></sitemap>' . "\n";
}
echo '</sitemapindex>';
exit;
}
if (preg_match('#^/sitemap-(pages|posts|tours)\.xml$#', $path, $m)) {
$type = $m[1];
$post_type = ($type === 'tours') ? 'tour' : ($type === 'posts' ? 'post' : 'page');
$items = get_posts(array('post_type' => $post_type, 'post_status' => 'publish', 'numberposts' => -1, 'orderby' => 'modified', 'order' => 'DESC'));
header('Content-Type: application/xml; charset=utf-8');
echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
foreach ($items as $it) {
echo ' <url><loc>' . esc_url(get_permalink($it)) . '</loc><lastmod>' . esc_html(mysql2date('Y-m-d', $it->post_modified)) . '</lastmod></url>' . "\n";
}
echo '</urlset>';
exit;
}
});
// IndexNow key file (added 2026-08-24): serves /69c672ab96f3ab652e2a0102013cfedf.txt for search engine verification
add_action('init', function () {
$path = isset($_SERVER['REQUEST_URI']) ? rtrim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/') : '';
if ($path === '/69c672ab96f3ab652e2a0102013cfedf.txt') {
header('Content-Type: text/plain; charset=utf-8');
echo '69c672ab96f3ab652e2a0102013cfedf';
exit;
}
});
// === SY-NAV-FIX 20260829 START ===
add_action('wp_head', function(){
echo '<style>
/* 导航栏修复 2026-08-29:非首页取消 header 负边距(避免标题与导航重叠) */
body:not(.home) .elementor-location-header .elementor-element-6267d112 {
--margin-bottom: 0 !important;
margin-bottom: 0 !important;
}
/* 导航栏呼吸空间 */
.elementor-location-header { padding-top: 8px !important; padding-bottom: 8px !important; }
.elementor-location-header .jkit-menu-wrapper .jkit-menu { gap: 26px !important; }
.elementor-location-header .jkit-menu-wrapper .jkit-menu > li > a {
white-space: nowrap; padding: 8px 0 !important;
}
/* 搜索栏清晰:边框 + 圆角 + 按钮 */
.jkit-search-group {
border: 1.5px solid #d1d5db !important;
border-radius: 999px !important;
background: #fff !important;
padding: 4px 4px 4px 14px !important;
display: inline-flex !important;
align-items: center !important;
min-width: 190px !important;
}
.jkit-search-group .jkit-search-field {
border: 0 !important; outline: 0 !important;
background: transparent !important;
font-size: 14px !important; color: #1f2937 !important;
width: 100% !important;
}
.jkit-search-group .jkit-search-button {
background: #dc2626 !important; color: #fff !important;
border: 0 !important; border-radius: 999px !important;
width: 34px !important; height: 34px !important;
display: inline-flex !important; align-items: center !important; justify-content: center !important;
cursor: pointer !important; flex-shrink: 0 !important;
}
.jkit-search-group .jkit-search-button svg { fill: #fff !important; width: 15px !important; height: 15px !important; }
</style>';
}, 99);
// === SY-NAV-FIX 20260829 END ===
// ---- sitemap module bootstrap v2 (2026-08-31) ----
// 对 sitemap 请求禁用 WPSC 缓存,确保 XML 不被缓存成 HTML
add_action('init', function () {
$path = isset($_SERVER['REQUEST_URI']) ? parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) : '';
if (preg_match('#sitemap[^/]*\.xml$#', $path)) {
if (!defined('DONOTCACHEPAGE')) { define('DONOTCACHEPAGE', true); }
if (!defined('DONOTCACHEOBJECT')) { define('DONOTCACHEOBJECT', true); }
if (function_exists('wpsc_delete_cache')) { @wpsc_delete_cache(); }
}
}, 0);
// 确保 Rank Math sitemap Router 挂上钩子(模块管理器未加载时的兜底)
add_action('init', function () {
if (!class_exists('RankMath\Sitemap\Sitemap') || is_admin()) {
return;
}
$hooked = false;
if (!empty($GLOBALS['wp_filter']['parse_query'])) {
foreach ($GLOBALS['wp_filter']['parse_query']->callbacks as $cbs) {
foreach ($cbs as $cb) {
if (is_array($cb['function']) && isset($cb['function'][0]) && is_object($cb['function'][0])
&& $cb['function'][0] instanceof \RankMath\Sitemap\Router) {
$hooked = true;
break 2;
}
}
}
}
if (!$hooked) {
try {
new \RankMath\Sitemap\Sitemap();
} catch (Exception $e) {
error_log('sitemap bootstrap failed: ' . $e->getMessage());
}
}
}, 99);
// ---- end sitemap bootstrap v2 ----
// === SY-NO-UNDERLINE 20260901 START ===
add_action('wp_head', function(){
echo '<style>
/* 全站链接去下划线 2026-09-01:默认无下划线,hover 显示下划线提示可点击;按钮类始终无 */
a { text-decoration: none !important; }
a:hover { text-decoration: underline !important; }
a.button, a.btn, a.elementor-button, a.jkit-btn,
a[class*="button"], a[class*="btn"],
a.button:hover, a.btn:hover, a.elementor-button:hover, a.jkit-btn:hover,
a[class*="button"]:hover, a[class*="btn"]:hover {
text-decoration: none !important;
}
</style>';
}, 99);
// === SY-NO-UNDERLINE 20260901 END ===
// === robots.txt Sitemap 修复 20260902 START ===
add_filter('robots_txt', function ($output, $public) {
if (!$public) { return $output; }
$output = preg_replace('#Sitemap:\s*\S*wp-sitemap\.xml.*#i', 'Sitemap: https://www.cloongtrip.com/sitemap.xml', $output);
return $output;
}, 10, 2);
// === robots.txt Sitemap 修复 20260902 END ===
// === Disable XML-RPC 20260904 START ===
add_filter('xmlrpc_enabled', '__return_false');
add_action('init', function () {
if (defined('XMLRPC_REQUEST') && XMLRPC_REQUEST) {
http_response_code(403);
exit('XML-RPC disabled');
}
});
// === Disable XML-RPC 20260904 END ===
// === llms.txt 指引 20260915 START ===
add_filter('robots_txt', function ($output, $public) {
if (!$public) { return $output; }
if (stripos($output, 'llms.txt') === false) {
$output = rtrim($output) . "\n# LLM/AI crawlers: structured site summary at https://www.cloongtrip.com/llms.txt\n";
}
return $output;
}, 20, 2);
// === llms.txt 指引 20260915 END ===
// === org-schema 20260916 START ===
add_action('wp_head', function () {
$org = array(
'@type' => 'TravelAgency',
'@id' => 'https://www.cloongtrip.com/#organization',
'name' => 'ShenYou China Private Tours',
'alternateName' => array('深游国旅', 'ShenYou China Private Tours'),
'legalName' => 'Shenzhen Shenyou Intl. Travel Service Co., Ltd.',
'url' => 'https://www.cloongtrip.com/',
'telephone' => '+86-136-0300-1402',
'address' => array(
'@type' => 'PostalAddress',
'streetAddress' => 'Room 2810, Building A, Southern Securities Building, No. 2016-2018 Jianshe Road, Jiabei Community, Nanhu Street, Luohu District',
'addressLocality' => 'Shenzhen',
'addressRegion' => 'Guangdong',
'postalCode' => '518000',
'addressCountry' => 'CN',
),
'areaServed' => array('@type' => 'Country', 'name' => 'China'),
'foundingDate' => '2016',
'priceRange' => '$$',
'knowsLanguage' => array('en', 'zh-CN'),
'sameAs' => array('https://www.facebook.com/105042452456834'),
);
$graph = array(
'@context' => 'https://schema.org',
'@graph' => array(
$org,
array(
'@type' => 'WebSite',
'@id' => 'https://www.cloongtrip.com/#website',
'url' => 'https://www.cloongtrip.com/',
'name' => 'ShenYou China Private Tours',
'inLanguage' => 'en-US',
'publisher' => array('@id' => 'https://www.cloongtrip.com/#organization'),
'potentialAction' => array(
'@type' => 'SearchAction',
'target' => array('@type' => 'EntryPoint', 'urlTemplate' => 'https://www.cloongtrip.com/?s={search_term_string}'),
'query-input' => 'required name=search_term_string',
),
),
),
);
echo "\n" . '<script type="application/ld+json">' . wp_json_encode($graph, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . '</script>' . "\n";
}, 5);
// === org-schema 20260916 END ===
// === nav-contrast 20260916 START ===
add_action('wp_head', function () {
echo '<style id="sy-nav-contrast">'
. '.jkit-nav-menu .jkit-menu > li > a{color:#141414 !important;font-weight:600 !important;}'
. '.jkit-nav-menu .jkit-menu > li > a:hover{color:#C8102E !important;}'
. '.jkit-nav-menu .jkit-menu > li.current-menu-item > a,'
. '.jkit-nav-menu .jkit-menu > li.current-menu-ancestor > a{color:#C8102E !important;}'
. '</style>';
}, 99);
// === nav-contrast 20260916 END ===
// === SY-GSC-VERIFY 20260917 START ===
// Google Search Console 验证(2026-09-17):虚拟 HTML 文件 + 首页 meta 标签
add_action('init', function () {
$path = isset($_SERVER['REQUEST_URI']) ? rtrim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/') : '';
if ($path === '/google6394b37c5ab69880.html') {
header('Content-Type: text/html; charset=utf-8');
echo 'google-site-verification: google6394b37c5ab69880.html';
exit;
}
});
add_action('wp_head', function () {
if (is_front_page() || is_home()) {
echo '<meta name="google-site-verification" content="toA3m5ZhdEY_3BKuWYoAi2aofu-SknpmiHGznlmZMM4" />' . "\n";
}
}, 1);
// === SY-GSC-VERIFY 20260917 END ===
// === RM-SELFHEAL 20260917 START ===
// Rank Math 自愈:服务商恢复/清理数据库后,防止 registration 判定 invalid 导致全站零 SEO 输出
add_action('init', function () {
if (!class_exists('RankMath\\Helper')) { return; }
if (true !== boolval(get_option('rank_math_registration_skip'))) {
update_option('rank_math_registration_skip', true);
}
$need = array('rich-snippet', 'seo-analysis', 'sitemap', 'analytics');
$mods = (array) get_option('rank_math_modules', array());
$miss = array_values(array_diff($need, $mods));
if ($miss) { update_option('rank_math_modules', array_values(array_unique(array_merge($mods, $need)))); }
}, 1);
// === RM-SELFHEAL 20260917 END ===
// === SY-REVIEWS-BAR 20260920 START ===
// 全站页脚信任条:Tripadvisor 评分入口(指向 /reviews/)
add_action('wp_footer', function () {
if (is_admin()) { return; }
echo '<div id="sy-reviews-bar" style="background:#111827;color:#fff;text-align:center;padding:14px 16px;font-size:15px;line-height:1.6;font-family:inherit;">'
. '<span style="color:#fbbf24;letter-spacing:2px;">★★★★★</span> '
. '<strong>5.0 on Tripadvisor</strong> · '
. '<a href="/reviews/" style="color:#fff;text-decoration:underline;">Read our guest reviews</a>'
. '</div>';
}, 5);
// === SY-REVIEWS-BAR 20260920 END ===
/* probe-test */
Warning: Cannot modify header information - headers already sent by (output started at D:\virtualhost\localuser\host5136415419\www\wp-content\themes\hello-elementor\functions.php:1) in D:\virtualhost\localuser\host5136415419\www\wp-content\plugins\seo-by-rank-math\includes\modules\sitemap\abstract-xml.php on line 66
Warning: Cannot modify header information - headers already sent by (output started at D:\virtualhost\localuser\host5136415419\www\wp-content\themes\hello-elementor\functions.php:1) in D:\virtualhost\localuser\host5136415419\www\wp-content\plugins\seo-by-rank-math\includes\modules\sitemap\abstract-xml.php on line 69
Warning: Cannot modify header information - headers already sent by (output started at D:\virtualhost\localuser\host5136415419\www\wp-content\themes\hello-elementor\functions.php:1) in D:\virtualhost\localuser\host5136415419\www\wp-content\plugins\seo-by-rank-math\includes\modules\sitemap\abstract-xml.php on line 69
Warning: Cannot modify header information - headers already sent by (output started at D:\virtualhost\localuser\host5136415419\www\wp-content\themes\hello-elementor\functions.php:1) in D:\virtualhost\localuser\host5136415419\www\wp-content\plugins\seo-by-rank-math\includes\modules\sitemap\abstract-xml.php on line 69
Warning: Cannot modify header information - headers already sent by (output started at D:\virtualhost\localuser\host5136415419\www\wp-content\themes\hello-elementor\functions.php:1) in D:\virtualhost\localuser\host5136415419\www\wp-content\plugins\seo-by-rank-math\includes\modules\sitemap\abstract-xml.php on line 69
Warning: Cannot modify header information - headers already sent by (output started at D:\virtualhost\localuser\host5136415419\www\wp-content\themes\hello-elementor\functions.php:1) in D:\virtualhost\localuser\host5136415419\www\wp-content\plugins\seo-by-rank-math\includes\modules\sitemap\abstract-xml.php on line 69
https://www.cloongtrip.com/post-sitemap.xml
2026-08-28T09:39:43+00:00
https://www.cloongtrip.com/page-sitemap.xml
2026-09-16T07:06:07+00:00
https://www.cloongtrip.com/tour-sitemap.xml
2026-09-16T06:33:26+00:00
https://www.cloongtrip.com/metform-form-sitemap.xml
2026-08-17T07:34:14+00:00
https://www.cloongtrip.com/category-sitemap.xml
2026-08-28T09:39:43+00:00